我们以一个new一个map和make一个map为例来讲解下:
make map:
package main
import (
"fmt"
)
func main() {
umap := make(map[string]string)
fmt.Println(umap)
}
找到map源码,找到makemap方法
可以看到,执行make map的时候,底层会调用makemap方法(slice和chan也有各自的make方法)
也就是说,make是用来初始化go中map、slice、chan的特有方法,它既会给对象分配内存,也会初始化对象。但是new不会,new只会单纯给对象分配内存。
再举个例子:
package main
import "fmt"
type MyMap struct {
SingleMap map[string]string
Uname string
Uage int
}
func main() {
m := *new(MyMap)
fmt.Println("uname:", m.Uage)
m.SingleMap["uname"] = "lyl"
fmt.Println(m)
}
我自定义了一个MyMap,通过new初始化后,往这个map的SingleMap里添加元素的时候报错了,因为SingleMap还没有初始化。