new一个map类型的指针为什么不可以

来源:8-4 图解new函数的执行过程

kiwi_0008

2021-10-12

老师,您好,如果我new的时候new了一个map类型的指针,那么为什么这些代码不能直接使用呢,可以讲解下map这种类型和int这些类型的new有什么区别吗,实验的代码如下:
mapptr := new(map[string]string)
(*mapptr)[“a”] = "b"
报错:panic: assignment to entry in nil map

写回答

1回答

bobby

2021-10-13

map比较特殊,需要专门说明一下,map的本质是一个hmap结构体,但是当我们 var m map[string]string实例化的时候这是一个hmap的指针,注意这里是指针不是结构体,这个和slice的本质不一样,slice的本质是一个结构体本身,因为指针变量的初始值是nil,所以我们var m map[string]string一个变量必须要使用 make去初始化,slice不用初始化可以使用,因为slice本质是一个结构体而不是指针,mapptr := new(map[string]string)这个意思是给我初始化一个变量,这个变量中放的是一个指向map的指针,但是这个map的内存你没有初始化啊,所以(*mapptr)拿到的是一个变量,这个变量中放的是一个可以指向hmap结构体的指针,但是这个hmap你没有初始化,所以就出现了这个问题,所以记住: map只能使用make初始化


1
1
kiwi_0008
好的,多谢老师的解答
2021-10-13
共1条回复

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

508 学习 · 530 问题

查看课程