搞懂Go面试中常问的channel问题

2023-06-0715:48:04编程语言入门到精通Comments848 views字数 1492阅读模式

搞懂Go面试中常问的channel问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

一图胜千言

下面的表格中总结了对不同状态下的通道执行相应操作的结果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

搞懂Go面试中常问的channel问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

注意: 对已经关闭的通道再执行 close 也会引发 panic。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

之前整理了一篇:# GO面试必知必会面试题,收到了小伙伴们的好评。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

这篇文章将重点讲解Go面试进阶知识点:selectchannel文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

select

先说switch...case...

switch...case... 很常用,且很好理解。其作用和if...else...一样。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

区别是switch...case 相比于if...else...能让我们的代码看起来更清晰,更好理解。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

再说select...case..

golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

所说的IO操作就是对channle的操作:向通道发送数据,或者从通道中读取数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

在执行select语句的时候,运行时系统会自上而下地判断每个case中的发送或接收操作是否可以被立即执行文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

什么是立即执行呢?

立即执行:意思是当前Goroutine不会因当前操作而被阻塞文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

select类比switch

select的用法与switch非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

与switch语句可以选择任何可使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

确切的说,应该是一个面向channel的IO操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

经典示例

package main

import"fmt"funcmain() {
   ch1 := make(chanint, 1)
   ch1 <- 2select {
   case v := <-ch1:
      ("取到的数据:", v)
   case ch1 <- 1:
      ("写入数据")
   }
}

运行结果

搞懂Go面试中常问的channel问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

channel

goroutine和channel作为go语言中最重要的两个知识点,一定要搞清楚。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

大家容易出错的知识点是以下3点,尤其是最后一点:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

  • nil channel代表channel未初始化,向未初始化的channel读写数据会造成阻塞
  • 关闭(close)未初始化的channel会引起panic。
  • 从一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值,并不会引起panic。

1.从已经关闭并且没有值的通道中取值

package main

import"fmt"funcmain() {
   
   ch1 := make(chanint, 1)
   close(ch1)
   select {
   case v := <-ch1:
      ("从ch1中取值:%d\n", v)
   default:
      ("默认case")
   }
}

运行结果

和我们预想中的一样,取到了对应的零值: 搞懂Go面试中常问的channel问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

2.从已经关闭并且有值的通道中取值

我们稍微修改一下上面的代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

package main

import"fmt"funcmain() {
   
   ch1 := make(chanint, 1)
   
   ch1 <- 1close(ch1)
   
   after_close_value := <-ch1
   ("关闭之后取值:%d\n", after_close_value) select {
   case v := <-ch1:
      ("从ch1中取值:%d\n", v) default:
      ("默认case")
   }
}

运行结果

运行结果和我们预想中的一样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

  • 通道关闭后,如果通道中仍然有值,还是可以正常取到通道中的值的。
  • 通道关闭后,如果通道中已经没有值了,再从通道中取值,并不会引起panic,而是会取到对应类型的零值。

搞懂Go面试中常问的channel问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

一图胜千言

下面的表格中总结了对不同状态下的通道执行相应操作的结果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

搞懂Go面试中常问的channel问题文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

注意: 对已经关闭的通道再执行 close 也会引发 panic。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

总结

这篇文章解析了Go语言中select和channel在面试中可能遇到的进阶知识点。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/45463.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/45463.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定