直接回答:var m map[string]int 声明未初始化得到 nil map。对 nil map:读安全,返回零值(comma ok 时 ok 为 false);delete 是空操作;range 零次迭代;len 为 0。唯一危险的是写——m[k] = v 直接 panic:assignment to entry in nil map。这和 nil slice 不同:nil slice 可以 append(函数会分配新底层数组),而 map 赋值不是函数调用,没法替你初始化。
展开解析:map 是引用类型,nil map 的 hmap 头指针为空,写入需定位桶时发现头部为空即 panic;读路径对空指针做了特判。实践建议:用 map 前先 make 或字面量初始化;「查不到」返回 nil map 还是空 map 要想清楚——两者 len 都是 0,但 JSON 序列化不同(null 对 {}),前端逻辑可能分叉;惰性初始化先判断 if m == nil { m = make(...) },并发场景再加锁或 sync.Once。
追问方向:为什么 map 并发写是 fatal 而非可 recover 的 panic?nil map 与空 map 的序列化差异如何利用?(约 576 字)