go switch语法
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>
}