文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一图胜千言,帮你搞懂Go面试中常问的channel问题!

2024-11-30 13:20

关注

注意:对已经关闭的通道再执行 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 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点,尤其是最后一点:

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")
   }
}

运行结果

运行结果和我们预想中的一样:

一图胜千言

下面的表格中总结了对不同状态下的通道执行相应操作的结果。

注意:对已经关闭的通道再执行 close 也会引发 panic。

总结

这篇文章解析了Go语言中select和channel在面试中可能遇到的进阶知识点。

本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。

转载本文请联系「 程序员升级打怪之旅」公众号。

来源:程序员升职加薪之旅内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯