Golang swich 语句排坑
Golang swich 语句排坑
1. case语句能否重复
package main
func main() {
switch 123 {
case 123:
case 123: // error: duplicate case
}
}
上边的代码运行会出错:原则上,switch流程控制代码块中的case表达式不能重复。
但也有些例外情况,比如:
- bool case 表达式
- nil case 表达式
这两种表达式虽然goland会提示报错,但是实际运行不会报错。
package main
func main() {
switch false {
case false:
case false:
}
}
package main
func main(){
var a interface{}
switch a {
case nil:
case nil:
}
}
关于原因:
此行为依赖于编译器。事实上,标准编译器同样不允许重复的字符串case表达式,但是gccgo编译器却允许。详见:https://github.com/golang/go/issues/28357
2. swich语句的默认值和默认类型
switch语句的默认值为bool
类型的true
。
下面的代码会输出“true”。
package main
import "fmt"
func main() {
switch { // <=> switch true {
case true: fmt.Println("true")
case false: fmt.Println("false")
}
}
switch语句后的整数会默认为int类型(即使溢出,也默认为int),因此其他类型的case会报错。
下面代码中,,编译器会认为swich语句后的整数为int,因此其他类型的case语句会报错。
package main
func main() {
switch 21474836487777989889989898989889898989998 {
case int64(123): // error: 类型不匹配
case uint32(789): // error: 类型不匹配
}
}
3. defer语句可以修改外层函数的返回结果
下面的代码,虽然return的是123,但是还有两个defer语句修改了默认返回变量r,因此最终函数返回的结果为789。
package main
import "fmt"
func F() (r int) {
defer func() {
r = 789
}()
defer func() {
r = 456
}()
return 123
}
func main() {
fmt.Println(F()) // 789
}