为什么我的 go lang 字符串比较没有按预期工作?

Vin*_*mth 1 go

我正在尝试并Go编写了一些代码来检查是否输入了yn :

reader := bufio.NewReader(os.Stdin)
fmt.Print("(y / n): ")
text, _ := reader.ReadString('\n')
text = strings.ToLower(text)

if strings.Compare(text, "y") == 0 { 
    fmt.Println("True")
} else {
    fmt.Println("Else")
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码并输入y(并按 Enter)时,我希望看到True但我得到Else- 谁能明白为什么?

Bad*_*Zen 5

您很可能想要这样的东西:

reader := bufio.NewReader(os.Stdin)
fmt.Print("(y / n): ")
text, _ := reader.ReadString('\n')
text = strings.ToLower(text[0:len(text)-1])

if strings.Compare(text, "y") == 0 { 
   fmt.Println("True")
} else {
   fmt.Println("Else")
}
Run Code Online (Sandbox Code Playgroud)

正如上面的评论所说,ReadString()将分隔符作为字符串的一部分返回。所以你得到“y\n”并与“y”进行比较 - 结果是错误的。(您可能更愿意使用该Trim()函数来删除输入两侧的所有空格!)

编辑:Trim()建议应始终优先于原始建议。否则会产生不可移植的代码,如本答案的注释所示。完整修改后的代码:

reader := bufio.NewReader(os.Stdin)
fmt.Print("(y / n): ")
text, _ := reader.ReadString('\n')  
text = strings.ToLower(strings.Trim(text," \r\n"))

if strings.Compare(text, "y") == 0 { 
   fmt.Println("True")
} else {
   fmt.Println("Else")
}
Run Code Online (Sandbox Code Playgroud)