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

标签 validation go user-input

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

我尝试过使用 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.Scanfmt.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/

相关文章:

Python INPUT 给出了错误的结果

google-app-engine - 多对象删除 在谷歌云存储去

validation - JSF不支持跨字段验证,有解决方法吗?

不跨越矩阵边界的验证函数(迷宫)

json - Play Framework 2.3 (Scala) 中的自定义 JSON 验证约束

go - 如何为 Go 中的行插入重用单个 Postgres DB 连接?

google-app-engine - 如何在 Go App Engine Urlfetch 包中使用 Cookie

java - java中的多字扫描仪输入?

c++ - 如何检查用户输入是否只包含字母?

ruby-on-rails - Rails - 基于另一个模型验证属性