05 用new或make创建引用类型的差别
在不同语言里,对分配内存不同做法,Go语言分为两种方式,一种是new,一种是make,这两种方式有很大的差别,我们new一个类型,比如new(int)
的时候怎么分配内存呢,它计算出类型的长度,int是8bit,然后在堆上或者也可能在栈上分配空间然后返回这个指针,不管是什么类型都是一样的。
new一个数组new([8]byte)
计算类型的长度8bit,分配8字节内存空间,指针返回;
new一个切片new([]byte)
计算类型长度(ptr(8bit)+len(8bit)+cap(8bit)),三个字段组成的24字节内存空间,指针返回。
new并不会把复合结构完整的去创建,它只计算出当前这个类型究竟需要占用多大的内存空间。很显然用new创建切片,这个切片本身是没有办法工作的,其中指针ptr没有指向任何底层的数组,因为切片是用来管理数组的,如果被管理的对象不存在的话,那这个管理对象本身没有任何意义。
Go语言对于一些复合结构使用了一个语法糖,表面上看上去make函数,但实际上这个make函数是一个语法糖结构,当我们去make([]byte,0,8)
时候,首先会创建切片本身头对象(ptr,len,cap),然后创建底层数组,数组容量是8个,然后把指针指向开始位置,len设为0,cap设为8。很显然make操作就包含了几个步骤:
- 第一步创建切片本身
- 第二步分配底层数组
- 第三步初始化切片属性
整个make