小文件用strings.split最直接,先os.readfile再strings.split;大文件需bufio.scanner流式处理;单字节分隔符可用bufio.reader.readstring;务必处理bom和编码问题。

用 strings.Split 拆分小文件内容最直接
如果文件不大(比如几 MB 以内),读进内存再拆分是最简单可靠的方案。核心就是先用 ioutil.ReadFile(Go 1.16+ 推荐 os.ReadFile)读取全部内容,再用 strings.Split 按分隔符切开。
-
strings.Split不会丢弃空行或重复分隔符——连续两个分隔符会产生空字符串元素,这点常被忽略 - 若分隔符是换行符
"\n",注意 Windows 文件可能含"\r\n",建议先用strings.TrimSpace或strings.ReplaceAll(s, "\r\n", "\n")统一 - 示例:
data, _ := os.ReadFile("input.txt") lines := strings.Split(strings.ReplaceAll(string(data), "\r\n", "\n"), "\n")
大文件必须流式处理,用 bufio.Scanner 配合自定义分隔符
文件超过几十 MB 或内存受限时,不能全量读入。bufio.Scanner 默认按行扫描,但支持通过 Split 方法指定任意分隔符,比手动 Read + 缓冲更安全、更少出错。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 调用
scanner.Split(bufio.SplitFunc(...))自定义分隔逻辑,注意函数签名必须返回(int, []byte, error) - 常见错误:分隔符长度 > 1(如
"|||")时,不能直接用bytes.Index简单查找——需保证匹配不跨缓冲区边界,否则漏切或 panic - 推荐做法:用
bytes.Contains判断是否存在分隔符,再用bytes.Index定位;若没找到,返回0, nil, nil让 scanner 继续读
bufio.Reader.ReadString 适合单字节分隔符场景
当分隔符是单字符(如 '|'、','、'\t'),bufio.Reader.ReadString 比自定义 SplitFunc 更轻量、更易写对。
- 它会一直读直到遇到指定字节,返回包含该字节的字符串,所以后续要
strings.TrimSuffix(line, string(sep)) - 遇到 EOF 时返回已读内容 +
io.EOF,需检查err == io.EOF来判断是否正常结束 - 注意:如果最后一段没以分隔符结尾,
ReadString会阻塞等待或报io.ErrUnexpectedEOF,得单独处理尾部残留
别忽略 BOM 和编码问题,尤其处理 CSV 或日志时
UTF-8 文件开头可能带 BOM(\xef\xbb\xbf),导致首段内容前多出三个字节,strings.Split 后第一个元素看起来“不对劲”。
- 读取后先用
bytes.TrimPrefix(data, []byte("\xef\xbb\xbf"))剥离 BOM,再转string - 非 UTF-8 编码(如 GBK)文件不能直接用
string(data),得用golang.org/x/text/encoding包转换,否则分隔符匹配失败 - 如果分隔符本身是 Unicode 字符(如中文顿号、竖线),确保源文件编码与 Go 字符串一致,否则
strings.Split找不到位置
strings.Split 就够了,但只要文件不确定大小或分隔符非常规,就得切换到 bufio.Scanner 或 bufio.Reader;BOM 和编码问题往往在测试环境不暴露,上线后才突然冒出来。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










