
在使用 Go 语言进行交互式程序开发时,经常需要从标准输入 (stdin) 读取用户输入。fmt.Scanf() 函数是一种常用的读取输入的方式,但当用户输入与预期格式不符时,fmt.Scanf() 会返回错误,并且未读取的输入会残留在输入缓冲区中。 如果不处理这些残留数据,程序可能会陷入无限循环,不断尝试读取无效数据。
下面将介绍如何使用 bufio 包来清空标准输入缓冲区,解决这个问题。
问题分析
fmt.Scanf() 函数在遇到不符合格式要求的输入时,会停止读取,并将剩余的输入留在缓冲区中。 在循环中重复调用 fmt.Scanf() 时,如果缓冲区中始终存在无效数据,fmt.Scanf() 就会反复报错,导致程序无法正常运行。
解决方案
解决此问题的关键在于清空标准输入缓冲区。 Go 语言的 bufio 包提供了一种有效的方法来实现这一目标。
代码示例
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.Reader:
stdin := bufio.NewReader(os.Stdin)
这行代码创建了一个 bufio.Reader 对象,它包装了标准输入 os.Stdin。 bufio.Reader 提供了缓冲读取的功能,可以更方便地操作输入流。
Python v2.4版chm格式的中文手册,内容丰富全面,不但是一本手册,你完全可以把她作为一本Python的入门教程,教你如何使用Python解释器、流程控制、数据结构、模板、输入和输出、错误和异常、类和标准库详解等方面的知识技巧。同时后附的手册可以方便你的查询。
2
使用 fmt.Fscan 读取输入:
_, err := fmt.Fscan(stdin, &userI)
这里使用 fmt.Fscan 函数从 stdin (即 bufio.Reader) 读取输入,并尝试将其解析为整数。 fmt.Fscan 的作用与 fmt.Scanf 类似,但它从 io.Reader 读取数据,而不是直接从标准输入读取。
清空缓冲区:
stdin.ReadString('\n')
如果 fmt.Fscan 返回错误 (表示输入无效),则执行这行代码。 ReadString('\n') 函数会读取 stdin 中的数据,直到遇到换行符 \n 为止,并将读取到的所有数据 (包括换行符) 丢弃。 这样就清空了缓冲区中剩余的无效数据,避免了下次循环时再次读取到相同的数据。
注意事项
总结
通过使用 bufio 包,可以有效地清空 fmt.Scanf() 后的标准输入缓冲区,避免程序因无效输入而陷入循环。 这种方法不仅可以提高程序的健壮性,还可以改善用户体验。 在处理用户输入时,始终要考虑输入验证和错误处理,以确保程序能够正确地处理各种情况。
以上就是如何在 Go 中使用 bufio 清空 fmt.Scanf() 后的标准输入的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号