package main
import "fmt"
func sum() int {
return 44
}
func test(x int) int {
a := 5
b := 2
return a + b + x
}
func main() {
//todo:示例一 switch后面有一个表达式,case后面有一到多个表达式,前面的case匹配
//到执行了,后面的case即使也匹配但不会执行;switch和case表达式最终的值的类型要一致
n := 44
m := 22
o := "我是字符串"
switch n {
case 11, 22, 33: //todo:case后面可以有多个表达式,用逗号隔开,多个表达式为常量时不得有重复
fmt.Print("find it")
case sum():
fmt.Println("a function")
//case "44": //todo:报错:Invalid case '"44"' in switch on 'n' (mismatched types 'string' and 'int')
fmt.Println("something strange")
//case o: //报错:Invalid case 'o' in switch on 'n' (mismatched types 'string' and 'int')
fmt.Println("o=", o)
case m * 2, 55, sum() * 2: //todo:由于第二个case匹配上了,因此即使这个case也匹配,但由于case的先后顺序,该case不会执行
fmt.Println("find another")
default:
fmt.Println("have not find")
}
//todo:示例二 switch后面可以是表达式【包括可以是有返回值的函数】
switch test(3) / 2 {
case 2:
fmt.Println("是2")
case 5:
fmt.Println("是5")
}
//todo:示例三 switch后面没有表达式,此时默认switch后面表达式的bool值且为true
num := "一个字符串"
switch {
case num == "什么东西":
fmt.Println("不匹配")
//case "haha"://todo:报错 Invalid case '"haha"' in switch on 'true' (mismatched types 'string' and 'bool')
fmt.Println("haha")
case true: //可见switch后面没有表达式时,switch后面默认是true这个值的
fmt.Println("true") //todo:会打印true,且尽管len(num)大于2,但不会打印“大于2”,因为只匹配最先匹配上的case后就会跳出switch
case len(num) > 2:
fmt.Println("大于2")
case len(num) > 4:
fmt.Println("大于4")
}
num2 := "另一个字符串"
switch {
case num2 == "什么东西":
fmt.Println("不匹配")
case len(num2) > 2:
fmt.Println("大于2") //会打印“大于2”
fallthrough //todo:fallthrough必须单独成行,只能穿透一层
case len(num2) > 4:
fmt.Println("大于4") //由于有fallthrough,不经过判断len(num)>4,这里就会直接输出“大于4”
fallthrough
case len(num2) > 88:
fmt.Println("大于88") //todo:虽然num的长度并不大于88,但仍会输出"大于88"
//goto //switch中还是没法通过goto 和 label来执行两个case
case len(num2) > 888:
fmt.Println("大于888")
}
//todo:和类型断言一起使用
var x interface{}
var y = 10.0
x = y
//k := x.(int) //todo:虽然不报错,但跑起来后会报错,说 panic: interface conversion: interface {} is float64, not int
j := x.(float64)
fmt.Printf("j的类型为%T,值为%v\n", j, j) //j的类型为float64,值为10
//fmt.Printf("k的类型为%T,值为%v",k,k)//j的类型为float64,值为10
switch i := x.(type) { //todo:会自动的用i【i是一个类型,不是值】
case int:
fmt.Println(i, "是int类型") //todo:这里就是用一下i,不然报错说i申明了没使用,各个case后的表达式并不需要有i
case float64:
fmt.Println("是float64类型")
case float32:
fmt.Println("是float323类型")
case string:
fmt.Println("是字符串类型")
}
//todo:最后一种方式,不推荐
switch grade := 90; { //todo:分号不能省略
case grade > 66:
fmt.Println("大于66")
case 55 < grade && grade < 66:
fmt.Println("在55和66之间")
}
}