前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?

golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?

原创
作者头像
用户10889467
发布2023-12-27 16:24:22
2110
发布2023-12-27 16:24:22
举报
文章被收录于专栏:golang问题合集golang问题合集

问题

对未初始化的的chan进行读写,会怎么样?为什么?

怎么答

读写未初始化的chan都会阻塞。

举例

1.写未初始化的chan

代码语言:go
复制
package main
// 写未初始化的chan
func main() {
	var c chan int
	c <- 1
}
代码语言:go
复制
// 输出结果
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send (nil chan)]:
main.main()
        /Users/admin18/go/src/code.byted.org/linzhaolun/repos/main.go:6 +0x36

2.读未初始化的chan

代码语言:go
复制
package main
import "fmt"
// 读未初始化的chan
func main() {
	var c chan int
	num, ok := <-c
	fmt.Printf("读chan的协程结束, num=%v, ok=%v\n", num, ok)
}
代码语言:go
复制
// 输出结果
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive (nil chan)]:
main.main()
        /Users/admin18/go/src/code.byted.org/linzhaolun/repos/main.go:6 +0x46

多问一句

关于chan的面试题非常多,这个是比较常见的其中一个。但多问一句:为什么对未初始化的chan就会阻塞呢?

1.对于写的情况

代码语言:go
复制
//在 src/runtime/chan.go中
func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool {
	if c == nil {
      // 不能阻塞,直接返回 false,表示未发送成功
      if !block {
        return false
      }
      gopark(nil, nil, waitReasonChanSendNilChan, traceEvGoStop, 2)
      throw("unreachable")
	}
  // 省略其他逻辑
}

未初始化的chan此时是等于nil,当它不能阻塞的情况下,直接返回 false,表示写 chan 失败

当chan能阻塞的情况下,则直接阻塞 gopark(nil, nil, waitReasonChanSendNilChan, traceEvGoStop, 2), 然后调用throw(s string)抛出错误,其中waitReasonChanSendNilChan就是刚刚提到的报错"chan send (nil chan)"

2. 对于读的情况

代码语言:go
复制
//在 src/runtime/chan.go中
func chanrecv(c *hchan, ep unsafe.Pointer, block bool) (selected, received bool) {
    //省略逻辑...
    if c == nil {
        if !block {
          return
        }
        gopark(nil, nil, waitReasonChanReceiveNilChan, traceEvGoStop, 2)
        throw("unreachable")
    }
    //省略逻辑...
} 

未初始化的chan此时是等于nil,当它不能阻塞的情况下,直接返回 false,表示读 chan 失败

当chan能阻塞的情况下,则直接阻塞 gopark(nil, nil, waitReasonChanReceiveNilChan, traceEvGoStop, 2), 然后调用throw(s string)抛出错误,其中waitReasonChanReceiveNilChan就是刚刚提到的报错"chan receive (nil chan)"

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 怎么答
  • 举例
    • 1.写未初始化的chan
      • 2.读未初始化的chan
      • 多问一句
        • 1.对于写的情况
          • 2. 对于读的情况
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档