m := make(map[string]int)
m["a"] = 1
type Cfg struct{ Items map[string]string }
c := Cfg{Items: map[string]string{}}
服务处理请求时报空指针 panic,定位到给一个 map 赋值的那一行。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,只声明了 map 变量没有 make 初始化,零值 map 只读可用写入会直接触发运行时 panic,且不会给出编译期提示。
这次卡住的地方就在「Go nil map」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
处理上按这个顺序:声明时用 make 初始化;结构体里的 map 字段在构造函数里初始化;赋值前判空兜底。
改完只确认一件事:同样的请求路径不再 panic,map 能正常读写,监控无异常。