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所特有的结构,是个循环链表,用来存储缓存数据
- sendx和recvx是用于记录buf中发送和接收的index
- lock是个互斥锁,目的是为了保证goroutine以先进先出FIFO的方式进入结构体
- recvq和sendq分别是往channel接收或发送数据的goroutine所抽象出来的数据结构,是个双向链表
channel结构体的源码位于/runtime/chan.go中,