深入理解Go的Channel (待更新)

Go语言中通过goroutines和channel进行并发的控制。

  • goroutines 提供了独立任务的并发/并行可能
  • channel 提供goroutines间交流、同步的桥梁

理解Channel用法,参考这篇文章 《Go语言Channel的Buffered与Unbuffered》 ,总结channel有一下的特点:

  • 保证goroutines并发安全
  • 提供FIFO(先进先出)的特性
  • 可以在goroutines传送和存储值
  • 可以控制goroutines阻塞和非阻塞(控制执行和停止等待)

所以,我们需要从底层去了解channel的结构,channel 底层是一个hchan的数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type hchan struct {
qcount uint // 队列数据总数
dataqsiz uint // 循环队列的大小
buf unsafe.Pointer // 指向dataqsiz大小的数组元素地址
elemsize uint16
closed uint32
elemtype *_type // element type
sendx uint // 发送索引
recvx uint // 接收索引
recvq waitq // 接收等待的队列
sendq waitq // 发送等待的队列

// lock protects all fields in hchan, as well as several
// fields in sudogs blocked on this channel.
//
// Do not change another G's status while holding this lock
// (in particular, do not ready a G), as this can deadlock
// with stack shrinking.
// 锁
lock mutex
}

先不去关注具体的字段意义,我们从最基本的出发

创建channel

1
ch := make(chan int, 3)