Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Go跳槽面试 必懂知识点:select和channel

Go跳槽面试 必懂知识点:select和channel

作者头像
王中阳Go
发布于 2022-10-26 06:29:22
发布于 2022-10-26 06:29:22
65800
代码可运行
举报
文章被收录于专栏:Go语言学习专栏Go语言学习专栏
运行总次数:0
代码可运行

金九银十面试季到了(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操作。

经典示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.从已经关闭并且没有值的通道中取值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.从已经关闭并且有值的通道中取值

我们稍微修改一下上面的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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必知必会面试题专栏

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员升级打怪之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go语言学习(五):通道的用法
go语言的作者Rob Pike认为,不要通过共享内存来实现通信,而应该通过通信来共享内存。多个goroutine之间可以通过通道来传递数据。通道是并发安全的,类似于一个FIFO的队列。go语言的通道定义需要使用make语句,如下,定义了一个存放3个int类型元素通道并向通道中输入了3个元素。同时用for循环取出。
jinjunzhu
2020/08/20
4150
Golang之旅23-通道channel
在goroutine并发执行的时候,需要在函数和函数之间进行通信。Go语言并发模式CSP(communicating Sequents Processes),通过通信共享内存。
皮大大
2021/03/02
3480
Go Channel(收藏以备面试)
Go语言采用CSP模型,让两个独立执行的程序通过消息传递的方式共享内存,Channel就是Golang用来完成消息通讯的数据类型。
一行舟
2022/08/25
4910
Golang 基础之基础语法梳理 (二)
单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义,channel就是它们之间的连接。
帽儿山的枪手
2022/03/20
6970
Golang 基础之基础语法梳理 (二)
学会 Go select 语句,轻松实现高效并发
在 Go 语言中,Goroutine 和 Channel 是非常重要的并发编程概念,它们可以帮助我们解决并发编程中的各种问题。关于它们的基本概念和用法,前面的文章 一文初探 Goroutine 与 channel 中已经进行了介绍。而本文将重点介绍 select,它是协调多个 channel 的桥梁。
陈明勇
2023/10/15
8310
学会 Go select 语句,轻松实现高效并发
《郝林 :Go语言第一课》学习笔记
本文是慕课网上郝林的《Go语言第一课》的学习笔记。作为一名老码农,最近才下定决心来学习新的语言,有点惭愧,也有点兴奋。 本文是课程的学习笔记,重点把GO基本语法学习中的精要点做了下总结,也是给郝林老师的一个汇报。 学习GO语言,欢迎从郝林的《Go语言第一课》开始。
辉哥
2019/03/20
7570
《郝林 :Go语言第一课》学习笔记
10.Go-goroutine,waitgroup,互斥锁,channel和select
互斥锁表示锁的代码同一时间只能有一个goroutine运行,而读写锁表示在锁范围内数据的读写操作
zhang_derek
2019/08/12
7890
Go 语言基础--语法基础
同其他语言一样go也有 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符 这几类,作用也是一致的,这里就不过多赘述了。 算数运算符:+、-、*、/、%、++、-- 关系运算符:==、!=、>、<、>=、<= 逻辑运算符:&&、||、! 位运算符:&、|、^、>>、<< 赋值运算符:=及复合赋值运算+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|= 关于运算符的优先级,二元运算符运算方向均是从左至右,先计算括号内算式,其他的基本按照“单目乘除位关系,逻辑三目后赋值”。
邹志全
2019/07/31
4470
深入分析Go1.18 select底层原理
在对Channel的读写方式上,除了我们通用的读 i <- ch, i, ok <- ch,写 ch <- 1 这种阻塞访问方式,还有select关键字提供的非阻塞访问方式。
涂明光
2022/10/05
9040
由浅入深聊聊Golang中select的实现机制
select是go语言中常用的一个关键字,其用法也一直被用作面试题来考核应聘者。今天,结合代码来分析下select的主要用法。
会呼吸的Coder
2020/02/17
1.5K0
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
管道(channel)是 Go 语言中实现并发的一种方式,它可以在多个 goroutine 之间进行通信和数据交换。管道可以看做是一个队列,通过它可以进行先进先出的数据传输,支持并发的读和写。
周小末天天开心
2023/10/16
7160
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
Go基础--goroutine和channel
goroutine 在go语言中,每一个并发的执行单元叫做一个goroutine 这里说到并发,所以先解释一下并发和并行的概念: 并发:逻辑上具备同时处理多个任务的能力 并行:物理上在同一时刻执行多个并发任务 当一个程序启动时,其主函数即在一个单独的goroutine中运行,一般这个goroutine是主goroutine 如果想要创建新的goroutine,只需要再执行普通函数或者方法的的前面加上关键字go 通过下面一个例子演示并发的效果,主goroutine会计算第45个斐波那契函数,在计算的同时会循环
coders
2018/03/30
7950
Go基础--goroutine和channel
「一闻秒懂」你了解goroutine和channel吗?
大家都知道进程是操作系统资源分配的基本单位,有独立的内存空间,线程可以共享同一个进程的内存空间,所以线程相对轻量,上下文切换开销也小。虽然线程已经比较轻量了,但还是占近1M的内存,而今天介绍的有“轻量级线程”之称的Goroutine,可以小至几十K甚至几K,切换的开销更小。
平也
2020/04/16
5120
「一闻秒懂」你了解goroutine和channel吗?
大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使用EP14
    众所周知,Go lang的作用域相对严格,数据之间的通信往往要依靠参数的传递,但如果想在多个协程任务中间做数据通信,就需要通道(channel)的参与,我们可以把数据封装成一个对象,然后把这个对象的指针传入某个通道变量中,另外一个协程从这个通道中读出变量的指针,并处理其指向的内存对象。
用户9127725
2022/09/23
2090
大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通道channel的使用EP14
Go select语句及其相关实例 【Go语言圣经笔记】
下面的程序会进行类似于火箭发射的倒计时的工作。time.Tick函数返回一个channel,程序会周期性地像一个节拍器一样向这个channel发送事件。每一个事件的值是一个时间戳,不过更有意思的是值的传送方式。
Steve Wang
2021/12/06
6680
7.Go编程快速入门学习
描述: 反射是指在程序运行期对程序本身进行访问和修改的能力。即支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。
全栈工程师修炼指南
2022/09/29
7150
《Go语言入门经典》10~12章读书笔记
在Go语言中,一种约定是在调用可能出现问题的方法或函数时,返回一个类型为错误的值。这意味着如果出现问题,函数通常不会引发异常,而让调用者决定如何处理错误。
跑马溜溜的球
2020/12/07
5500
A Bite of GoLang(下)
8. Goroutine 8.0、Goroutine介绍 协程 Coroutine 轻量级"线程" 上面的两个特征到底是什么意思呢?下面我们通过具体的事例详细的讲述一下, package main
盛国存
2018/05/14
1.1K1
A Bite of GoLang(下)
16.Go语言-Select
上面的程序创建了 3 个通道,并在执行 select 语句之前往通道 1 、通道 2 和 通道 3 分别发送数据,在执行 select 语句时,如果有机会的话会运行所有表达式,只要其中一个通道接收到数据,那么就会执行对应的 case 代码,然后退出。所以运行该程序可能输出下面的语句:
面向加薪学习
2022/09/04
2720
Java程序员学习Go指南(一)
转载:https://www.luozhiyun.com/archives/206
luozhiyun
2020/02/18
7760
Java程序员学习Go指南(一)
相关推荐
go语言学习(五):通道的用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验