这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1.问题描述
今天在看视频 Go 语言的实战案例 - 掘金 (juejin.cn) 学习go语言的时候,出现了一处与视频中不一致的现象:视频中3分10秒时显示的部分代码片段为:
//跳过
input = strings.TrimSuffix(input, "\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
fmt.Println("You guess is", guess)
//跳过
正常情况下,这里代码的运行效果为以下这种情况:
但是实际上,在我的电脑(Win11系统)上运行的结果是这样的:
很显然,这是一种意料之外的情况
2.问题分析
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
程序在执行上面这一段代码的时候,err变量是有内容的,于是我尝试将这里的input,guess,err三个变量进行输出,AMAZING!
在上图中我们可以看到,我们在进行Atoi的时候,程序没能将我们输入的数据转化成int格式,顺便抛出了一个错误,提示我们输入的“50”变成了“50\r”
WHAAAAT!?
这里竟然多了一个'\r',很显然,这是意料之外的(对于我这个菜鸡来说),为什么我输入的是"50\n",实际上在执行的时候不是"50",却变成了"50\r"呢?于是我查阅了相关资料,了解到Windows系统的回车键换行符是"\r\n" ,而我们在处理输入的时候将回车键理解成为了"\n" 于是我们输入了这句代码input = strings.TrimSuffix(input, "\n")
3.问题解决
通过以上分析,我们很容易就找到了问题的所在,只要将上述语句改成下面这句,问题就能够迎刃而解了:input = strings.TrimSuffix(input, "\r\n")。此时我们再编译运行程序,发现此时程序能够顺利运行了,WOOOOOOW!输出一下相应的变量,发现guess也变成了正常,err也变成了nil,问题完美解决!
4.问题复盘
通过这个案例的实践,我明白了一个应该是众所周知但是却被我忽略掉的小细节,就是Windows系统在输入回车键的时候输入的字符是"\r\n",以后再次遇到相似情况的时候我应该不会再有疑惑了QAQ,也希望我这段比较低级错误的经历能够给大家起到一个或大或小的警惕吧~还是要注意一下一些基本的小细节。
5.参考文档
解决“strconv.Atoi parsing XXX \r“问题_sanqima的博客-CSDN博客_strconv.atoi