¿Cómo utilizo la fmt.Scanffunción en Go para obtener una entrada entera de la entrada estándar?
Si esto no se puede hacer usando fmt.Scanf, ¿cuál es la mejor manera de leer un solo entero?
Respuestas:
http://golang.org/pkg/fmt/#Scanf
Todas las bibliotecas incluidas en Go están bien documentadas.
Dicho eso, creo
func main() {
var i int
_, err := fmt.Scanf("%d", &i)
}
Hace el truco
&iy no solo icomo en fmt.Printf("%v", i)?
ies solo el valor entero en i, &ies un puntero a i.
Una alternativa que puede ser un poco más concisa es simplemente usar fmt.Scan:
package main
import "fmt"
func main() {
var i int
fmt.Scan(&i)
fmt.Println("read number", i, "from stdin")
}
Esto usa la reflexión sobre el tipo de argumento para descubrir cómo se debe analizar la entrada.
Aquí está mi método "Fast IO" para leer enteros positivos. Podría mejorarse con cambios de bits y distribuyendo la memoria por adelantado.
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
}
Golang fmt.Scan es más simple que Golang fmt.Scanf (que es más simple que Clang scanf)
Si fmt.Scan errores, es decir, si no es nulo, iniciar sesión y volver
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)
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)
La mejor de las suertes
Ejemplo de: http://www.sortedinf.com/?q=golang-in-1-hour
Puede utilizar fmt.Scanfcon un especificador de formato. El especificador de formato para el entero es% d. Entonces puede usar la entrada estándar como a continuación.
func main() {
var someVar int
fmt.Scanf("%d", &someVar)
}
o de lo contrario puede usar fmt.Scano fmt.Scanlncomo se muestra a continuación.
func main() {
var someVar int
fmt.Scanln(&someVar)
}