switch語法
在go中,switch
可以支持傳入各種類型進行選擇,相當於從第1個case
到最后一個case
遍歷進行比較,執行最先滿足條件的case
。
並且go語言還規定必須要顯式寫明fallthrough
語句才會接着執行下一個case
,不用再寫break
了。這樣其實更合理一些,因為絕大部分情況都是這個語義的,何必再在每個case
里面寫上break
呢。
func main() {
var weakDay string
fmt.Scan(&weakDay)
switch weakDay {
case "Mon.":
fmt.Println(1)
case "Tues.":
fmt.Println(2)
case "Wed.":
fmt.Println(3)
case "Thurs.":
fmt.Println(4)
case "Fri.":
fmt.Println(5)
case "Sat.":
fmt.Println(6)
case "Sun.":
fmt.Println(7)
default:
panic("wrong day")
}
}
支持一個case
里面多種情況。
func main() {
var weakDay string
fmt.Scan(&weakDay)
switch weakDay {
case "Mon.", "Tues.", "Wed.", "Thurs.", "Fri.":
fmt.Println("work day")
case "Sat.", "Sun.":
fmt.Println("weakend")
default:
panic("wrong day")
}
}
可以不傳入參數,替代繁瑣的if else
寫法。這里每個case
挨個判斷,進入最先滿足條件的case
執行。
func main() {
var score int
fmt.Scan(&score)
switch {
case score < 60:
fmt.Println("不及格")
case score >= 60 && score < 80:
fmt.Println("不錯")
case score >= 80:
fmt.Println("優秀")
default:
panic("wrong number")
}
}
type switch
type switch
是go語言中一種特殊的switch
語法,它比較的是類型而不是具體的值。
和普通的類型斷言一樣,要求進行斷言的變量必須是接口類型的。並且在type switch
中不允許使用fallthrough
語句。
package main
import (
"fmt"
)
type person struct {
age int
name string
}
func guessType(x interface{}) {
value := x.(person)
fmt.Println(value)
switch x.(type) {
case int:
fmt.Println("int")
case string:
fmt.Println("string")
case person:
fmt.Println("person")
default:
fmt.Println("unknown")
}
}
func main() {
var n int
var str string
var p person
guessType(n) // int
guessType(str) // string
guessType(p) // person
}
為了方便進行類型轉換,type switch
還可以設定一個值來提前保存轉換之后得到的值。
package main
import (
"fmt"
)
type person struct {
age int
name string
}
func guessType(x interface{}) {
switch value := x.(type) {
case int:
fmt.Println("int ", value)
case string:
fmt.Println("string ", value)
case person:
fmt.Println("person ", value)
default:
fmt.Println("unknown ", value)
}
}
func main() {
var n int
var str string = "hello"
var p person
guessType(n) // int 0
guessType(str) // string hello
guessType(p) // person {0 }
guessType(nil) // person <nil>
}