switch基本介绍

1,switch语句用于不同条件执行不同动作,每一个case分支都是唯一的,从上到下逐一测试,直到匹配为止

2,匹配项后面不需要加break


基本语法

swtich 表达式{
case 表达式1,表达式2,...:
语句块1
case 表达式3,表达式4,...:
语句块2
//可以写多个case语句
default:
语句块
}


switch的流程图

Golang的Switch分支控制 _数据类型


注:

1, switch的执行流程是,先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就匹配到,然后执行对应case的语句块,退出switch控制。

2,如果switch的表达式的值没有和任何case的表达式匹配成功,则执行default的语句块,执行后退出switch控制。

3,golang的case后的表达式可以有多个,使用 逗号分隔

4,golang的case语句块不需要写break,默认自带有,当程序执行完case语句块后,就直接退出switch控制。


代码示例:

package main
import (
"fmt"
)

func main() {
var key byte
fmt.Println("请输入一个数 1,2,3,4,5,6,7")
fmt.Scanf("%c",&key)

switch key {
case '1':
fmt.Println("今天是周一")
case '2':
fmt.Println("今天是周二")
case '3':
fmt.Println("今天是周三")
case '4':
fmt.Println("今天是周四")
case '5':
fmt.Println("今天是周五")
case '6':
fmt.Println("今天是周六")
case '7':
fmt.Println("今天是周日")
default:
fmt.Println("输入有误")

}
}

Golang的Switch分支控制 _golang_02


switch的使用注意事项

1,case/switch后是一个表达式(常量,变量,一个有返回值的函数等都可以)

package main
import (
"fmt"
)

func test(int int8) int8 {
return int + 1
}

func main() {
var key int8
fmt.Println("请输入一个数 1,2,3,4,5,6,7")
fmt.Scanf("%c",&key)

switch test(key) {
case '1':
fmt.Println("今天是周一")
case '2':
fmt.Println("今天是周二")
case '3':
fmt.Println("今天是周三")
case '4':
fmt.Println("今天是周四")
case '5':
fmt.Println("今天是周五")
case '6':
fmt.Println("今天是周六")
case '7':
fmt.Println("今天是周日")
default:
fmt.Println("输入有误")

}
}

Golang的Switch分支控制 _基本语法_03


2,case后的各个表达式的值的数个类型,必须和switch的表达式数据类型一致

package main
import "fmt"

func main() {
var i int32 = 20
var j int64 = 12
switch i {
case j: //报错了,j的数据类型与i的数据类型不一致
fmt.Println("ok1")
default:
fmt.Println("没有匹配到")
}
}



3,case后面可以带多个表达式,使用逗号间隔开。如case 表达式1, 表达式2,...

package main
import "fmt"

func main() {
var i int32 = 20
var j int32 = 12
switch i {
case j,8, 5:
fmt.Println("ok1")
default:
fmt.Println("没有匹配到")
}
}

Golang的Switch分支控制 _数据类型_04


4,case后面的表达式如果是常量值(字面量),则要求不能重复

package main
import "fmt"

func main() {
var i int32 = 20
var j int32 = 12
switch i {
case j,8, 20:
fmt.Println("hello")
case 20: //报错了,因为与前面的常量20重复了
fmt.Println("world")
default:
fmt.Println("没有匹配到")
}
}

Golang的Switch分支控制 _数据类型_05


5,case后面不需要带break,程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都没匹配到,则执行default

6,default语句不是必须

7,switch后也可以不带表达式,类似 if--else 分支来使用

package main
import (
"fmt"
)

func main() {
var age int = 18
switch {
case age == 18:
fmt.Println("age == 18")
case age == 28:
fmt.Println("age == 28")
default:
fmt.Println("没有匹配到")
}
var score int = 95
switch {
case score >= 90 :
fmt.Println("成绩优秀")
case score >=80 && score < 90 :
fmt.Println("成绩良好")
case score >=60 && score < 80 :
fmt.Println("成绩中等")
default:
fmt.Println("成绩不及格")
}
}

Golang的Switch分支控制 _数据类型_06


8,siwtch后也可以直接声明定义一个变量,分号结束,不建议

package main
import (
"fmt"
)

func main() {
switch score := 95; {
case score >= 90 :
fmt.Println("成绩优秀")
case score >=80 && score < 90 :
fmt.Println("成绩良好")
case score >=60 && score < 80 :
fmt.Println("成绩中等")
default:
fmt.Println("成绩不及格")
}
}

Golang的Switch分支控制 _浮点数_07


9,switch 穿透 fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case ,也叫switch 穿透

package main
import (
"fmt"
)

func main() {
var score int = 90
switch score {
case 90 :
fmt.Println("成绩优秀")
fallthrough
case 80 :
fmt.Println("成绩良好")
case 70 :
fmt.Println("成绩中等")
default:
fmt.Println("成绩不及格")
}
}

Golang的Switch分支控制 _基本语法_08



10,Type Switch:switch语句还可以用于Type Switch来判断某个interface变量中实际指向的变量类型

package main
import (
"fmt"
)

func main() {
var x interface{}
var y = 10.0
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("未知类型")
}
}

Golang的Switch分支控制 _golang_09


switch和if比较

1,如果判断的具体数值不多,而且符合整数,浮点数,字符,字符串这几种类型,建议使用switch

2,对区间判断和结果为bool类型的判断,使用if,if的使用范围更广