2010-09-20 35 views

risposta

97

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

Tutte le librerie incluse in Go sono ben documentati.

Detto questo, credo

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

fa il trucco

+0

fmt.Scanf ha richiesto circa un minuto per eseguire la scansione di 1 milione di numeri interi. –

+0

@robertking prova ad usare un bufio, invece, è un semplice esempio. – cthom06

+0

Cheers. Bufio è veloce. –

37

Un'alternativa che può essere un po 'più conciso è usare solo fmt.Scan:

package main 

import "fmt" 

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

Questo utilizza la riflessione su il tipo dell'argomento per scoprire come deve essere analizzato l'input.

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

+14

Non dovresti farlo senza cercare errori;) – kyrias

3

Ecco il mio metodo "Fast IO" per la lettura di numeri interi positivi. Potrebbe essere migliorato con bitshifts e disporre la memoria in anticipo.

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 è più semplice che Golang fmt.Scanf (che è più semplice di Clang scanf)

Se gli errori fmt.Scan cioè, se non nullo, accedere & ritorno

1 letto singolo variabile:

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 Leggi più variabili:

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) 

Buona fortuna

Esempio da: http://www.sortedinf.com/?q=golang-in-1-hour

Problemi correlati