Skip to main content

go make

是的,make(map[string]bool, 5) 中的 5 是用来 指定 map 的初始容量。但需要注意的是,在 Go 中,map 的容量并不是一个固定大小的限制,而是一个性能优化的提示。


map 容量的作用

  1. 指定初始容量

    • make(map[string]bool, 5) 表示创建一个 map,并为其预先分配可以存储大约 5 个键值对的空间。
    • 这个容量是一个性能优化的提示,告诉 Go 运行时大致需要多少空间,从而减少后续动态扩容的次数。
  2. 动态扩容

    • 如果插入的键值对数量超过初始容量,Go 会自动扩容 map,因此 map 的容量不是固定的。
    • 扩容会分配更多的内存,并将现有的数据复制到新的内存区域,这个过程会有一定的性能开销。

为什么指定容量?

  • 性能优化

    • 如果你知道大致会插入多少个键值对,提前指定容量可以减少 map 的动态扩容次数,从而提高性能。
    • 每次扩容都会重新分配内存并复制现有数据,频繁扩容会增加开销。
  • 内存管理

    • 提前分配容量可以让程序更高效地管理内存,避免不必要的内存分配和回收。

示例对比

未指定容量:

orderMap := make(map[string]bool)
orderMap["id"] = true
orderMap["path"] = true
orderMap["api_group"] = true
orderMap["description"] = true
orderMap["method"] = true
  • 这里没有指定容量,Go 会从一个较小的初始容量开始。
  • 随着插入键值对的增加,map 会动态扩容,可能会发生多次内存分配。

指定容量:

orderMap := make(map[string]bool, 5)
orderMap["id"] = true
orderMap["path"] = true
orderMap["api_group"] = true
orderMap["description"] = true
orderMap["method"] = true
  • 这里指定了初始容量为 5,Go 会分配足够的空间来存储 5 个键值对。
  • 如果插入的键值对数量超过 5,仍然会扩容,但在 5 个键值对以内不会发生扩容。

容量的限制

需要注意的是,make(map[string]bool, 5) 中的 5 只是一个 容量提示,并不会限制 map 的大小。map 可以存储任意数量的键值对,只要内存允许。

例如:

m := make(map[string]int, 2)
m["a"] = 1
m["b"] = 2
m["c"] = 3
m["d"] = 4

即使指定了容量为 2,map 仍然可以存储超过 2 个键值对。


总结

  • make(map[string]bool, 5) 中的 5 是 map 的初始容量提示,用于优化性能。
  • 容量不是限制,map 会根据需要动态扩容。
  • 如果你大致知道 map 的键值对数量,指定容量可以减少扩容次数,从而提高性能。