new和make
new 和 make 是 Go 语言中创建数据结构的两种方式,但它们的用途和工作方式有很大不同。以下是两者的主要区别:
# new
用途:new 是用于创建某个类型的零值指针。它分配内存并返回一个指向该类型的新分配内存的指针。 适用类型:任何类型,包括基本类型、结构体、数组、切片、映射等。 返回值:返回的是一个指向该类型的指针。 示例:
package main
import "fmt"
func main() {
// 使用 new 创建一个int类型的零值指针
p := new(int)
fmt.Println(*p) // 输出:0(整数的零值)
// 将其值修改为42
*p = 42
fmt.Println(*p) // 输出:42
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
在这个示例中,new(int) 创建了一个指向 int 类型的指针,并且它的初始值为零值(0)。
# make
用途:make 是用于初始化切片、映射和通道,这些类型的零值是 nil,不能直接使用。make 不返回指针,而是返回一个初始化好的值。 适用类型:只适用于切片、映射和通道。 返回值:返回的是初始化好的值,而不是指向该值的指针。
总结 使用 new 创建任意类型的指针,并返回一个指向该类型的零值指针。 使用 make 初始化切片、映射和通道,并返回一个已初始化的(非 nil)值。 对于使用哪一个,简单可以记住:
使用 new 时,关注指针和原始值的分配。 使用 make 时,关注初始化和使用特定的数据结构。
make与new对堆栈分配处理是相同的,编译器优先进行逃逸分析,逃逸的才分配到堆上
编辑 (opens new window)
上次更新: 2024/09/13, 11:59:12