我正在用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")
}
浸泡我的脚趾,并编写了一些代码来检查是否输入了 y 或 n :
y
当我运行此代码&输入True
(然后按回车键)我希望看到Else
,但我得到=arrayformula(if((H3:H15)-(H2:H14)=0,I2+B3,B3))
- 有谁可以看到原因?
答案 0 :(得分:4)
你很可能想要这样的东西:
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")
}
正如上面的评论所说,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")
}
答案 1 :(得分:3)
@TimCooper在评论中指出,
"ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter"。
这意味着,当您的分隔符为{
"compilerOptions": {
// ...
"types": ["filesaver"]
}
}
时,它将包含在\n
读取中,因此您需要在进行比较时将其考虑在内,或将其删除。
正如对其他答案的讨论所揭示的那样,仅仅剥离text
是不够的。这可能是因为\n
的用户输入的行结尾可能因操作系统而异。在UNIX中它是stdin
,在Windows中它是\n
。
这是一个更便携的解决方案:
\r\n
我还将if strings.TrimRight(text, "\r\n") == "y" {
的使用更改为与strings.Compare
直接比较直接,更简单的比较。