今天遇到一个案例,挺有意思,而且难以置信:
func alwaysFalse() bool {
return false
}
func main() {
switch alwaysFalse()
{
case true:
println(true)
case false:
println(false)
}
}
猜一下输出什么?对,你猜错了,真实输出为true。看到这有一种骂娘的冲动,为啥呀,明明是false的呀。别急,咱们改一下,你要的false就出来了。
func alwaysFalse() bool {
return false
}
func main() {
switch alwaysFalse(){
case true:
println(true)
case false:
println(false)
}
}
发现不一样的地方了没?对,就是大括号的问题,这就奇怪了,为啥第一种出现的是true呢?这个还是得从go语言的断行说起,咱们平时写代码的时候go语言语句结束后是没有分号的,其实这个只是go语言编辑器自动帮我们添加上了,也就是说第一部分的代码其实是这样的:
func main() {
switch alwaysFalse();
{
case true:
println(true)
case false:
println(false)
}
}
那这个其实是和下面这个等价的:
func main() {
switch alwaysFalse();true{
case true:
println(true)
case false:
println(false)
}
}
这个就正常了,也就可以想通了