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 }
- 运行结果·