Go跳槽面试 必懂知识点:select和channel
金九银十面试季到了(PS:貌似今年一年都是面试季),就业环境很差,导致从业人员不得不卷。
之前整理了一篇:# GO面试必知必会面试题,收到了小伙伴们的好评。
这篇文章将重点讲解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 main
import "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 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")
}
}
运行结果
和我们预想中的一样,取到了对应的零值:
2.从已经关闭并且有值的通道中取值
我们稍微修改一下上面的代码
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")
}
}
运行结果
运行结果和我们预想中的一样:
- 通道关闭后,如果通道中仍然有值,还是可以正常取到通道中的值的。
- 通道关闭后,如果通道中已经没有值了,再从通道中取值,并不会引起panic,而是会取到对应类型的零值。
一图胜千言
下面的表格中总结了对不同状态下的通道执行相应操作的结果。
注意:对已经关闭的通道再执行 close 也会引发 panic。
总结
这篇文章解析了Go语言中select和channel在面试中可能遇到的进阶知识点。
感兴趣的小伙伴可以关注我的专栏:
# Go语言学习专栏
# Go必知必会面试题专栏
相关文章
- Go短网址项目实战---下
- Go 方法
- 解决golang报错:imports github.com/go-sql-driver/mysql from implicitly required module;
- 从Go程序第一行代码,到在 K8s 上运行,要经历多少步?
- 2022-10-20:以下go语言代码输出什么?A:7;B:7.0;C:0;D:编译错误。package mainimport
- 想早点下班?试试Aorm库吧,更方便的进行Go数据库操作
- 读猿码系列——4. 从filebeat和go-stash深入日志收集及处理(go-stash篇)
- 手把手教你如何创建及使用Go module
- 「Go工具箱」一个对语义化版本进行解析、比较的库:go-version
- 「Go工具箱」通过这个工具包,你就能了解每天使用的表情符号是怎么来的
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- GO语言开篇-Go语言急速入门(基础知识点)| 青训营笔记
- client-go 源码分析(4) - ClientSet客户端 和 DynamicClient客户端
- 2023-02-22:请用go语言调用ffmpeg,保存mp4文件的视频帧,每帧用ppm图片保存。
- go语言 Linux部署 chatgpt 微信机器人指南
- Go-标准库-os(二)
- Go-包管理-go build(一)
- Go语言go mod包依赖管理工具使用详解
- SQLSERVER 中GO的作用详解
- Go基础之–操作Mysql(一)详解编程语言
- Go从入门到精通(一)go语言初识详解编程语言
- Go语言圣经-竞争条件习题详解编程语言
- Go语言圣经–Channel习题详解编程语言
- Go语言常见大型Web项目分层(MVC架构)
- 便捷使用Go编程连接Redis(go连接redis)
- 请求简单而快速用Go编写的Redis请求测试(用go写的redis)
- 踏上oracle编程之路,Go(go oracle编程)
- 快跟上趋势,GO DB ORACLE(go db oracle)
- 学习Oracle Go了解信息技术世界(oracle go的用法)