Go语言中Map是一种无序的键值对集合,创建Map时最常用的两种方式是通过{}字面量初始化和使用make()函数创建,这两种方式在使用场景和底层表现上存在一定差异,开发者需要根据实际需求选择合适的创建方式。

两种创建方式的基础用法
{}字面量创建Map
{}字面量是Go语言提供的语法糖,可以在声明Map的同时直接初始化键值对,也可以创建空Map。这种方式写起来简洁直观,适合已知初始键值对的场景。
package main
import "fmt"
func main() {
// 带初始键值对的字面量创建
m1 := map[string]int{
"a": 1,
"b": 2,
}
fmt.Println(m1) // 输出 map[a:1 b:2]
// 空Map的字面量创建
m2 := map[string]int{}
fmt.Println(m2 == nil) // 输出 false,空Map不是nil
}make()函数创建Map
make()是Go语言的内置函数,专门用于创建切片、Map、通道等引用类型,创建Map时可以指定初始容量,适合需要预先分配空间以减少后续扩容开销的场景。
package main
import "fmt"
func main() {
// 创建初始容量为10的Map
m1 := make(map[string]int, 10)
fmt.Println(len(m1)) // 输出 0,容量不影响长度
fmt.Println(m1 == nil) // 输出 false
// 不指定容量创建Map
m2 := make(map[string]int)
fmt.Println(m2) // 输出 map[]
}两种方式的异同点对比
相同点
- 创建的都是非nil的Map,都可以直接进行键值对的赋值操作,不会触发panic。
- 都支持后续动态添加、删除、修改键值对,底层都是基于哈希表实现,操作的时间复杂度都是O(1)平均情况。
- 都可以被垃圾回收机制正常回收,只要没有额外的引用指向该Map。
不同点
| 对比维度 | {}字面量 | make()函数 |
|---|---|---|
| 初始键值对 | 支持直接初始化键值对,语法更简洁 | 无法直接初始化键值对,需要先创建再赋值 |
| 容量设置 | 无法指定初始容量,默认使用运行时计算的最小容量 | 可以指定初始容量,减少后续插入时的扩容次数 |
| 空Map表现 | 空字面量map[string]int{}是非nil的空Map | make(map[string]int)也是非nil的空Map,表现一致 |
| 适用场景 | 已知初始键值对,或不需要预分配容量的场景 | 需要预分配容量,或键数量可以预估的场景 |
选择建议
在实际开发中可以按照以下原则选择创建方式:
- 如果已经明确知道Map的初始键值对,优先使用{}字面量,代码更简洁易懂,例如配置项映射、固定的枚举映射等场景。
- 如果Map的键数量可以预估,且后续会插入大量键值对,优先使用make()函数并指定合理的初始容量,减少哈希表扩容带来的性能开销,例如批量处理数据时构建的临时Map。
- 如果只是需要一个空的Map后续再动态赋值,两种方式都可以,没有显著的性能差异,可以根据团队代码规范统一选择。
注意事项
需要注意区分Map的零值和字面量创建的空Map,未初始化的Map零值是nil,直接对nil Map插入键值对会触发panic,而两种方式创建的Map都是非nil的,可以安全操作。
package main
import "fmt"
func main() {
var m map[string]int // 零值nil
// m["a"] = 1 // 这行会触发panic: assignment to entry in nil map
fmt.Println(m == nil) // 输出 true
m1 := map[string]int{}
m1["a"] = 1 // 正常执行
fmt.Println(m1) // 输出 map[a:1]
}提示:Map的初始容量只是一个提示,运行时会根据实际情况调整,指定容量不代表Map的最大长度,只是减少扩容次数。
GoMapmake_function字面量创建修改时间:2026-06-04 16:33:11