类型:引用类型 · new 和 make 的区别

本文探讨了Go语言中引用类型(slice、map、channel)的初始化,重点比较了`new`和`make`的区别。`new`仅分配零值内存,返回指向该内存的指针,而`make`用于初始化引用类型,如切片会创建数组并返回其引用,字典会进行哈希桶等的初始化。理解这两种内置函数的不同,有助于更好地掌握Go语言的内存管理和类型初始化。
摘要由CSDN通过智能技术生成

所谓引用类型,是指其内部结构,而非分配于托管堆。

  • slice、map、channel
  • 使用 make 或初始化语句创建实例。
  • 使用 new 无法有效初始化。

从实现角度看,除 slice、interface是结构体外,map、channel、function 都是指针。

引用类型对初学者来说很容易造成误解。在 Go 语言里 slice、map、channel 三种类型称之为引用类型,Java 或者 C# 语言明确区分值类型和引用类型,值类型默认情况下在栈上分配,引用类型在堆上分配,垃圾回收器在托管堆上处理。值类型会涉及到装箱和拆箱。

Go语言的引用类型只是一种行为上的概念,所谓的引用类型更多的时候指的是它引用另外一块或者多块内存,用另外一块或者多块内存来存储或者处理一些相关的数据结构,至于这两块内存分配栈上还是堆上是由编译器决定的。任何时候编译器优先在栈上分配,避免对垃圾回收器造成负担。

所以所谓的引用类型,它内部需要引用另外一块内存,引用另外一块内存也就意味着必须有初始化的操作。切片引用另外一块数组,字典引用哈希桶。

m := make(map[string]int)

使用make初始化,从抽象层面上来看m是一个字典,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值