make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。make只能创建slice、map和channel,并且返回一个有初始值(非零)的T类型(引用),而不是*T
本质来讲,导致这三个内建类型有所不同的原因是:引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为nil。对于slice、map和channel来说,make初始化了内部的数据结构,填充适当的值。make返回初始化后的(非零)值。
var map1 map[string]string = make(map[string]string)
fmt.Println(map1)
fmt.Println(map1 == nil)
//个人尝试做一些操作,发现什么都做不了
var map2 *map[string]string = new(map[string]string)
var map3 map[string]string = map[string]string{"555":"444"}
fmt.Println(map2)
fmt.Println(map2 == nil)
fmt.Println(*map2)
fmt.Println(*map2 == nil)
// var map1 map[string]string
map1["aaa"] = "AAA"
map1["bbb"] = "BBB"
map1["ccc"] = "CCC"
fmt.Println(map1)
fmt.Println(map1["5"])
fmt.Println(map3["555"])
fmt.Println(len(map1))
//输出:
/*
map[]
false
&map[]
false
map[]
true
map[ccc:CCC aaa:AAA bbb:BBB]
444
3
*/