go - 如何在 Go 中的 fmt.Scanf() 之后刷新标准输入?

标签 go user-input stdin

这是目前困扰我的一个问题。从用户那里获取输入时,我想使用一个循环来要求用户重试,直到他们输入有效输入为止:

// 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/

相关文章:

arrays - 在 MongoDB Golang 中存储 slice 和嵌套结构

perl - 为什么这里的 STDIN 在列表上下文中工作?

c - 将文件内容重定向到 C 中的另一个程序

android - 使用具有多个用户输入值的 Android TextWatcher 并更新这些值

Java扫描非法输入

c - 为什么使用 EOF 来检查 stdin 缓冲区是否已清除

go - 如果我知道许多 tmp slice 的最大大小,我应该在创建它们时设置容量吗?

testing - 测试 golang 的 Web 应用程序查询参数的最佳实践

go - golang中map的Big O表现如何?

c# - WinForms 中的用户输入验证