Go中声明map必须初始化,var声明的nil map不可读写;常用make()创建空映射或字面量初始化;嵌套map需逐层make;预设容量hint可优化性能;map本身是引用类型,无需指针。

Go语言中声明map变量的三种常见写法
Go里不能直接用map类型字面量声明未初始化的变量,必须显式初始化或使用make。不初始化就访问会panic:"assignment to entry in nil map"。
-
var m map[string]int—— 声明但未初始化,m是nil,此时不能赋值或取值 -
m := make(map[string]int)—— 最常用,创建空映射,可立即读写 -
m := map[string]int{"a": 1, "b": 2}—— 带初始键值对的字面量,自动完成初始化
为什么不能直接用var m map[K]V后就赋值?
因为var只分配了map类型的零值(即nil),而Go的map底层是引用类型,nil map没有底层哈希表结构,任何写操作都会触发运行时panic。
- 错误示例:
var m map[string]bool; m["done"] = true→ panic: assignment to entry in nil map - 正确做法:先
make,再赋值;或用字面量一步到位 - 函数参数接收
map时也同理——传入nil是合法的,但函数内若要写入,必须先检查是否为nil并做make
make(map[K]V)和make(map[K]V, n)的区别
第二个参数是预设容量(hint),不是长度。它影响底层哈希桶的初始分配数量,对性能有实际影响,尤其在大量插入前能减少扩容次数。
-
make(map[int]string):初始容量由运行时决定(通常为0或很小) -
make(map[int]string, 100):提示运行时预先分配约能容纳100个键值对的结构,避免前几次插入频繁扩容 - 注意:这个hint只是建议,Go可能略多或略少分配;且不会限制后续插入数量
嵌套map和指针map的声明容易踩的坑
嵌套map(如map[string]map[int]bool)常被误以为make一次就够了,其实内层map仍需单独初始化;而*map几乎没实用价值,反而增加nil判断复杂度。
立即学习“go语言免费学习笔记(深入)”;
- 错误:
m := make(map[string]map[int]bool); m["a"][1] = true→ panic:无法对nil map赋值(m["a"]是nil) - 正确:
m := make(map[string]map[int]bool); m["a"] = make(map[int]bool); m["a"][1] = true - 避免:
var pm *map[string]int—— 指针指向map本身意义不大,map本身已是引用类型
make或字面量初始化;不确定时,先if m == nil再处理。


















