对于make来说,是Go语言之用来分配内存的函数,使用在slice,map,chan这三种数据类型上面。因为这三种数据类型的特殊性,用来分配和初始化这三种数据类型
make的语法结构非常简单,如下所示:
make(type, len, cap)
使用make常见的一些坑
使用make
注意:slice在make了之后,设置了slice的大小之后,实际上是在slice里面添加了len个空数据,如果在使用append来操作的话,相当于在slice后面添加新的元素,例子如下:
运行结果为:
注:当使用append往slice里面加元素时,时长度大于容量,这时切片就会发生扩容,扩容原理为:
- cap :需要的容量
- :旧切片的容量
- newcap :最终要申请的容量
- doublecap : 的两倍
- 当需要的容量cap大于两倍旧容量doublecap时,我们申请的新容量就是需要的容量 ...当需要的容量帽大于两倍旧容量倍瓣时,我们申请的新容量就是需要的容量
- 当需要的容量cap小于两倍旧容量doublecap时,判断是否旧切片的长度小于1024,如果小于1024,那么newcap=两倍旧cap,直接翻倍 ...当需要的容量小于两倍旧容量Doublecap时,判断是否旧切片的长度小于1024,如果小于1024,那么NewCap=两倍旧,直接翻倍
- 当旧切片的长度>=1024时,会反复地增加25%,直到新容量newcap超过所需要的容量cap。其中newcap > 0是防止int类型溢出,如果溢出那么就直接newcap = cap(需要的容量) 。当旧切片的长度>=1024时,会反复地增加25%,直到新容量newcap超过所需要的容量cap。其中newcap > 0是防止int类型溢出,如果溢出那么就直接newcap = cap(需要的容量)
使用make
注意:map在使用make的时候,就算指定了len,也是不起作用的,这个len起不到限制的作用。如:
结果为: