
在许多交互式程序中,我们经常需要从用户的标准输入(stdin)读取多行数据,直到用户输入一个特定的“终止符”或“哨兵值”。例如,程序可能需要读取一系列文本行,直到用户输入一个单独的句点(.)来表示输入结束。
早期的Go版本或不熟悉bufio包特性的开发者可能会尝试使用bufio.NewReader配合ReadString('\n')来实现。然而,这种方法存在一个常见的陷阱:ReadString('\n')会读取包括换行符在内的整行内容。这意味着,如果用户输入“.”,实际读取到的字符串会是“.\n”,这与我们期望的“.”不匹配,导致判断条件失效。
自Go 1.1版本起,bufio包引入了Scanner类型,它提供了一种更简洁、更高效且更符合Go语言习惯的方式来处理流式输入,特别是按行读取。Scanner会自动处理缓冲区和换行符,极大地简化了代码。
以下是使用bufio.Scanner实现从标准输入读取行直到遇到单个句点(.)的示例代码:
package main
import (
"bufio" // 导入bufio包,用于Scanner
"fmt" // 导入fmt包,用于打印输出
"os" // 导入os包,用于访问标准输入
)
func main() {
// 1. 创建一个新的Scanner,它将从os.Stdin(标准输入)读取数据
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("请输入文本行,输入 '.' (不含引号) 终止:")
// 2. 循环读取每一行
// scanner.Scan() 会读取下一行,如果成功读取则返回 true,否则返回 false(例如,到达文件末尾或发生错误)
for scanner.Scan() {
// 3. 使用 scanner.Text() 获取当前行的文本内容
// scanner.Text() 会自动移除行尾的换行符(\n或\r\n),这是其主要优势之一。
line := scanner.Text()
// 4. 检查当前行是否为终止符
if line == "." {
// 如果是终止符,则跳出循环
break
}
// 5. 对读取到的行进行处理(这里只是简单打印出来)
fmt.Println("您输入了:", line)
}
// 6. 循环结束后,检查是否有错误发生
// 在循环结束后,可以通过 scanner.Err() 检查在扫描过程中是否发生了非EOF错误。
if err := scanner.Err(); err != nil {
fmt.Fprintf(os.Stderr, "读取标准输入时发生错误: %v\n", err)
}
fmt.Println("输入结束。")
}bufio.NewScanner(os.Stdin):
立即学习“go语言免费学习笔记(深入)”;
for scanner.Scan():
line := scanner.Text():
if line == "." { break }:
错误处理 if err := scanner.Err(); err != nil:
bufio.Scanner是Go语言中处理流式输入,特别是逐行读取标准输入或文件内容的推荐方式。它通过自动管理缓冲区和智能处理行尾换行符,极大地简化了输入处理逻辑,使得代码更加清晰、健壮。在需要从输入流中读取数据直到遇到特定终止符的场景下,bufio.Scanner提供了一个优雅且高效的解决方案。
以上就是Go语言教程:使用bufio.Scanner从标准输入读取行并按条件终止的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号