Oto kwestia, która mnie teraz nurtuje. Kiedy coraz wejście od użytkownika, chcę zatrudnić pętlę zapytać użytkownika, aby ponowić próbę aż wejdą ważny wkład:Jak opróżnić Stdin po fmt.Scanf() w Go?
// user_input.go
package main
import (
"fmt"
)
func main() {
fmt.Println("Please enter an integer: ")
var userI int
for {
_, err := fmt.Scanf("%d", &userI)
if err == nil {
break
}
fmt.Println("Sorry, invalid input. Please enter an integer: ")
}
fmt.Println(userI)
}
uruchamiając powyżej, jeśli użytkownik wprowadzi poprawny wejście, nie ma problemu:
podaj całkowitą:
kod zakończenia 0 proces zakończony normalnie.
Ale spróbuj wpisać ciąg znaków zamiast?
Proszę podać liczbę całkowitą: co?
Przepraszamy, nieprawidłowe dane wejściowe. Podaj liczbę całkowitą:
Przepraszamy, nieprawidłowe dane wejściowe. Podaj liczbę całkowitą:
Przepraszam ...
Etc, i kontynuuje zapętlenie znaku po znaku, aż ciąg znaków zostanie wyczerpany. Nawet wprowadzając pętle z jednym znakiem dwukrotnie, zakładam, że parsuje znak nowej linii.
W każdym razie, musi być sposób na opróżnienie Stdin in Go?
P.S. W przypadku braku takiej funkcji, w jaki sposób obejść ją, aby zapewnić równoważną funkcjonalność? Nawet mi się to nie udało ...
To jest dobre obejście tego problemu. Dzięki! –
Po prostu użyj 'Scanln', który jest udokumentowany jako zużywający białe spacje i czytający aż do nowej linii. –