← 中文资源

简体中文版本

Go: bufio.Scanner: token too long

修复 bufio.Scanner 的 token too long:增大缓冲区、手动切分或改用 bufio.Reader 处理无界输入。

阅读英文原文

症状

扫描提前停止,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,证明缓冲区已能容纳该数据。