golang中make 和 new 的区别
介绍
new
new
是一个内建函数,用于分配一块内存并返回指向该内存的指针。- 它会为该类型的零值分配内存,并返回指向该类型的指针。
package main
import (
"fmt"
)
// 定义一个结构体
type Person struct {
Name string
Age int
}
func main() {
// 使用 new 内建函数创建一个 *Person 类型的指针,并将其赋值给 p
p := new(Person)
// 因为 new 分配了内存,所以 p 不会是 nil
if p == nil {
fmt.Println("p is nil.")
} else {
fmt.Println("p is not nil.")
}
// 访问结构体字段并设置值
p.Name = "Alice"
p.Age = 30
// 输出结构体字段的值
fmt.Println("Name:", p.Name)
fmt.Println("Age:", p.Age)
}
- 运行结果
make
make
也是一个内建函数,主要用于创建切片、映射和通道等引用类型的数据结构。make
只能用于切片、映射和通道的创建,不适用于其他类型。
package main
import (
"fmt"
)
func main() {
// 使用 make 创建一个切片,长度为 3,容量为 5
slice := make([]int, 3, 5)
// 添加元素到切片中
slice[0] = 1
slice[1] = 2
slice[2] = 3
// 输出切片的长度和容量
fmt.Println("Length of slice:", len(slice))
fmt.Println("Capacity of slice:", cap(slice))
// 使用 make 创建一个映射
m := make(map[string]int)
// 添加键值对到映射中
m["apple"] = 10
m["banana"] = 20
// 输出映射的内容
fmt.Println("Map m:", m)
// 使用 make 创建一个通道
ch := make(chan int)
// 在 goroutine 中发送数据到通道
go func() {
ch <- 42
}()
// 从通道中接收数据
value := <-ch
fmt.Println("Value received from channel:", value)
}
- 运行结果
区别
-
适用类型:
new
适用于任何类型,但返回的是该类型的指针。make
仅适用于切片、映射和通道的创建,返回的是对应引用类型的实例。
-
返回类型:
new
返回的是指向类型的指针。make
返回的是对应引用类型的实例,而不是指针。
-
初始化:
new
分配的内存会被清零,返回的是该类型的零值的指针。make
返回的是被初始化过的引用类型的实例,如切片、映射和通道等。
代码示例
下面是用 Go 语言演示 make
和 new
的区别的代码:
package main
import (
"fmt"
)
func main() {
// 使用 new 分配内存
var p *int
p = new(int)
fmt.Println("*p:", *p) // 输出:*p: 0
// 使用 make 创建切片
slice := make([]int, 5)
fmt.Println("slice:", slice) // 输出:slice: [0 0 0 0 0]
// 使用 make 创建映射
m := make(map[string]int)
m["a"] = 1
fmt.Println("map:", m) // 输出:map: map[a:1]
// 使用 new 创建结构体指针
type Person struct {
Name string
Age int
}
personPtr := new(Person)
fmt.Println("personPtr:", personPtr) // 输出:personPtr: &{ 0}
// 使用 make 创建通道
ch := make(chan int)
fmt.Println("channel:", ch) // 输出:channel: 0xc0000180c0
}
- 运行结果·