Go 語言中,switch 分兩類:
- Expression switches: 比對 values
- Type switches: 比對 types
後面的 case 概念與大多數的語言類似,從上比到下,有default。
Expression switches
// compare with x
switch x {
// cases
}
// initialized x first, then compare with x
switch x:=f(); x{
// cases
}
// compare with true
switch {
// cases
}
// initialized x first, then compare with true
switch x:=f(); {
// cases
}
語法詳見官方文件。
舉例1:
package main
import "fmt"
type Rank int8
const (
APlus Rank = iota
A
B
F
)
func Score2Rank(score int8) Rank {
switch {
case score == 100:
return APlus
case score > 90:
return A
case score > 80:
return B
default:
return F
}
}
func main() {
switch myScore := int8(100); Score2Rank(myScore)
case APlus:
fmt.Println("Mom is happy.")
case A, B:
fmt.Println("Mom is sad.")
default:
fmt.Println("Mom is mad.")
}
}
結果
Mom is happy.
舉例2:
package main
import "fmt"
type Human struct {
Gender int8
Age int8
}
func main() {
neighbor := Human{Gender: 0, Age: 15}
switch {
case neighbor.Gender == 1:
fmt.Println("不了,我直男。")
case neighbor.Age < 16:
fmt.Println("不了,會坐牢。")
default:
fmt.Println("我考慮。")
}
}
結果
不了,會坐牢。
Type switches
比較的是type,而不是值。x.(type)
的寫法,也只能在 switch 之中才能寫得出來。
// x must be of interface type
switch x.(type) {
// cases
}
switch T := x.(type) {
// cases
}
第二種寫法比較奇特,有語法糖在裡面,舉例:
package main
import "fmt"
func main() {
var x any
x = "hello world"
switch T := x.(type) { // T 還沒被宣告
case nil: // 默默發生了 T:=x
case int: // 默默發生了 T:=x.(int)
default: // 默默發生了 T:=x
fmt.Printf("%T \n", T) // string
}
}