
在使用 Go 语言进行用户交互时,我们经常需要从标准输入(stdin)读取数据。fmt.Scanf 函数是一个常用的选择,但它在处理无效输入时可能会遇到问题,导致程序进入无限循环。本文将介绍如何使用 bufio 包来清空 stdin 输入流,从而避免这种情况。
问题描述
当使用 fmt.Scanf 读取整数时,如果用户输入了非数字字符,fmt.Scanf 会返回一个错误,并且不会从输入流中移除无效字符。这意味着在循环中重复调用 fmt.Scanf 会一直读取到相同的无效字符,导致程序陷入无限循环。
解决方案
解决此问题的关键在于清空 stdin 输入流中的无效字符。我们可以使用 bufio.NewReader 创建一个带缓冲的读取器,然后使用 ReadString('\n') 方法读取并丢弃剩余的输入,直到遇到换行符。
示例代码
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)
}代码解释
注意事项
总结
通过使用 bufio.NewReader 和 ReadString('\n') 方法,我们可以有效地清空 stdin 输入流,解决 fmt.Scanf 在处理无效输入时可能导致的无限循环问题。这种方法可以提高程序的健壮性和用户体验。
以上就是如何在 Go 中使用 bufio 清空 stdin 输入流的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号