本文详解如何在go中安全、高效地逐行读取含整数的文本文件,解决因换行符残留导致 `strconv.atoi` 解析失败的常见问题,并推荐使用 `bufio.scanner` 替代 `readstring`。
在Go中逐行读取整数文本文件时,一个典型误区是直接使用 bufio.Reader.ReadString('\n')——该方法会将换行符 \n(或 \r\n)一并包含在返回字符串中。例如,文件中写有 10 后跟换行,ReadString('\n') 实际返回的是 "10\n"(长度为3,若含回车则为4),而非干净的 "10"。这正是你观察到 len(lineStr) == 4 且 strconv.Atoi("

✅ 正确做法是使用 bufio.Scanner,它专为按行读取设计,默认以 \n 为分隔符,且自动去除行尾换行符,返回纯净的 string:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
file, err := os.Open("numbers.txt")
if err != nil {
panic(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text() // ✅ 自动去除 \n,line = "10", not "10\n"
if num, err := strconv.Atoi(line); err == nil {
fmt.Printf("Parsed: %s → %d\n", line, num)
} else {
fmt.Printf("Failed to parse '%s': %v\n", line, err)
}
}
if err := scanner.Err(); err != nil {
panic(err)
}
}⚠️ 注意事项:
总结:bufio.Scanner 是Go标准库中读取文本行的首选工具——语义清晰、开箱即用、自动处理换行边界。避免手动处理分隔符带来的隐式污染,让整数解析回归简洁与健壮。