注意:
-
switch/case 后是一个表达式(即:常量,变量,一个有返回的函数都可以);
-
case后的各个表达式的值的数据类型,必须和switch的表达式数据类型一致;
-
case后面可以带多个表达式,使用逗号间隔;
-
case后面的表达式如果是常量值,则要求不能重复;
-
case后面不需要带break,程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都匹配不到,则执行default;
-
default语句不是必须的;
-
switch 后也可以不带表达式,类似 if --else分支来使用;
-
switch 后也可以直接声明一个变量,分号结束,不过不推荐。
-
switch穿透:如果在case语句增加fallthrough,则会继续执行下一个case,默认只穿透一层。
-
type-switch :来判断interface变量中实际指向的变量类型,比如:
package main import ( "fmt" ) func main() { var x interface{} var y = 10 x=y switch i := x.(type) { case nil: fmt.Printf("x的类型是:%T",i) case int: fmt.Printf("x是 int 类型") case float64: fmt.Printf("x是 float64 类型") case func(int) float64: fmt.Printf("x是func(int)类型") case bool,string: fmt.Printf("x是bool或者string类型") default: fmt.Printf("未知型") } }
执行结果如下图:
案例:根据用户输入的月份,打印该月份所属的季节。
package main
import (
"fmt"
)
func main() {
//根据用户输入的月份,打印该月份所属的季节
var month byte
fmt.Print("请输入月份:")
fmt.Scanln(&month)
switch month {
case 3, 4, 5:
fmt.Println("春天")
case 6, 7, 8:
fmt.Println("夏天")
case 9, 10, 11:
fmt.Println("秋天")
case 12, 1, 2:
fmt.Println("冬天")
default:
fmt.Println("输入有误...")
}
}
执行结果如下图所示:
switch和if的选择:
- 如果判断的具体数值不多,而且符合整数,浮点数,字符,字符串这几种类型。建议使用switch语句,简洁高效。
- 其他情况:对区间判断和结果为bool类型的判断,使用if,if的使用范围更广。