为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中 make(map[type1]type2) 的内部实现是什么?

Golang 中 make(map[type1]type2) 的内部实现是什么?

Go
慕沐林林 2023-07-31 15:53:46
Golang 是一种原生编程语言。所以比动态语言(如 python 和 ruby)有很多限制。当将 Maps 初始化为 时m := make(Map[string]int),该映射m似乎能够包含无穷多个键值。但是,当使用地图文字或使用 cap 初始化地图时,地图不能包含无穷多个键值。有文章说,没有上限的 make 会为此映射分配大量内存。但这不是选项,因为如果这是真的,那么初始化单个映射时将会消耗巨大的内存。但无论我使用什么计算机硬件监控工具,我的程序运行之前和期间的内存没有任何区别。func main(){    Hello()}func Hello(){    m := make(SizeRecord)    l := 10000000    for i := 0; i < l; i++ {        m[strconv.Itoa(i)] = Size{float64(rand.Intn(100)), float64(rand.Intn(100)), float64(rand.Intn(100))}    }    fmt.Println(m)}该程序需要一段时间才能执行。在没有上限的情况下使用替代实现来表示地图,并使用统一的接口来访问地图,就像其他具有有限功能的地图一样容量。如果我的理解是错误的,有人可以告诉我什么是正确的吗?如果我是对的,为什么 golang 不以这种方式实现所有映射?
查看完整描述

1 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

您对地图工作原理的理解不正确。规范说:

Blockquote 初始容量不限制其大小:映射会增长以容纳其中存储的项目数量,但 nil 映射除外。nil 映射相当于空映射,只不过不能添加任何元素。

因此,容量只是一个提示,它会影响地图的初始大小。地图可以根据需要增长。对于给定容量的地图没有单独的实现。



查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信