天天微动态丨一图胜千言,帮你搞懂Go面试中常问的channel问题!
switch…case… 很常用,且很好理解。其作用和if…else…一样。区别是switch…case 相比于if…else…能让我们的代码看起来更清晰,更好理解。
一图胜千言
下面的表格中总结了对不同状态下的通道执行相应操作的结果。
(相关资料图)
注意:对已经关闭的通道再执行 close 也会引发 panic。
这篇文章将重点讲解Go面试进阶知识点:select和channel。
select
先说switch…case…
switch…case… 很常用,且很好理解。其作用和if…else…一样。
区别是switch…case 相比于if…else…能让我们的代码看起来更清晰,更好理解。
再说select…case..
golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。
所说的IO操作就是对channle的操作:向通道发送数据,或者从通道中读取数据。
在执行select语句的时候,运行时系统会自上而下地判断每个case中的发送或接收操作是否可以被立即执行。
什么是立即执行呢?
立即执行:意思是当前Goroutine不会因当前操作而被阻塞
select类比switch
select的用法与switch非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。
与switch语句可以选择任何可使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作。
确切的说,应该是一个面向channel的IO操作。
经典示例
package mainimport "fmt"func main() { ch1 := make(chan int, 1) ch1 <- 2 select { case v := <-ch1: fmt.Println("取到的数据:", v) case ch1 <- 1: fmt.Println("写入数据") }}
运行结果
channel
goroutine和channel作为go语言中最重要的两个知识点,一定要搞清楚。
大家容易出错的知识点是以下3点,尤其是最后一点:
nil channel代表channel未初始化,向未初始化的channel读写数据会造成阻塞关闭(close)未初始化的channel会引起panic。从一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值,并不会引起panic。1.从已经关闭并且没有值的通道中取值
package mainimport "fmt"//从关闭的通道中取值示例:func main() { //声明实例化通道ch1 ch1 := make(chan int, 1) //关闭通道 close(ch1) select { //通通道ch1中取值 case v := <-ch1: fmt.Printf("从ch1中取值:%d\n", v) default: fmt.Println("默认case") }}
运行结果
和我们预想中的一样,取到了对应的零值:
2.从已经关闭并且有值的通道中取值
我们稍微修改一下上面的代码
package mainimport "fmt"//从关闭的通道中取值示例:func main() { //声明实例化通道ch1 ch1 := make(chan int, 1) //向通道中赋值 ch1 <- 1 //关闭通道 close(ch1) //关闭之后取值 after_close_value := <-ch1 fmt.Printf("关闭之后取值:%d\n", after_close_value) //打印结果:关闭之后取值:1 select { //通通道ch1中取值 case v := <-ch1: fmt.Printf("从ch1中取值:%d\n", v) //打印结果:从ch1中取值:0 default: fmt.Println("默认case") }}
运行结果
运行结果和我们预想中的一样:
通道关闭后,如果通道中仍然有值,还是可以正常取到通道中的值的。通道关闭后,如果通道中已经没有值了,再从通道中取值,并不会引起panic,而是会取到对应类型的零值。一图胜千言
下面的表格中总结了对不同状态下的通道执行相应操作的结果。
注意:对已经关闭的通道再执行 close 也会引发 panic。
总结
这篇文章解析了Go语言中select和channel在面试中可能遇到的进阶知识点。
本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。
转载本文请联系「 程序员升级打怪之旅」公众号。
关键词:
相关阅读
-
天天微动态丨一图胜千言,帮你搞懂Go面...
switch case 很常用,且很好理解。其作用和if else 一样。区别 -
世界快报:看得见山望得见水记得住乡愁的...
想必现在有很多小伙伴对于乡愁的意思方面的知识都比较想要了解,那么今 -
6月5日美国国债收益率整体下行 环球快报
上证报中国证券网讯6月5日美国国债收益率整体下行。具体来看,美国国债 -
【世界热闻】苹果12死机怎么强制重启手...
1、手机死机大多是软件不兼容、内存不足、电池接触不良等原因造成的。2 -
义县气象局发布雷雨大风黄色预警【Ⅲ级/...
雷雨大风黄色预警信号:预计未来4到6小时,义县将出现较强雷雨大风天气 -
当前关注:篮球比赛作文600字
篮球比赛作文600字一群朝气蓬勃的少年。他们的脚下是坚硬的球场,他们
精彩放送
-
天天微动态丨一图胜千言,帮你搞懂Go面...
switch case 很常用,且很好理解。其作用和if else 一样。区别 -
世界快报:看得见山望得见水记得住乡愁的...
想必现在有很多小伙伴对于乡愁的意思方面的知识都比较想要了解,那么今 -
6月5日美国国债收益率整体下行 环球快报
上证报中国证券网讯6月5日美国国债收益率整体下行。具体来看,美国国债 -
【世界热闻】苹果12死机怎么强制重启手...
1、手机死机大多是软件不兼容、内存不足、电池接触不良等原因造成的。2 -
义县气象局发布雷雨大风黄色预警【Ⅲ级/...
雷雨大风黄色预警信号:预计未来4到6小时,义县将出现较强雷雨大风天气 -
当前关注:篮球比赛作文600字
篮球比赛作文600字一群朝气蓬勃的少年。他们的脚下是坚硬的球场,他们 -
【A股主力资金】6月7日收盘,A股主力资...
金融界6月7日讯,据金融界APP智能监控显示,截止今日收盘:沪指:报319 -
世界快播:中铁工业(600528)6月7日主...
截至2023年6月7日收盘,中铁工业(600528)报收于9 73元,上涨0 21%,换 -
再生障碍性贫血患者现在都在从事什么工...
自从确诊再生障碍性贫血之后,不少患者为了更好地恢复病情,选择辞 -
全球热讯:中交地产定增募不超35亿获深交...
中国经济网北京6月7日讯中交地产昨晚发布公告称,公司于2023年6月6日收