Go代码需避开命名、切片初始化、JSON标签、错误处理四大雷区:包名禁用关键字且须小写;var声明nil切片优于make;JSON字段须大写+正确标签;错误不可忽略或裸panic。

Go 代码写得“能跑”不难,但写得“可维护、易协作、少踩坑”需要主动避开一批高频雷区。命名和排版看似琐碎,实则直接影响编译通过、静态检查、团队理解甚至 runtime 行为。
包名用错关键字或驼峰,import 后整个包失效
包名不能是 Go 预声明标识符,比如 nil、type、map、make。一旦写了 package map,后续所有地方写 map[string]int 都会报错:map is not a type。
- 包名必须全小写,不加下划线或中划线;目录名建议与包名一致
- 禁止用
util、common、api这类泛化名称——它会让调用方写成util.User,语义模糊且易冲突 - 包内类型名不要带包名前缀,比如
chubby.ChubbyFile应该简化为chubby.File
var t []int 和 t := make([]int, 0) 的内存行为差异
二者都声明切片,但底层是否分配底层数组、是否触发 GC 可能不同。前者是零值声明,t == nil;后者创建了长度为 0、容量为 0 的非 nil 切片,已分配 header 结构。
- 如果只是临时声明、后续再
append,优先用var t []int - 如果明确需要指定
cap(比如预估容量避免多次扩容),才用make([]int, 0, 1024) - 别用
new([]int)—— 它返回的是*[]int,不是你想要的切片类型
JSON 字段标签写错导致序列化失败或字段丢失
结构体字段没加 json 标签,或标签格式错误,会导致 json.Marshal 输出空对象或忽略字段。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
- 首字母小写的字段默认不导出,
json包无法访问,必须大写开头 + 标签控制别名:Name string `json:"name"` -
omitempty不是万能开关:它只对零值生效(""、0、false、nil),但不会跳过非零空字符串或显式赋值的 0 - 整数转字符串需加
string选项:Age int `json:"age,string"`,否则"age": "25"会反序列化失败
函数参数和变量命名含糊,err != nil 检查后直接 panic
命名模糊(如 a、b、data)让 reviewer 无法快速判断意图;而 if err != nil { panic(err) } 在非顶层函数里属于典型错误传播缺失。
- 参数名要表意:用
srcPath而非s,用timeout而非t - 错误必须显式处理:返回上层、记录日志、或转换为业务错误,而不是裸
panic - 别用
_ = xxx忽略 error —— 它可能掩盖连接超时、磁盘满、权限拒绝等关键问题
最常被忽略的是:包名冲突和 JSON 标签的组合效应——它们不会在单文件测试中暴露,往往到集成阶段才爆 undefined: map 或空响应,排查成本远高于写的时候多敲几个字母。

















