Golang的switch语句是用于处理多条件分支的语法结构,它比传统的if else链更简洁,同时支持很多Go特有的灵活特性,是日常开发中高频使用的语法之一。

Golang switch基础语法
Go的switch基础语法和其他类C语言类似,但不需要在每个case后面写break,默认执行完对应case后会自动跳出switch。基础结构如下:
package main
import "fmt"
func main() {
num := 2
switch num {
case 1:
fmt.Println("数字是1")
case 2:
fmt.Println("数字是2")
case 3:
fmt.Println("数字是3")
default:
fmt.Println("数字不在1-3范围内")
}
}
上面的代码中,num的值为2,会匹配到第二个case,执行后直接退出switch,不会继续执行后面的case。如果多个case需要执行相同的逻辑,可以把多个case写在一起:
package main
import "fmt"
func main() {
day := "周六"
switch day {
case "周六", "周日":
fmt.Println("今天是休息日")
case "周一", "周二", "周三", "周四", "周五":
fmt.Println("今天是工作日")
default:
fmt.Println("无效的日期")
}
}
Golang switch的特殊用法
省略表达式的switch
Go的switch可以省略后面的表达式,此时相当于switch true,每个case后面可以跟条件判断表达式,功能和if else链类似但更清晰:
package main
import "fmt"
func main() {
score := 85
switch {
case score >= 90:
fmt.Println("成绩等级为A")
case score >= 80:
fmt.Println("成绩等级为B")
case score >= 60:
fmt.Println("成绩等级为C")
default:
fmt.Println("成绩等级为D")
}
}
switch后跟初始化语句
和if语句一样,switch后面可以跟一个初始化语句,用分号隔开初始化语句和判断表达式:
package main
import "fmt"
func main() {
switch num := getNum(); num {
case 1:
fmt.Println("获取到的数字是1")
case 2:
fmt.Println("获取到的数字是2")
default:
fmt.Println("获取到的数字是其他值")
}
}
func getNum() int {
return 2
}
fallthrough关键字
Go的switch默认不会穿透执行下一个case,如果需要执行完当前case后继续执行下一个case,可以使用fallthrough关键字:
package main
import "fmt"
func main() {
num := 1
switch num {
case 1:
fmt.Println("匹配到case 1")
fallthrough
case 2:
fmt.Println("匹配到case 2")
default:
fmt.Println("匹配到default")
}
}
上面的代码会依次输出匹配到case 1和匹配到case 2,需要注意的是fallthrough只能穿透到下一个case,不能跳过中间的case。
Golang switch适用场景
- 当需要处理多个固定值的分支判断时,比如根据状态码返回不同提示、根据星期返回不同日程,使用switch比if else更简洁易读。
- 当分支判断的条件是可以枚举的离散值时,switch的匹配效率比连续的if else更高。
- 当多个分支需要执行相同的逻辑时,switch可以把多个case合并,减少重复代码。
- 当判断逻辑是范围判断时,可以使用省略表达式的switch,比多层if else嵌套更清晰。
switch和if else的选择
如果分支判断是基于一个变量的多个离散值,优先使用switch;如果是复杂的条件组合、或者条件之间没有明显的枚举关系,优先使用if else。比如判断一个数是否在某个区间、或者多个不同变量的组合条件,用if else更合适。
注意事项
- switch后面的表达式的类型必须和case后面的表达式类型一致,否则会编译报错。
- case后面的表达式必须是常量或者可以计算出确定值的表达式,不能是变量(除非是初始化语句中定义的变量)。
- fallthrough关键字要谨慎使用,避免造成逻辑混乱,不符合预期的执行流程。