Go语言中 new 和 make 有什么区别吗?
Go语言中 new 和 make 有什么区别吗?
Go语言中的new
Go语言中的new的作用是初始化一个内置类型的指针
函数是内建函数,函数定义:
func new(Type) *Type
使用 new 函数来分配空间 传递给 new 函数的是一个类型,而不是一个值 返回值是指向这个新分配的地址的指针
Go语言中的Make
Go语言中make 的作用是为 slice, map or chan 的初始化 然后返回引用 make 函数是内 建函数,函数定义:
func make(Type, size IntegerType) Type
make(T, args)函数的目的和 new(T)不同 仅仅用于创建 slice, map, channel 而且返回类型是实例
1 回复
在Go语言中,new
和 make
都是用于内存分配的内置函数,但它们之间有几个关键的区别:
1. 分配的对象类型
-
new(T)
:new
函数用于分配内存。它接受一个类型T
作为参数,分配了零值填充的T
类型的内存空间,并且返回指向这个新分配的内存的指针,即*T
类型的值。它不初始化内存区域,只是将其置零。 -
make(T, args...)
:make
函数专用于内建引用类型的初始化,比如slice
、map
和chan
。它返回初始化(非零)后的(不仅仅是分配)类型的值,而不仅仅是内存地址。make
还可以指定这些类型的初始大小。
2. 返回值
new(T)
返回一个指向T
类型零值的指针(*T
)。make(T, args...)
返回初始化后的T
类型的值(比如[]T
、map[K]V
、chan T
)。
3. 示例代码
package main
import "fmt"
func main() {
// 使用 new
a := new(int)
fmt.Println(*a) // 输出: 0,因为 a 是指向 int 的指针,其值为 0(int 的零值)
// 使用 make
b := make([]int, 5) // 分配了一个有 5 个 int 零值的 slice
fmt.Println(b) // 输出: [0 0 0 0 0],b 是一个初始化的 slice
c := make(map[string]int)
c["one"] = 1
fmt.Println(c) // 输出: map[one:1],c 是一个初始化的 map
d := make(chan bool)
// 可以在 goroutine 中发送和接收数据到 d
}
总结
- 使用
new
当你需要一个指向零值的指针时。 - 使用
make
当你需要初始化一个 slice、map 或 channel 时。make
分配内存并初始化类型。
选择 new
还是 make
取决于你的具体需求,特别是你需要的是指向零值的指针还是一个初始化的复合类型。