前面提到不少go的内建函数,这篇文章学习下如何使用。。
make
先拿 make 开刀,可是一开始我就进入了误区,因为我想先找到他的源码,先是发现 src/builtin/builtin.go 中有 func make(Type, size IntegerType) Type ,可是这里只有两个参数,跟我所了解的 make 是个可变参数不太一样,于是我继续搜索源码包是否还有其它 make 函数原型的声明,但都是徒劳。
于是找度娘,一点信息都没有。还是 google 吧,找了一堆的英文解释,发现两个网站解释还可以,具体看How can the golang make function can take three parameters? 和 golang builtin package。
总的意思是我在源码找到的 builtin.go 只是一个文档,并不是源代码,这些函数是经过特殊处理的,我们不能直接去使用他们。相对于 make 来说,真正的实现是在 runtime 包里面的 makeslice ,具体怎么做到的,那就要研究编译器了,看汇编是如何实现的。
唉,光make的源码就折腾了我一天的时间,脑袋不够用啊,谁借我一颗脑袋使使。
好,到这里,虽然没有找到 make 的具体源码,但是知道 make 是没有直接的具体源码的,死心了。
make 只能为 slice、ma p或 channel 类型分配内存并初始化,同时返回一个有初始值的 slice、map 或 channel 类型引用,不是指针。具体如何使用 make 呢,官网中 https://golang.org/ref/spec#Making_slices_maps_and_channels 有介绍,这里直接贴出来:
Call Type T Result
make(T, n) slice slice of type T with length n and capacity n
make(T, n, m) slice slice of type T with length n and capacity m
make(T) map map of type T
make(T, n) map map of type T with initial space for n elements
make(T) channel unbuff