这是目前困扰我的一个问题。从用户那里获取输入时,我想使用一个循环来要求用户重试,直到他们输入有效输入为止:
// 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)
}
运行上面的代码,如果用户输入了有效的输入,没问题:
请输入一个整数:
3
3
退出代码0,进程正常退出。
但是尝试输入一个字符串?
请输入一个整数:
什么?
抱歉,输入无效。请输入一个整数:
抱歉,输入无效。请输入一个整数:
抱歉……
等等,它会一个字符一个字符地循环,直到字符串耗尽。 即使输入单个字符循环两次,我假设它会解析换行符。
无论如何,一定有一种方法可以在 Go 中刷新 Stdin 吗?
附言如果没有这样的功能,您将如何解决它以提供等效的功能?我什至失败了......
最佳答案
我会在每次失败后阅读直到行尾来解决这个问题。这将清除其余文本。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
stdin := bufio.NewReader(os.Stdin)
fmt.Println("Please enter an integer: ")
var userI int
for {
_, err := fmt.Fscan(stdin, &userI)
if err == nil {
break
}
stdin.ReadString('\n')
fmt.Println("Sorry, invalid input. Please enter an integer: ")
}
fmt.Println(userI)
}
关于go - 如何在 Go 中的 fmt.Scanf() 之后刷新标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14640218/