源码文件 runtime/chan.go

go语言学习笔记31  channel源码分析_go

go语言学习笔记31  channel源码分析_channel_02

下面先看下makechan方法,新建channel

go语言学习笔记31  channel源码分析_go_03

1.先校验elem的size,不能大于65536,如果大于,就抛出异常

2.继续校验分配内存不能过大, 不能超过maxAlign

go语言学习笔记31  channel源码分析_channel_04

go语言学习笔记31  channel源码分析_go_05

3.如果channel的缓冲区大小为0,就给hchan分配一个空间

4.如果类型不是指针,那么就给hchan和buf 都分配空间

5.默认情况下,也就是包含指针,会给hchan和buf 都分配空间

6.最后再给channel设置几个属性的值,然后返回channel

+++++++++++++++++++++++++++++++++++++++++++

3.发送数据

发送数据实例:

ch <- 100

发送数据实现函数:

func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool

ep指向要发送数据的首地址

go语言学习笔记31  channel源码分析_go_06

go语言学习笔记31  channel源码分析_channel_07

go语言学习笔记31  channel源码分析_go_08

go语言学习笔记31  channel源码分析_go_09


4.接收数据

接收数据实例:

val := <- ch

接收数据实现函数:

go语言学习笔记31  channel源码分析_channel_10

go语言学习笔记31  channel源码分析_channel_11

go语言学习笔记31  channel源码分析_channel_12

go语言学习笔记31  channel源码分析_go_13


go语言学习笔记31  channel源码分析_channel_14