
Go中使用bufio.ReadString读取输入时会保留末尾换行符,若未清理直接分割并解析,会导致strconv.ParseInt因非法字符(如\n)返回错误和默认值0。
go中使用bufio.readstring读取输入时会保留末尾换行符,若未清理直接分割并解析,会导致strconv.parseint因非法字符(如\n)返回错误和默认值0。
在Go语言中,bufio.ReadString('\n') 会读取包含换行符 \n 在内的完整行。这意味着当你输入 "5 25 125" 并按回车后,line 实际值为 "5 25 125\n"(末尾带换行符)。调用 strings.Split(line, " ") 后,第三个元素 splitted[2] 并非 "125",而是 "125\n"。
而 strconv.ParseInt("125\n", 0, 64) 无法将含不可见控制字符的字符串解析为有效整数,它会立即在第一个非法字符(即 \n)处停止解析,并返回错误(非 nil)以及零值 0——这正是你看到输出为 5 25 0 的根本原因。
✅ 正确做法是:在分割前或分割后清除行末空白符。推荐使用 strings.TrimSpace() 预处理原始输入行:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
line, err := reader.ReadString('\n')
if err != nil {
fmt.Fprintln(os.Stderr, "读取输入失败:", err)
return
}
// ✅ 关键修复:去除首尾空白(包括 \n、\r、空格等)
line = strings.TrimSpace(line)
if line == "" {
fmt.Println("输入为空")
return
}
splitted := strings.Split(line, " ")
if len(splitted) <p>? <strong>关键要点总结:</strong> </p>
-
bufio.ReadString保留分隔符(如\n),务必用strings.TrimSpace()或strings.TrimSuffix(line, "\n")清理; -
永远不要忽略
strconv系列函数的错误返回——err != nil时返回值无意义(常为零值); - 显式指定进制(如
10)比0更安全且语义清晰(0表示自动推断,但仅支持0x/0o/0b前缀,普通十进制需明确写10); - 对切片访问前做长度校验,防止 panic(如
splitted[2]越界)。
遵循以上实践,即可彻底避免“意外解析为0”的陷阱,写出健壮可靠的字符串数值解析逻辑。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











