Validation 如何在Go中处理控制台输入类型验证?

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 {

我正在尝试为使用循环的程序构建一个非常基本的控制台输入。但是,当用户输入的不是整数时,错误消息的触发次数与输入字符串(包括换行符)中的字符数相同

我尝试了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
        }
    }
}
用户输入:

自闭症

预期结果:

程序:输入一个有效的数字

实际结果:

程序:输入一个有效的数字

程序:输入一个有效的数字

程序:输入一个有效的数字

程序:输入一个有效的数字

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。