¿Cómo utilizo la fmt.Scanf
funció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
&i
y no solo i
como en fmt.Printf("%v", i)
?
i
es solo el valor entero en i
, &i
es 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.Scanf
con 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.Scan
o fmt.Scanln
como se muestra a continuación.
func main() {
var someVar int
fmt.Scanln(&someVar)
}