bufio.Scanner 按行读取大文件最常用且稳妥,但默认64KB行长限制易触发ErrTooLong,需调用scanner.Buffer()自定义缓冲区大小。

用 bufio.Scanner 按行读取大文件是 Go 中最常用也最稳妥的方式,它内存友好、语法简洁、默认支持 UTF-8,但需注意几处关键细节才能真正“稳读大文件”。
Scanner 默认每行最多读 64KB,超长会报 bufio.ErrTooLong。处理日志、JSON 行、或含超长字段的 CSV 时很容易触发。
scanner.Buffer(make([]byte, 64*1024), 1 手动扩容缓冲区(例如设上限为 1MB)
Scanner 默认以 \n 为分隔符,对 Windows 的 \r\n 或旧 Mac 的 \r 不自动处理。实际读到的行末可能残留 \r,尤其在跨平台处理日志或配置文件时。
strings.TrimRight(line, "\r\n")
\uFEFF)也可能出现在首行开头,必要时一并 Trimioutil.ReadFile(或 os.ReadFile)会把整个文件加载进内存,GB 级文件直接 OOM。正确姿势是流式打开 + 扫描。
立即学习“go语言免费学习笔记(深入)”;
f, err := os.Open("big.log"),defer f.Close()scanner := bufio.NewScanner(f)
for scanner.Scan() { line := scanner.Text() },不是 scanner.Bytes()(后者不自动解码 UTF-8)scanner.Err(),判断是 EOF 还是真实 I/O 错误Scanner 内部就是封装了 Reader,但多了词法分析逻辑。如果只要纯按行切分、不做 token 化,且对性能敏感(如每秒百万行解析),可手动用 Reader:
reader := bufio.NewReader(f)for { line, err := reader.ReadString('\n'); if err == io.EOF { break } else if err != nil { /* handle */ } }ReadString 返回的 line 包含结尾的 \n,需用 strings.TrimSuffix(line, "\n")
基本上就这些。Scanner 足够好用,关键在理解它的边界 —— 不是黑盒,而是带默认配置的流处理器。调对 Buffer、清好换行符、关好文件句柄,大文件就读得既稳又省。
以上就是如何使用Golang按行读取大文件_Golangbufio Scanner文件行读取技巧汇总的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号