go make
是的,make(map[string]bool, 5) 中的 5 是用来 指定 map 的初始容量。但需要注意的是,在 Go 中,map 的容量并不是一个固定大小的限制,而是一个性能优化的提示。
map 容量的作用
-
指定初始容量:
make(map[string]bool, 5)表示创建一个map,并为其预先分配可以存储大约 5 个键值对的空间。- 这个容量是一个性能优化的提示,告诉 Go 运行时大致需要多少空间,从而减少后续动态扩容的次数。
-
动态扩容:
- 如果插入的键值对数量超过初始容量,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 的键值对数量,指定容量可以减少扩 容次数,从而提高性能。