2010-09-20 13 views

Odpowiedz

97

http://golang.org/pkg/fmt/#Scanf

Wszystkie zamówione biblioteki w Go są dobrze udokumentowane.

Mając na uwadze powyższe, uważam

func main() { 
    var i int 
    _, err := fmt.Scanf("%d", &i) 
} 

załatwia sprawę

+0

fmt.Scanf trwało około minuty do skanowania 1 mln liczby całkowite. –

+0

@robertking spróbuj użyć bufio zamiast tego Jest to prosty przykład. – cthom06

+0

Pozdrawiam. Bufio jest szybki. –

37

Alternatywą, która może być nieco bardziej zwięzła jest po prostu użyć fmt.Scan:

package main 

import "fmt" 

func main() { 
    var i int 
    fmt.Scan(&i) 
    fmt.Println("read number", i, "from stdin") 
} 

ta wykorzystuje odbicie na typ argumentu pozwalający wykryć, jak należy analizować dane wejściowe.

http://golang.org/pkg/fmt/#Scan

+14

Nie powinieneś tego robić bez sprawdzania błędów;) – kyrias

3

Oto mój "Szybka IO" metoda odczytu liczby całkowite dodatnie. Można go ulepszyć, przesuwając bity i układając pamięć z góry.

package main 

import (
    "io/ioutil" 
    "bufio" 
    "os" 
    "strconv" 
) 


func main() { 
    out := bufio.NewWriter(os.Stdout) 
    ints := getInts() 
    var T int64 
    T, ints = ints[0], ints[1:] 
    .. 
    out.WriteString(strconv.Itoa(my_num) + "\n") 
    out.Flush() 
    } 
} 

func getInts() []int64 { 
    //assumes POSITIVE INTEGERS. Check v for '-' if you have negative. 
    var buf []byte 
    buf, _ = ioutil.ReadAll(os.Stdin) 
    var ints []int64 
    num := int64(0) 
    found := false 
    for _, v := range buf { 
     if '0' <= v && v <= '9' { 
      num = 10*num + int64(v - '0') //could use bitshifting here. 
      found = true 
     } else if found { 
      ints = append(ints, num) 
      found = false 
      num = 0 
     } 
    } 
    if found { 
     ints = append(ints, num) 
     found = false 
     num = 0 
    } 
    return ints 
} 
1

Golang fmt.Scan jest prostsze niż Golang fmt.Scanf (co jest prostsze niż dzyń scanf)

Jeśli błędy fmt.Scan czyli jeśli nie zerowe, zaloguj & powrót

1 Czytaj pojedynczy zmienna:

import (
    "fmt" 
    "log" 
) 

var i int 
if _, err := fmt.Scan(&i); err != nil { 
    log.Print(" Scan for i failed, due to ", err) 
    return 
} 

fmt.Println(i) 

2 odczytu wielu zmiennych:

import (
    "fmt" 
    "log" 
) 

var i, j, k int 
if _, err := fmt.Scan(&i, &j, &k); err != nil { 
    log.Print(" Scan for i, j & k failed, due to ", err) 
    return 
} 

fmt.Println(i, j, k) 

Powodzenia

Przykład z: http://www.sortedinf.com/?q=golang-in-1-hour

Powiązane problemy