
在 go 语言中,使用 fmt.scanf() 或类似的函数从标准输入读取数据时,如果用户输入的数据类型与期望的不符,会导致读取失败,并且错误的输入会残留在输入缓冲区中。这会导致程序进入无限循环,不断尝试读取无效数据。本文将介绍如何正确处理这种情况,清除输入缓冲区,确保程序能够继续接收用户的输入。
使用 bufio.NewReader 清除标准输入缓冲区
解决此问题的关键在于使用 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(os.Stdin): 创建一个 bufio.Reader 对象,用于缓冲标准输入。
- fmt.Fscan(stdin, &userI): 使用 fmt.Fscan 函数从 bufio.Reader 中读取数据,而不是直接从 os.Stdin 读取。
- stdin.ReadString('\n'): 如果读取失败(err != nil),则调用 ReadString('\n') 方法读取到换行符为止的所有数据,并将其丢弃。这有效地清除了输入缓冲区中的残留数据。
运行示例:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
如果用户输入非整数值,例如 "abc",程序会输出 "Sorry, invalid input. Please enter an integer: ",然后提示用户重新输入。这次,程序会正常等待用户输入,而不是进入无限循环。
注意事项
- ReadString('\n') 方法会一直读取到换行符为止,即使换行符不存在,也会读取到缓冲区末尾。
- 使用 bufio.NewReader 可以提高读取效率,因为它减少了系统调用的次数。
总结
通过使用 bufio.NewReader 和 ReadString('\n') 方法,我们可以有效地清除标准输入缓冲区中的残留数据,避免程序因输入错误而进入无限循环。这种方法可以提高程序的健壮性和用户体验。在处理用户输入时,建议始终使用缓冲读取,并注意处理可能出现的错误情况。









