介绍go语言的分支语句有几种,以及如何使用
(一)分支语句概述
总的来说有三类: if...elseif...else... switch...case...default... select.... 注意点: 不支持三目运算符 在使用&&,||时支持阻断机制(也就是说前面的语句可以满足整个条件时后面条件不再判断)
(二)细说分支语句
①if…elseif…else…
值得注意的是: (1)go语言if分支判断条件可以不加括号 (2)else或else if书写的时候不可以换行(五颗星) (3)每一个分支语句块都必须加{}加以限定,否则会编译出错 (4)遇到匹配的条件进入执行,其余符合的条件将被阻断
例如: a := 11 // if else if else语句 if a > 10 { fmt.Println("a大于10") } else if a < 10 { fmt.Println("a小于10") } else { fmt.Println("a等于10") }
②switch…case…default…
值得注意的是: (1)switch语句与其他语言的区别是go语言的case语句不用加break语句 找到匹配的项直接进行case然后执行完退出 (2)并且go语言中case语句可以在一个case语句中可以捕获多个可满足的条件 (3)case语句中可以使用fallthrough强制执行case后面的语句,无论是否满足条件 执行的时候会从第一个满足条件的case语句向下执行,执行到没有fallthrough代码块后 无论后面case是否满足条件都将跳出 (4)switch语句中每一个case捕获到的类型要保持一致 (5)不可以两个case捕获的条件相同 (6)switch语句中不像if分支语句那样严格要求{}
正常的switch语句 //switch判断一个变量的类型 switch mytype := x.(type) {//后面学反射的时候会学这个b.(type) case nil: fmt.Printf(" x 的类型 :%T", i)//%T代表打印变量的类型 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("未知型") }
使用fallthrough的switch语句 这里会一直执行打印到4、case 条件语句为 true这一行 switch { case true: fmt.Println("1、case 条件语句为 false") fallthrough case true: fmt.Println("2、case 条件语句为 true") fallthrough case false: fmt.Println("3、case 条件语句为 false") fallthrough case false: fmt.Println("4、case 条件语句为 true") case true: { fmt.Println("5、case 条件语句为 false") fmt.Println("666") } fmt.Println("666") fallthrough default: { fmt.Println("123") } }
③select…
select语句概述: select语句类似于用于通信的switch语句,每个case必须是一个通信操作,要么发送要么接收 select运行机制: select语句会从通道内进行取值select会先检测那几个case符合筛选条件,如果有的话select就 会在符合条件的case中选择一个进行执行如果没有一个case符合条件,就会选择default执行, 如果没有default选项就会进入阻塞状态直至满足case条件,如果select被阻塞,其他线程没有 被time.Sleep之外的阻塞所阻塞,则不会抛死锁异常如果select被阻塞,其他线程被time.Sleep之 外的阻塞方式阻塞了,则抛出死锁异常
介绍select代码之前先简要概述一下通道(先声明后初始化,先进先出) 通道的长度决定了通道可以存放多少个数据(后面会详细介绍,这里就是为了理解select语句) 通道声明: 只有一个位置的int型通道 var a chan int a = make(chan int, 1) 有101个位置的int型通道 var b chan int b = make(chan int, 101) 通道使用: 存数据 a<-10(将10存进了通道a内) 取数据 i:=<-a(将a内的10取出放在变量i内)
1、测试随机性
测试select语句执行case条件的随机性,其中b是一个通道 for i := 0; i < 10; i++ { select { case b <- i: fmt.Println("1号就绪!") case b <- i: fmt.Println("2号就绪!") case b <- i: fmt.Println("3号就绪!") case b <- i: fmt.Println("4号就绪!") case b <- i: fmt.Println("5号就绪!") case b <- i: fmt.Println("6号就绪!") case b <- i: fmt.Println("7号就绪!") case b <- i: fmt.Println("8号就绪!") case b <- i: fmt.Println("9号就绪!") } } 结果(随机打印): 6号就绪! 8号就绪! 7号就绪! 2号就绪! 9号就绪! 8号就绪! 9号就绪! 1号就绪! 6号就绪! 5号就绪!
2、测试可满足条件
开始通道a内没有数据,取数据时阻塞所以第一个条件不满足 必须先向a输入数据i才可以对a进行取值,所以先打印 投递成功! 又因为a是只能存放一个数据的通道,所以当a内有数据时打印i的值。 for i := 0; i < 10; i++ { select { case x := <-a: fmt.Println(x) case a <- i: fmt.Println("投递成功!") } } 结果: 投递成功! 0 投递成功! 2 投递成功! 4 投递成功! 6 投递成功! 8
④Go语言中没有三目运算符
GO GO GO !