Golang new和make的区别
在 Go 语言中,new 和 make 都是用来分配内存的,但它们的使用场景和返回值有所不同。以下是它们的主要区别:
1. 适用场景
-
new:-
用于分配内存给任何类型(包括内置类型和自定义类型),并返回一个指向该类型的零值的指针。
-
适用于需要手动管理内存或需要返回指针的场景。
-
-
make:-
用于创建切片(slice)、映射(map)和通道(channel)这三种集合类型。
-
返回的是集合类型的值本身,而不是指针。
-
2. 初始化
-
new:-
分配内存后,初始化为该类型的零值。
-
如果分配成功,返回一个指向分配内存的指针。
-
-
make:-
除了分配内存外,还会对集合类型进行初始化操作:
-
对于切片,初始化为一个空切片(长度为0,容量为0)。
-
对于映射,初始化为一个空映射(不包含任何键值对)。
-
对于通道,初始化为一个未缓冲的通道(默认行为)。
-
-
3. 返回值
-
new:-
返回一个指向分配内存的指针。
-
-
make:-
返回集合类型的值本身。
-
4. 使用示例
-
new:package main import "fmt" func main() { // 使用 new 分配 int 类型的内存 p := new(int) fmt.Println("Value:", *p) // 输出零值:0 fmt.Println("Type:", fmt.TypeOf(p)) // 输出:*int } -
make:package main import "fmt" func main() { // 使用 make 创建一个切片 slice := make([]int, 0) fmt.Println("Slice Length:", len(slice)) // 输出:0 fmt.Println("Slice Type:", fmt.TypeOf(slice)) // 输出:[]int // 使用 make 创建一个映射 mapData := make(map[string]string) fmt.Println("Map Length:", len(mapData)) // 输出:0 fmt.Println("Map Type:", fmt.TypeOf(mapData)) // 输出:map[string]string // 使用 make 创建一个通道 channel := make(chan int) fmt.Println("Channel Type:", fmt.TypeOf(channel)) // 输出:chan int }
总结
-
new:用于分配内存并返回指针,适用于所有类型,返回值为该类型的零值的指针。 -
make:用于创建切片、映射和通道,并返回对应的值类型,同时进行初始化操作。
本文来自博客园,作者:Carver大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/18934900

浙公网安备 33010602011771号