Go中new和make的区别对比
Go 中 new
和 make
的区别
在 Go 语言中,new
和 make
都用于分配内存,但它们的使用场景和行为有显著的区别。
1. new
定义
new
是 Go 语言中的一个内置函数,用于分配内存并返回指向该内存的指针。new
分配的内存会被初始化为零值。
作用
- 分配内存:为指定类型分配内存,并返回指向该内存的指针。
- 零值初始化:分配的内存会被初始化为该类型的零值。
使用场景
- 值类型:适用于分配值类型(如
int
、float64
、struct
等)的内存。 - 指针类型:适用于需要返回指针的场景。
2. make
定义
make
是 Go 语言中的一个内置函数,用于分配并初始化切片、映射和通道等引用类型的数据结构。make
返回的是初始化后的引用类型,而不是指针。
作用
- 分配内存:为切片、映射和通道分配内存。
- 初始化数据结构:对分配的内存进行初始化,使其可以直接使用。
使用场景
- 切片:适用于创建和初始化切片。
- 映射:适用于创建和初始化映射。
- 通道:适用于创建和初始化通道。
3. new
和 make
的区别
特性 | new | make |
---|---|---|
适用类型 | 值类型(如 int 、struct 等) | 引用类型(如 slice 、map 、channel 等) |
返回值 | 返回指向分配内存的指针 | 返回初始化后的引用类型 |
初始化 | 分配的内存被初始化为零值 | 分配的内存被初始化为可用的数据结构 |
使用场景 | 适用于需要指针的场景 | 适用于需要初始化引用类型的场景 |
new的使用
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
// 使用 new 分配内存并返回指针
p := new(Person)
fmt.Println(p) // 输出: &{ 0}
// 修改指针指向的值
p.Name = "Alice"
p.Age = 30
fmt.Println(p) // 输出: &{Alice 30}
}
make的使用
package main
import "fmt"
func main() {
// 使用 make 创建切片
slice := make([]int, 5)
fmt.Println(slice) // 输出: [0 0 0 0 0]
// 使用 make 创建映射
m := make(map[string]int)
m["key"] = 42
fmt.Println(m) // 输出: map[key:42]
// 使用 make 创建通道
ch := make(chan int, 1)
ch <- 42
fmt.Println(<-ch) // 输出: 42
}