返回
解读Go语言中make和new的区别,探索内存分配的奥秘
前端
2024-01-22 04:56:33
在Go语言中,make和new都是内置函数,用于分配内存。但它们在使用方式和分配内存的机制上存在着一些关键区别。
1. make与new的语法
make
func make(t Type, size ...IntegerType) Type
new
func new(Type) *Type
2. make与new的返回值
make
make返回分配好内存的切片、通道、map。
new
new返回分配好内存的类型指针。
3. make与new的适用场景
make
- 创建切片、通道、map。
- 其中切片,如果不用make分配内存,而是用append在空切片上添加数据,append会先创建底层数组,再追加数据到数组中。
- 通道,如果不用make分配内存,直接使用nil,通道为非阻塞,数据写入通道会失败。
- map,如果不用make分配内存,直接使用nil,使用时map会先创建底层数组,再哈希存储数据。
new
- 创建结构体、接口等类型的指针变量。
- 使用new分配的内存变量必须使用*操作符取值才能正常使用。
- 比如创建一个结构体:
type Student struct {
Name string
Age int
}
func main() {
// 使用new分配内存
s := new(Student)
// 使用*取值
s.Name = "John"
s.Age = 20
fmt.Println(s)
}
输出:
&{John 20}
4. make与new的性能
一般情况下,make的性能优于new。这是因为make在分配内存时会对内存进行初始化,而new不会。因此,make分配的内存可以立即使用,而new分配的内存需要先进行初始化才能使用。
5. make与new的总结
特性 | make | new |
---|---|---|
语法 | func make(t Type, size ...IntegerType) Type | func new(Type) *Type |
返回值 | 分配好内存的切片、通道、map | 分配好内存的类型指针 |
适用场景 | 创建切片、通道、map | 创建结构体、接口等类型的指针变量 |
性能 | 优于new | 劣于make |
内存初始化 | 会 | 不会 |
总的来说,make和new都是Go语言中分配内存的内置函数,但它们在使用方式、返回值、适用场景、性能和内存初始化方面存在着一些关键区别。在实际开发中,您需要根据具体情况选择使用make还是new来分配内存。