症状
扫描提前停止,scanner.Err() 返回 bufio.Scanner: token too long。通常只有一条超长行失败而较短行正常,默认上限为 64KB。
诊断
始终检查扫描器错误并测量最长记录:
sc := bufio.NewScanner(f)
for sc.Scan() {
process(sc.Text())
}
if err := sc.Err(); err != nil {
log.Fatalf("scan failed: %v", err)
}
若最长记录超过 64KB,即解释了该失败。
修复
按已知上限设置缓冲区,或对无界输入改用 Reader:
const maxCap = 10 * 1024 * 1024
sc := bufio.NewScanner(f)
sc.Buffer(make([]byte, 0, 64*1024), maxCap)
// or stream without a cap
r := bufio.NewReader(f)
line, err := r.ReadString('\n')
验证
对原先失败的输入重跑;循环读到 EOF 且 sc.Err() 为 nil,证明缓冲区已能容纳该数据。