在Go语言中,make和new是两个用于创建数据结构的内建函数,它们有不同的用途和行为:
make
- make函数用于创建切片、映射和通道等引用类型的数据结构。
- make函数返回的是初始化后的非零值对象,而不是指向新分配的零值的指针。
- 语法:make(T, args),其中T是类型(切片、映射或通道),args是用于初始化T的参数。
- 例如:
- make([]int, 0, 10):创建一个长度为 0、容量为 10 的整型切片。
- make(map[string]int):创建一个字符串键和整型值的映射。
// init slice
slice := make([]int, 0, 100)
fmt.Println(slice != nil) //true
// init hash map
hash := make(map[int]bool, 10)
fmt.Println(hash != nil) //true
// init channel
ch := make(chan int, 5)
fmt.Println(ch != nil) //true
new
- new函数用于为值类型(如结构体)分配内存,并返回一个指向新分配的零值的指针。
- new函数返回的是指向类型T的指针,该指针指向的值为T的零值。
- 语法:new(T),其中T是类型。
- 例如:
- new(int):分配一个整数类型的内存,并返回指向该整数的指针。
- new(struct{}):分配一个匿名结构体的内存,并返回指向该结构体的指针。
// new is for applying an addr for obj, then return pointer
ptr := new(int64)
*ptr = 4
fmt.Println("value:", *ptr)
// bad case
var ptr2 *int64
*ptr2 = 5 // panic
区别总结:
- make用于引用类型(切片、映射、通道)的初始化,返回初始化后的非零值对象。
- new用于值类型(结构体等)的内存分配,并返回指向新分配零值的指针。
- 在实践中,一般情况下使用make来初始化切片、映射和通道,使用new来分配值类型的内存。