new
new用来初始化变量并分配内存。它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针。
channel, func, map, slice等零值是nil。
func main() {
m := *new(map[int]int) // new返回指针
m[1] = 2
(m)
}
// Output:
panic: assignment to entry in nil map
goroutine 1 [running]:
()
/Users/fenggese/Workspace/golang/mod/test/:11 +0x43
exit status 2
new主要用来获取类型零值的指针。
不推荐这样使用:
package main
import (
"fmt"
)
type User struct {
Name string
Map map[string]int
}
func main() {
u := new(User)
= "wss" // 字符串初始化了
["wss"] = 24 // new不会初始化结构体里的map panic nil
(u)
}
make
即内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型.
func main() {
m := make(map[int]int)
m[1] = 2
(m)
}
// Output:
map[1:2]
只有make 用于可以初始化其内部的数据结构并准备好将要使用的值。
- make和new都是golang用来分配内存的內建函数,且在堆上分配内存,make 即分配内存,也初始化内存。new只是将内存清零,并没有初始化内存。
- make返回的还是引用类型本身;而new返回的是指向类型的指针。
- make只能用来分配及初始化类型为slice,map,channel的数据;new可以分配任意类型的数据。