go语言之make

时间:2024-10-14 07:29:03

 对于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起不到限制的作用。如:

 

结果为: