golang的make的理解

func make(Type, size IntegerType, cap IntegerType) Type
官方文档对于它的描述是:
内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型

 

重要的注意的问题:

         make(chan []byte, 1024, 2048)和make(chan []byte, 1,2) 有区别吗?
         一个接受1024个[]byte 一个只接受一个[]byte
         这里的1, 1024你要把它理解成消息的个数 而[]byte则是一条消息,而后面的红色的2048和2是容量

理解

         make(chan byte, 1024, 2048)            生成一个channcel对象,  里面包含长度为1024,容量为2048个元素空间, 每个元素的内容是byte

         make(chan []byte, 1024, 2048)          生成一个channcel对象,  里面包含长度为1024,容量为2048个元素空间, 每个元素的内容是[]byte,为slice类型

         make([]byte, 1024, 2048)                  生成一个[]byte对象,一个slice, 里面包含长度为1024,容量为2048个元素空间, 每个元素的内容是byte
        
         make(map[string] []byte, 1024, 2048) 生成一个map对象, 里面包含长度为1024,容量为2048个元素空间, 每个元素的内容是[]byte,为slice类型

         make(map[string] byte, 1024, 2048)    生成一个map对象, 里面包含长度为1024,容量为2048个元素空间, 每个元素的内容是byte

         并不是只能生成2048个元素,具体看下面的描述,比较耗费性能

容量的理解【slice】:  

可动态增减元素是数组切片比数组更为强大的功能。与数组相比,数组切片多了一个存储能
力(capacity)的概念,即元素个数和分配的空间可以是两个不同的值。合理地设置存储能力的
值,可以大幅降低数组切片内部重新分配内存和搬送内存块的频率,从而大大提高程序性能。
假如你明确知道当前创建的数组切片最多可能需要存储的元素个数为50,那么如果你设置的
存储能力小于50,比如20,那么在元素超过20时,底层将会发生至少一次这样的动作——重新分
配一块“够大”的内存,并且需要把内容从原来的内存块复制到新分配的内存块,这会产生比较
明显的开销。给“够大”这两个字加上引号的原因是系统并不知道多大才是够大,所以只是一个
简单的猜测。比如,将原有的内存空间扩大两倍,但两倍并不一定够,所以之前提到的内存重新
分配和内容复制的过程很有可能发生多次,从而明显降低系统的整体性能。但如果你知道最大是
50并且一开始就设置存储能力为50,那么之后就不会发生这样非常耗费CPU的动作,从而达到空
间换时间的效果。


分享到: 微信 更多