
本文详解 Go 中使用 bufio.Scanner 安全、高效地逐行读取文件的标准实践,涵盖基础用法、错误处理、内存注意事项及常见陷阱规避方法。
本文详解 go 中使用 `bufio.scanner` 安全、高效地逐行读取文件的标准实践,涵盖基础用法、错误处理、内存注意事项及常见陷阱规避方法。
在 Go 语言中,逐行读取文件并非通过传统 C 风格的 while (!EOF) 循环实现,而是依托 bufio.Scanner —— 一个专为流式文本扫描设计的高效、安全且符合 Go 惯用法的工具。它自动按行(\n 或 \r\n)分割输入,并内置缓冲与边界检查,避免了手动管理字节切片和 EOF 判定的复杂性。
以下是最简但生产可用的示例:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("data.txt")
if err != nil {
log.Fatal("无法打开文件:", err)
}
defer file.Close() // 关键:确保文件及时关闭
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text() // 获取当前行(不含换行符)
fmt.Println(line)
}
// 检查扫描过程中是否发生错误(如 I/O 错误)
if err := scanner.Err(); err != nil {
log.Fatal("读取文件时出错:", err)
}
}✅ 关键要点说明:
里面有2个文件夹。其中这个文件名是:finishing,是我项目还没有请求后台的数据的模拟写法。请求后台数据之后,瀑布流的js有一点点变化,放在文件名是:finished。变化在于需要穿参数到后台,和填充的内容都用后台的数据填充。看自己项目需求来。由于chrome模拟器是不允许读取本地文件json的,所以如果你要进行测试,在hbuilder打开项目就可以看到效果啦,或者是火狐浏览器。
- scanner.Scan() 返回 bool:true 表示成功读取一行,false 表示到达文件末尾或发生错误;不可仅用 !scanner.Scan() 判定 EOF,必须调用 scanner.Err() 显式检查错误。
- scanner.Text() 返回 string,已自动去除行尾换行符;若需原始字节(含换行符),请改用 scanner.Bytes()。
- defer file.Close() 必须在 os.Open 后立即声明,防止资源泄漏。
⚠️ 注意事项:
- Scanner 默认单行最大长度为 64KB(bufio.MaxScanTokenSize)。若需读取超长行(如日志中的大 JSON),应预先设置缓冲区:
scanner.Buffer(make([]byte, 64*1024), 1<<20) // 最大支持 1MB 行
- 不要混用 Scanner 与其他读取器(如 file.Read()),会导致数据错位。
- 若需精确控制编码(如 UTF-16)、跳过 BOM 或处理二进制混合内容,请考虑 bufio.Reader + ReadString('\n') 组合,但需自行处理错误与 EOF。
总结:bufio.Scanner 是 Go 中逐行读取文本文件的首选方案——简洁、健壮、内存友好。牢记“先检查 Err(),再处理 Text()”,并始终配对 Open/Close,即可写出清晰可靠的文件处理逻辑。









