Go Switch

Gary Liao
3 min readMay 31, 2023

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
}
}

--

--