Golang程序在Windows 10输出异常,Linux下正常求原因解析
问题原因及解决方案
这问题我之前踩过坑!核心差异在于Windows和Linux的换行符标准不一样,导致你的代码跨平台处理输入时出了问题,具体拆解如下:
1. 换行符的平台差异
- Linux/Unix系统里,换行是单个字符
\n(换行符) - Windows系统里,换行是两个字符的组合
\r\n(回车符+换行符)
你的代码里用了strings.Trim(text, "\n"),在Windows环境下,输入1 2 3后,reader.ReadString('\n')得到的text实际是"1 2 3\r\n"。Trim只去掉了末尾的\n,但\r(回车符)还留在字符串最后,变成了"1 2 3\r"。
2. 解析失败导致输出0
当用strings.Split分割后,tarr的最后一个元素是"3\r"。strconv.ParseInt尝试解析这个字符串时,因为包含非数字的\r字符,解析直接失败——而你用_忽略了错误,所以num会被默认赋值为0,这就是Windows下第三个输出是0的原因。
3. 光标回退导致奇怪的数组输出
输出tarr的时候,"3\r"里的\r会触发终端的“光标回到当前行开头”行为。原本要输出[1 2 3\r],当输出到3\r时,光标跳回行首,后续输出的]就覆盖了开头的[,最终显示成]1 2 3。
修复方案
方案一:用strings.TrimSpace替代手动Trim换行符
strings.TrimSpace会自动去掉字符串首尾的所有空白字符(包括\r、\n、空格等),完美适配跨平台场景:
tarr := strings.Split(strings.TrimSpace(text), " ")
方案二:不要忽略解析错误
去掉_,加上错误处理逻辑,能帮你快速定位问题:
num, err := strconv.ParseInt(tarr[i], 10, 32) if err != nil { fmt.Printf("无法解析 %s:%v\n", tarr[i], err) continue } fmt.Println(num)
修改后的完整代码示例:
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Enter text: ") text, _ := reader.ReadString('\n') tarr := strings.Split(strings.TrimSpace(text), " ") for i := 0; i < len(tarr); i++ { num, err := strconv.ParseInt(tarr[i], 10, 32) if err != nil { fmt.Printf("Failed to parse %s: %v\n", tarr[i], err) continue } fmt.Println(num) } fmt.Println(tarr) reader.ReadString('\n') }
这样修改后,不管在Windows还是Linux下运行,都能得到正确的输出啦!
内容的提问来源于stack exchange,提问作者Sayantan Ghosh
相关产品推荐
相关产品推荐

