Golang 中 new
和 make
的区别
在 Go 语言中,new
和 make
都用于分配内存,但它们的用途和返回值有所不同。下面将详细介绍这两者的区别。
1. new
函数
new
是一个内置函数,用于分配内存并返回指向该内存的指针。它的主要用途是为值类型(如结构体、数组等)分配内存。
特点
- 返回值:
new
返回的是指向类型的指针。 - 内存分配:它分配的内存是零值,意味着分配的内存中的字段都是类型的默认值。
- 用法:通常用于分配基本类型的指针或结构体。
示例代码
type Person struct {
Name string
Age int
}
func main() {
p := new(Person) // p 的类型是 *Person
p.Name = "Alice"
p.Age = 30
fmt.Println(p) // 输出:&{Alice 30}
}
2. make
函数
make
是另一个内置函数,用于创建和初始化切片(slice)、映射(map)和通道(channel)。它用于引用类型,并返回一个已初始化的引用类型。
特点
- 返回值:
make
返回的是初始化后的切片、映射或通道,而不是指针。 - 初始化:使用
make
可以为切片、映射或通道分配内存并初始化其内部结构。 - 用法:只能用于切片、映射和通道。
示例代码
func main() {
// 创建一个切片
s := make([]int, 0) // 创建一个空切片
s = append(s, 1, 2, 3)
fmt.Println(s) // 输出:[1 2 3]
// 创建一个映射
m := make(map[string]int) // 创建一个空映射
m["age"] = 30
fmt.Println(m) // 输出:map[age:30]
// 创建一个通道
ch := make(chan int) // 创建一个整型通道
go func() {
ch <- 42
}()
fmt.Println(<-ch) // 输出:42
}
3. 总结
用途:
new
:用于分配内存并返回一个指向值类型的指针,适用于结构体、数组等。make
:用于创建和初始化切片、映射和通道,并返回已初始化的引用类型。
返回值:
new
返回的是指向新分配内存的指针。make
返回的是切片、映射或通道的实例。