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

时间:2016-11-05 20:39:34

标签: go

我正在用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)) - 有谁可以看到原因?

2 个答案:

答案 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直接比较直接,更简单的比较。