该用 bufio.Reader 而不是 file.Read() 时:读取文本类大文件(如日志、CSV)且按行或分隔符处理;它合并系统调用、减少内核切换,适合 GB 级逐行解析等场景。
bufio 适合需要减少系统调用、提升 I/O 吞吐的场景,不适合低延迟敏感或极小数据量直通场景。
bufio.Reader 而不是直接 file.Read()
当你读取的是文本类大文件(如日志、CSV、配置)、且每次处理单位是“行”或“分隔符片段”时,bufio.Reader 显著更优。它把多次 read(2) 系统调用合并成一次底层批量读取(默认 4KB),避免每行都触发内核态切换。
'|' 拆分字段的导入文件、流式读取 HTTP 响应体ReadString('\n') 会把换行符包含在返回值里,要用 strings.TrimSuffix(line, "\n") 清理Reader 没限制,但 Scanner 默认会报 bufio.Scanner: token too long 错误bufio.Scanner 是大多数文本行处理的首选它比 Reader.ReadString 更安全、API 更简洁,内部已做缓冲+行切分+

scanner.Scan() 才真正推进读取,scanner.Text() 只是取当前行缓存 —— 这意味着不能在循环里反复调用 Text() 试图重读scanner.Buffer(make([]byte, 0, 128*1024), 2*1024*1024)
';'),要分号分割就得换回 Reader.ReadString(';')
Reader 接近,但封装了更多边界逻辑(比如 EOF 处理、空行判定)bufio.Writer 忘记 Flush() 就等于没写所有写入都先落在内存缓冲区,不调用 Flush() 或关闭 writer(Close() 会隐式 flush),数据就卡在内存里,文件/网络连接收不到。
defer file.Close(),但没 defer writer.Flush() —— 文件为空或只有部分内容writer.Flush();否则等缓冲区满(默认 4KB)才落盘Writer 会 panic 或数据错乱,每个 goroutine 必须持有独立实例os.Stdout 或网络连接,Flush() 还影响响应延迟,不能省缓冲区大小不是越大越好:64KB 缓冲器在千连接服务中可能吃掉几百 MB 内存;而 512B 缓冲器又会让小文件读写频繁击穿到系统调用。实际选 4KB~16KB 平衡多数场景,大吞吐流式处理可试 64KB,但得压测验证。