我正在尝试使用循环为程序构建一个非常基本的控制台输入。但是,当用户输入整数以外的内容时,错误消息会根据输入字符串中的字符(包括换行符)触发多次。
我尝试过使用 Scan()、Scanln() 以及 bufio.NewReader() 进行字符串解析,以及在 Println() 之后使用 continue。所有这些都会产生相同的结果。
var threads int
func main() {
fmt.Println("Enter number of threads:")
for {
_, err := fmt.Scanln(&threads)
if err != nil {
fmt.Println("Enter a valid number")
} else {
break
}
}
}
用户输入:
asd
预期结果:
Program: Enter a valid number
实际结果:
Program: Enter a valid number
Program: Enter a valid number
Program: Enter a valid number
Program: Enter a valid number
最佳答案
fmt.Scanln(&threads)
抛出错误,因为您的第一个字符已经不是有效的 int,因此 stdin 缓冲区中仍然剩余 sd\n
,这这是我对另外三个错误的解释。为了避免这种情况,您可以只读取字符串,然后使用 int, err := strconv.Atoi(string)
,如下面的代码所示。请注意,fmt.Scan
或 fmt.Scanln
将您的用户输入分割到下一个空格,这可能不适合您的用例。查看How to read input from console line了解如何选择适合您的用例的见解。
package main
import (
"fmt"
"strconv"
)
func main() {
var s string
var i int
fmt.Println("Enter number of threads:")
for {
_, err := fmt.Scan(&s)
i, err = strconv.Atoi(s)
if err != nil {
fmt.Println("Enter a valid number")
} else {
fmt.Println("Got: " + strconv.Itoa(i))
break
}
}
//Todo
}
关于validation - 如何在 Go 中处理控制台输入类型验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56385055/