Comment utiliser la fmt.Scanf
fonction dans Go pour obtenir une entrée entière à partir de l'entrée standard?
Si cela ne peut pas être fait avec fmt.Scanf
, quelle est la meilleure façon de lire un seul entier?
http://golang.org/pkg/fmt/#Scanf
Toutes les bibliothèques incluses dans Go sont bien documentées.
Cela étant dit, je crois
func main() {
var i int
_, err := fmt.Scanf("%d", &i)
}
fait l'affaire
&i
et pas simplementi
comme dansfmt.Printf("%v", i)
?i
est juste la valeur entière dansi
,&i
est un pointeur versi
.Une alternative qui peut être un peu plus concise consiste simplement à utiliser
fmt.Scan
:package main import "fmt" func main() { var i int fmt.Scan(&i) fmt.Println("read number", i, "from stdin") }
Cela utilise une réflexion sur le type de l'argument pour découvrir comment l'entrée doit être analysée.
http://golang.org/pkg/fmt/#Scan
la source
Voici ma méthode "Fast IO" pour lire des entiers positifs. Il pourrait être amélioré avec des bitshifts et en disposant la mémoire à l'avance.
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 }
la source
Golang fmt.Scan est plus simple que Golang fmt.Scanf (qui est plus simple que Clang scanf)
Si fmt.Scan erreurs, c'est-à-dire si non nul, consigner et retourner
1 Lire une seule variable:
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 Lisez plusieurs variables:
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)
Bonne chance
Exemple tiré de: http://www.sortedinf.com/?q=golang-in-1-hour
la source
Vous pouvez utiliser
fmt.Scanf
avec un spécificateur de format. Le spécificateur de format pour l'entier est% d. Vous pouvez donc utiliser une entrée standard comme ci-dessous.func main() { var someVar int fmt.Scanf("%d", &someVar) }
ou bien vous pouvez utiliser
fmt.Scan
oufmt.Scanln
comme ci-dessous.func main() { var someVar int fmt.Scanln(&someVar) }
la source