
在使用 fmt.Scanf() 从标准输入读取数据时,如果用户输入了无效的数据,例如期望输入整数却输入了字符串,fmt.Scanf() 会返回一个错误,并且无效的输入会残留在标准输入缓冲区中。在循环中重复调用 fmt.Scanf() 时,由于缓冲区中仍然存在无效数据,程序会不断地读取到这些数据,导致无限循环。
解决这个问题的一种有效方法是使用 bufio 包来创建一个带缓冲的读取器,并在每次读取失败后清除缓冲区。bufio.NewReader 函数可以创建一个新的带缓冲的读取器,它从指定的 io.Reader 读取数据,这里我们可以使用 os.Stdin 作为输入源。bufio.Reader 提供了 ReadString('\n') 方法,可以读取直到遇到换行符为止的所有数据,并将这些数据从缓冲区中清除。
以下是一个示例代码,演示了如何使用 bufio 包来清除 fmt.Scanf() 后的标准输入缓冲区:
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语言免费学习笔记(深入)”;
运行示例:
如果用户输入有效的整数,程序会正常读取并输出:
Please enter an integer: 3 3
如果用户输入无效的字符串,程序会提示用户重新输入,并清除缓冲区,避免无限循环:
Please enter an integer: what? Sorry, invalid input. Please enter an integer: 5 5
注意事项:
总结:
本文介绍了如何使用 bufio 包来清除 fmt.Scanf() 后的标准输入缓冲区,避免由于无效输入导致的无限循环。通过使用 bufio.NewReader 和 ReadString('\n') 方法,我们可以有效地处理标准输入,并提供更友好的用户体验。 掌握这种技巧对于编写交互式命令行程序至关重要。
以上就是如何在Go语言中使用bufio清除fmt.Scanf()后的Stdin缓冲区的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号