目录select先说switch...case...再说select...case..select类比switch经典示例运行结果channel1.从已经关闭并且没有值的通道中取值2
switch...case... 很常用,且很好理解。其作用和if...else...一样。
区别是switch...case 相比于if...else...能让我们的代码看起来更清晰,更好理解。
golang 的 select 就是监听 io 操作,当 IO 操作发生时,触发相应的动作。
所说的IO操作就是对channle的操作:向通道发送数据,或者从通道中读取数据。
在执行select语句的时候,运行时系统会自上而下地判断每个case中的发送或接收操作是否可以被立即执行。
什么是立即执行呢?
立即执行:意思是当前Goroutine不会因当前操作而被阻塞
select的用法与switch非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。
与switch语句可以选择任何可使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作。
确切的说,应该是一个面向channel的IO操作。
package main
import "fmt"
func main() {
ch1 := make(chan int, 1)
ch1 <- 2
select {
case v := <-ch1:
fmt.Println("取到的数据:", v)
case ch1 <- 1:
fmt.Println("写入数据")
}
}
goroutine和channel作为go语言中最重要的两个知识点,一定要搞清楚。
大家容易出错的知识点是以下3点,尤其是最后一点:
1.nil channel代表channel未初始化,向未初始化的channel读写数据会造成阻塞
2.关闭(close)未初始化的channel会引起panic。
3.从一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值,并不会引起panic。
package main
import "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")
}
}
运行结果
和我们预想中的一样,取到了对应的零值:
我们稍微修改一下上面的代码
package main
import "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")
}
}
运行结果
运行结果和我们预想中的一样:
下面的表格中总结了对不同状态下的通道执行相应操作的结果。
注意: 对已经关闭的通道再执行 close 也会引发 panic。
本文解析了Go语言中select和channel在面试中可能遇到的进阶知识点。
到此这篇关于Go语言面试题之select和channel的用法的文章就介绍到这了,更多相关Go select channel内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Go语言面试题之select和channel的用法
本文链接: https://lsjlt.com/news/121152.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0