Validation 如何在Go中处理控制台输入类型验证?
我正在尝试为使用循环的程序构建一个非常基本的控制台输入。但是,当用户输入的不是整数时,错误消息的触发次数与输入字符串(包括换行符)中的字符数相同 我尝试了Scan、Scanln以及bufio.NewReader的字符串解析,以及在Println之后使用continue。所有这些都会产生相同的结果Validation 如何在Go中处理控制台输入类型验证?,validation,go,user-input,Validation,Go,User Input,我正在尝试为使用循环的程序构建一个非常基本的控制台输入。但是,当用户输入的不是整数时,错误消息的触发次数与输入字符串(包括换行符)中的字符数相同 我尝试了Scan、Scanln以及bufio.NewReader的字符串解析,以及在Println之后使用continue。所有这些都会产生相同的结果 var threads int func main() { fmt.Println("Enter number of threads:") for {
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
}
}
}
用户输入:
自闭症
预期结果:
程序:输入一个有效的数字
实际结果:
程序:输入一个有效的数字
程序:输入一个有效的数字
程序:输入一个有效的数字
程序:输入一个有效的数字
fmt.Scanln&threads抛出一个错误,因为您的第一个字符已经不是有效的int,因此stdin缓冲区中仍有sd\n,这将是我对另外三个错误的解释。为了避免这种情况,您可以只读取字符串,然后使用int,err:=strconv.Atoistring,如下面的代码所示。请注意,fmt.Scan或fmt.Scanln将用户输入分割到下一个空格,这可能不适合您的用例。查看一些关于如何选择适合您的用例的见解
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
}
你检查过返回的错误是什么吗?您正在检查它是否为零,但您没有检查值。是的,我检查了它们。对于字符,应为整数;对于换行符,应为意外换行符。这是可以预测的,但我仍然不明白的是,为什么它会在继续之前多次将ifer语句触发为true。