【go】switch用法梳理与总结

Go 语言的 switch 语句是一种强大的多分支控制结构,比 C/C++/Java 中的 switch 更灵活,支持表达式匹配、类型断言、无表达式匹配(类似 if-else 链)等特性。下面我们详细介绍 switch 的各种用法,并附上代码示例。

一、基本 switch 语句

基本语法:

go 复制代码
switch 表达式 {
case 值1:
    // 执行语句
case 值2:
    // 执行语句
default:
    // 默认执行语句
}

示例:

go 复制代码
package main
import "fmt"
func main() {
    num := 2
    switch num {
    case 1:
        fmt.Println("One")
    case 2:
        fmt.Println("Two")
    case 3:
        fmt.Println("Three")
    default:
        fmt.Println("Unknown")
    }
}

输出:

复制代码
Two

二、无表达式的 switch(类似 if-else 链)

switch 后面没有表达式时,相当于 switch true,可以用来构建复杂的条件判断。

示例:

go 复制代码
package main
import "fmt"
func main() {
    score := 85
    switch {
    case score >= 90:
        fmt.Println("A")
    case score >= 80:
        fmt.Println("B")
    case score >= 70:
        fmt.Println("C")
    default:
        fmt.Println("D")
    }
}

输出:

复制代码
B

三、多条件匹配

一个 case 可以匹配多个值,用逗号分隔。

示例:

go 复制代码
package main
import "fmt"
func main() {
    day := "Tuesday"
    switch day {
    case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday":
        fmt.Println("Weekday")
    case "Saturday", "Sunday":
        fmt.Println("Weekend")
    default:
        fmt.Println("Invalid day")
    }
}

输出:

复制代码
Weekday

四、fallthrough 关键字

Go 的 switch 默认不会自动"穿透"到下一个 case,但可以使用 fallthrough 强制执行下一个 case 的代码。

示例:

go 复制代码
package main
import "fmt"
func main() {
    num := 1
    switch num {
    case 1:
        fmt.Println("One")
        fallthrough
    case 2:
        fmt.Println("Two")
    default:
        fmt.Println("Other")
    }
}

输出:

复制代码
One
Two

⚠️ 注意:fallthrough 只能用在 case 的最后一句,且会无条件执行下一个 case,不会判断条件。

五、类型断言 switch(type switch)

Go 支持对接口变量进行类型判断,使用 switch v := x.(type) 语法。

示例:

go 复制代码
package main
import "fmt"
func printType(x interface{}) {
    switch v := x.(type) {
    case int:
        fmt.Printf("Int: %d\n", v)
    case string:
        fmt.Printf("String: %s\n", v)
    case bool:
        fmt.Printf("Bool: %t\n", v)
    default:
        fmt.Println("Unknown type")
    }
}
func main() {
    printType(42)
    printType("hello")
    printType(true)
    printType(3.14)
}

输出:

复制代码
Int: 42
String: hello
Bool: true
Unknown type

六、总结

Go 的 switch 语句具有以下特点:

  • 支持表达式匹配和无表达式匹配(类似 if-else)
  • 一个 case 可以匹配多个值
  • 默认不穿透,除非使用 fallthrough
  • 支持类型断言(switch v := x.(type)
  • 比 C/C++ 更安全、灵活
    switch 是 Go 中常用的控制结构,特别适合处理多分支逻辑,比冗长的 if-else 更清晰。