数据:使用切片

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值