go语言中make和new有什么作用以及区别?

在Go语言中,makenew 是两个内置的函数(built-in functions),用于分配内存,但它们之间有显著的区别,主要体现在它们被用于不同类型的对象分配内存。

new

new关键字用于分配内存。更确切地说,它分配了零值初始化的内存空间,并返回指向这个新分配类型的指针。它只用于内建的数据类型(如int、float64、struct等),或者任何类型的指针、切片、映射、通道、函数等类型。但是,new 不会为切片、映射或通道初始化内部数据结构,只会分配一个指向这些类型的零值的指针。

new 函数接受一个类型 Type 作为参数,并返回一个指向该类型新分配零值的指针 *Type。

语法如下:

# 完整语法
var ptr *Type = new(Type)

# 简写
ptr := new(Type)

这里的 Type 是一个类型, 变量 ptr 是一个指向该类型零值内存地址的指针。

实际编程中,通常我们会采用简写形式。

举个栗子🌰,如下所示:

var ptr *int = new(int)
// 现在 ptr 指向一个 int 类型的零值0
*ptr = 2
fmt.Println(*ptr) // 输出: 2

也可以简写成

ptr := new(int)
// 现在 ptr 指向一个 int 类型的零值0
*ptr = 2
fmt.Println(*ptr) // 输出: 2

make

make 函数用于初始化内置的数据结构类型:切片(slice)、映射(map)和通道(channel)。它不仅分配了内存,还返回了初始化(非零)后的(内建的)值。

例如,对于切片,它返回了一个长度和容量都已初始化的切片;对于映射,它返回了一个空的映射(准备好接受键值对);

对于通道,它返回了一个可以进行通信的通道。

如下所示

slice := make([]Type, len, cap)  

map := make(map[KeyType]ValueType)  

channel := make(chan Type, capacity)
  • []Type 表示切片的元素类型。
  • len 是切片的长度。
  • cap 是切片的容量(可选,默认为长度)。
  • KeyType 是映射的键的类型。
  • ValueType 是映射的值的类型。
  • Type 是通道中元素的类型。
  • capacity 是通道的容量(可选,对于无缓冲通道,容量为0)。

区别

  • 用途:new 用于分配任意类型的内存空间,并返回指向该空间的指针,它不会初始化内存;make 用于初始化切片、映射、通道等内建的数据结构类型。
  • 返回值:new 返回的是一个指向类型的指针;make 返回的是初始化后的(内建的)值,比如切片、映射或通道。
  • 零值:new 分配的类型被零值初始化;make 初始化的切片、映射和通道则不是零值,它们有特定的初始状态(比如,切片的长度和容量,空的映射,可以通信的通道)。
  • 适用类型:new 适用于所有类型;make 只适用于切片、映射和通道。
posted @ 2024-08-15 05:23  taadis  阅读(24)  评论(0编辑  收藏  举报