关于Go利用bufio.NewReader()读取String输入转化为Int失败问题

156 阅读1分钟
   一些废话:由于之前一直在弄一些图像处理的东西,所以到现在才匆匆忙忙补一下之前的课程

回到正文:

这段程序用bufio.NewReader()将输入转换为一个只读的流(scanf会更加简洁,但因为要求所以这里利用bufio),之后用ReadString()从流中读取一行,读取一行后会发现最后多出了一个换行符(官方文档给出,作者也是Go小白,暂时没法深究),因此利用Trimsuffix()去掉换行符,最后用strconv.Atoi()转成一个数字输出

reader := bufio.NewReader(os.Stdin)
//读取一行输入
input, err := reader.ReadString('\n')
//去换行符
input = strings.TrimSuffix(input, "\n")

guess, err := strconv.Atoi(input)
if err != nil {
   fmt.Println("Invalid input")
   return
}

fmt.Println("Your guess is", guess)

试着跑了一下,问题出现了—— 类型转换错误,guess值为0

image.png

直接说结论:

在Windows系统中,回车符是"\r\n",而不是Unix/Linux系统中的"\n",导致代码无法正确解析输入。

为了解决这个问题,可以在读取输入前先使用strings.Replace()函数来将"\r\n"替换为"\n",这样就能正确解析输入了。修改后的部分代码如下:

input = strings.Replace(input, "\r\n", "\n", -1)
//去换行符
input = strings.TrimSuffix(input, "\n")

image.png

func Replace(s, old, new string, n int) string
参数描述
s要替换的整个字符串。
old要替换的字符串。
new替换成什么字符串。
n要替换的次数,-1,那么就会将字符串 s 中的所有的 old 替换成 new。
参考文章:Go语言字符串替换-Golang字符串替换-Go语言字符串Replace函数

作者文章水平不高,Go这方面也才刚接触,有错误或不足之处之处请大佬们指出