如果 map 不是引用变量,那是什么?

『就要学习 Go 语言』系列 -- 第 32 篇分享好文

之前也翻译过两篇 Dave 大神的文章,可以看这里《

他是 Go 语言的开源贡献者和项目成员,技术界中受人尊敬的代言人,在软件设计、性能和 Go 语言等各种主题上发表演讲。在油管上可以看到很多他演讲的视频,反正就是很牛逼!

博客地址:https://dave.cheney.net/

原文如下:


不急,先看答案:

map 是指向 runtime.hmap 结构体的指针。

如果你不满意这种解释,接着往下看。

map 值的类型是什么?

当你写下如下代码

1m := make(map[int]int)

编译器会自动去调用 runtime.makemap,看下方法签名:

1// makemap implements a Go map creation make(map[k]v, hint)
2// If the compiler has determined that the map or the first bucket
3// can be created on the stack, h and/or bucket may be non-nil.
4// If h != nil, the map can be created directly in h.
5// If bucket != nil, bucket can be used as the first bucket.
6
7func makemap(t *maptype, hint int64, h *hmap, bucket unsafe.Pointer) *hmap

正如你看到的那样,从 runtime.makemap 返回的值的类型是指向 runtime.hmap 结构体的指针。从平常的代码中看不出这一点,但我们可以确认的是 map 值的大小与 uintptr 相同。

 1package main
 2
 3import (
 4    "fmt"
 5    "unsafe"
 6)
 7
 8func main() {
 9    var m map[int]int
10    var p uintptr
11    fmt.Println(unsafe.Sizeof(m), unsafe.Sizeof(p)) // 8 8 (linux/amd64)
12}

如果 map 是指针,那是不是应该这样表示 *map[key]value ?

这是个好问题,如果 map 是指针的话,为什么表达式 make(map[int]int) 返回的是类型为 map[int]int 的值,不是应该返回 *map[int]int 吗?

 
  

可以说,将类型从 *map[int]int 重命名为 map[int]int 虽然有点混乱,因为类型看起来不像指针,但相较于指针值不能解引用,混乱程度会好点。

总结

map 与 channel 一样,都是 runtime 类型的指针, 这与 slice 不同。正如你在上面看到的那样,map 是指向 runtime.hmap 结构体的指针。

map 与 Go 语言中其他类型的指针值具有相同的指针语义,除了编译器会将 map 重写为对 runtime/map.go 函数的调用外,并没有什么任何特殊之处。


推荐阅读:

如果我的文章对你有所帮助,点赞、转发都是一种支持!

640?

640?wx_fmt=jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seekload

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值