go语言分支语句、条件语句
【摘要】 三大分支语句的语法,以及日常使用的注意点。
介绍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 !
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)