Golang-channel底层实现精要

本文深入探讨了Golang中channel的底层实现,包括channel的结构、创建、数据发送与接收的过程。当channel缓冲区满或空时,文章详细解释了如何通过调度器进行goroutine的阻塞与唤醒,以及数据在goroutine间的高效复制策略,揭示了Go并发编程的优雅之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Golang-channel底层实现精要

一.channel 背景知识

  • channel是Go语言内置的核心类型,可以将其看做一个管道,channel和goroutine一起为go并发编程提供了最优雅和便利的方案
  • 在Go中有一句经典名言,永远不要通过共享内存来通信,而是要通过通信来共享内存,channel便是用于实现goroutine间通信的
  • channel提供了三种类型
    • 单向只能发送:chan<- struct{} 只能发送struct (箭头指向channel,则代表发送)
    • 单向只能接收:<-chan struct{} 只能从chan里接收struct (箭头远离channel,则代表接收)
    • 双向即可发送也可接收:chan string 既能接收也能发送
  • nil是channel的零值,对值是nil的channel发送和接收总是会阻塞

二.channel 底层实现

1.channel底层结构

简要说明:

  • buf是带缓冲的channle所特有的结构,是个循环链表,用来存储缓存数据
  • sendxrecvx是用于记录buf中发送和接收的index
  • lock是个互斥锁,目的是为了保证goroutine以先进先出FIFO的方式进入结构体
  • recvqsendq分别是往channel接收或发送数据的goroutine所抽象出来的数据结构,是个双向链表

channel结构体的源码位于/runtime/chan.go中,

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值