推荐使用bufio.Scanner逐行读取文本文件,它内存友好、自动处理换行符且默认单行上限64KB;需超长行或自定义分隔符时改用bufio.Reader配合ReadString/ReadBytes。

Go语言处理文本文件的逐行读取,推荐使用 bufio.Scanner,它内存友好、简洁安全,适合大多数场景;若需更精细控制(如超长行、自定义分隔符或错误恢复),可选用 bufio.Reader 配合 ReadString 或 ReadLine。
用 bufio.Scanner 逐行读取(推荐默认方式)
Scanner 是 Go 标准库为行读取优化的工具,自动处理换行符、忽略末尾 \r,且默认单行上限 64KB(可调)。它不返回原始错误,而是通过 Err() 检查最终状态。
- 打开文件后传入
bufio.NewScanner - 用
Scan()循环读取,每次调用加载下一行到内部缓冲区 - 用
Text()获取字符串(不含换行符),或Bytes()获取字节切片 - 循环结束后调用
Err()判断是否因 I/O 错误提前终止
示例:
file, _ := os.Open("data.txt")defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text() // 或 scanner.Bytes()
process(line)
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
处理超长行或自定义分隔符
默认 默认 Scanner 行长度限制为 64KB。若文件含超长日志行或需按其他字符(如 |、)分割,应改用 Scanner 行长度限制为 64KB。若文件含超长日志行或需按其他字符(如 |、\0)分割,应改用 bufio.Reader。bufio.Reader。
立即学习“go语言免费学习笔记(深入)”;
- 调用
reader.ReadString('\n')可读到指定字节为止(含该字节),返回string和error - 若要排除分隔符,可用
strings.TrimSuffix(s, "\n") - 对二进制或含空字符的数据,用
reader.ReadBytes('\0')更稳妥 - 注意:
ReadString遇到 EOF 且未找到分隔符时返回已读内容 +io.EOF,需检查err == io.EOF来区分正常结束与错误
边读边解析结构化文本(如 CSV、键值对)
单纯“读行”只是第一步;常见需求是解析每行内容。Go 不强制绑定解析逻辑,但可自然组合:
- 对空格/制表符分隔:用
strings.Fields(line)拆字段(自动跳过连续空白) - 对固定分隔符(如
=):用strings.SplitN(line, "=", 2)拆成键值,再strings.TrimSpace清理 - 对 CSV 行:优先用标准
encoding/csv包(支持引号、转义),而非手动Split - 对正则匹配内容(如提取 IP、邮箱):预编译
regexp.MustCompile,在循环内调用FindStringSubmatch等方法
注意事项与避坑点
逐行处理看似简单,但几个细节易引发问题:
-
scanner.Text()返回的是内部缓冲区的引用,循环中若需长期保存某行,必须用string(append([]byte{}, line...))或line = append([]byte(nil), line...)复制,否则后续Scan()会覆盖 - Windows 文件可能含
\r\n,Scanner默认已处理;但用ReadString时若只找\n,\r会留在行尾,建议统一strings.TrimRight(line, "\r\n") - 大文件不建议一次性
os.ReadFile再strings.Split,会占用过多内存;务必流式逐行处理 - 若需统计行号或跳过注释行,可在循环中加计数器和
strings.HasPrefix(line, "#")判断










