在Go语言中,switch语句不仅可以对一个变量做等值判断,还天然支持在case中编写条件表达式。与其他语言要求switch后面必须跟变量不同,Go允许switch后留空,此时case里直接写布尔表达式,从而实现类似if-else链的功能。

Go switch的基本形式
最常见的用法是switch后面跟一个表达式,case写具体值:
package main
import "fmt"
func main() {
score := 85
switch score {
case 90, 100:
fmt.Println("优秀")
case 80:
fmt.Println("良好")
default:
fmt.Println("其他")
}
}
switch支持条件表达式的写法
当switch后面不写表达式时,相当于switch true,每个case都可以是一个返回bool的条件表达式:
package main
import "fmt"
func main() {
age := 20
switch {
case age < 12:
fmt.Println("儿童")
case age >= 12 && age < 18:
fmt.Println("青少年")
case age >= 18 && age < 60:
fmt.Println("成年")
default:
fmt.Println("老年")
}
}
上面代码中,age < 12 就是典型的条件表达式,Go会从上到下依次判断,命中第一个为true的case后执行并退出。
带初始化语句的条件switch
switch还支持在表达式前写初始化语句,再配合条件表达式使用:
package main
import "fmt"
func main() {
switch n := len("hello"); {
case n > 10:
fmt.Println("长字符串")
case n > 0 && n <= 10:
fmt.Println("短字符串")
default:
fmt.Println("空字符串")
}
}
和普通if-else的对比
使用条件表达式的switch可以让多分支判断更整齐。下面用表格简单对比:
| 场景 | if-else写法 | switch条件表达式写法 |
|---|---|---|
| 多区间判断 | 嵌套或连续if,较冗长 | case分行写,逻辑清晰 |
| 变量作用域 | 变量在外层定义 | 可在switch内初始化 |
注意事项
- case条件表达式必须是布尔类型,否则编译报错。
- Go的switch默认自带break,不会穿透,如需穿透用fallthrough。
- 条件表达式从左到右匹配,注意把更精确的条件放前面。
总的来说,Golang的switch完全支持条件表达式,而且这种写法在分支较多的业务判断中比if-else更易维护。