GoLang关于channel初始化和使用的一些细节
前言
本文主要围绕channel的一些细节上做些总结和分享。主要涉及到两个方面一个是初始化,另外一个就是在数据实际接收和发送的时候的一些细节;这两个离不开golang编译器的协助,所以在了解go源码时,go编译器其实在其中起到了很大的作用。
makechan
make 方法 主要是初始化 切片、map和channel
这里主要说make(chan type)
例如:make(chan int)
通过编译其实解析出来就是 makechan方法 *makechan(t chantype, size int)
所以对应的:
ex.
// 有缓冲
make(chan int,2) => makechan(*chantype{
// int 有关的 chantype内容
}, 2)
//无缓冲
make(chan int) => makechan(*chantype{
// int 有关的 chantype内容
}, 0)
而基于chantype的内容,这里依据上文只放出int类型相关的chanType的内容:
(ps. 其中,elem中的ptrdata是指如果chan类型是个指针类型的管道,那么ptrdata就会有值,是其指针的大小;
这个ptrdata很重要,因为在后面为hchan申请空间的时候会拿来做判断)
在针对这次初始化,makechan中会根据chantype的不同内容来做不同的内存申请,具体可以看makechan方法的其中一段代码:
// src/runtime/chan.go:71
switch {
case mem == 0:
/*这个mem指的是根据elem的size(单类型字节数,这里int是八个字节),乘以size(我们这里size是2)得出的实际要申请的空间,
如果mem为0那肯定是size为0啦,就是无缓冲区那种,那么我们此时只需要申请一个hchan空间大小的连续内存即可*/
// Queue or element size is zero.