-
JSON字段名需用jsontag重命名且字段必须首字母大写导出;omitempty对nil指针生效但对空字符串无效;大小写不一致时需预处理或自定义UnmarshalJSON;json.RawMessage可延迟解析避免冲突。
-
使用go.mod明确指定版本可锁定Golang依赖,如requireexample.com/some/modulev1.2.3;通过gogetexample/module@v1.2.3精确拉取并更新版本;必要时用replace指向本地路径调试;避免意外升级需遵循最小版本选择策略,定期用golist-mall和gomodgraph检查依赖;启用GOPROXY和GOSUMDB确保模块来源安全可靠,从而实现构建可重现与部署稳定性。
-
单机golang.org/x/time/rate.Limiter不能用于分布式场景,因其状态仅存于内存,多实例间不共享,导致实际QPS远超设定值;必须用Redis等外部存储配合Lua原子脚本实现分布式令牌桶。
-
Go并发计数器该用atomic.AddInt64还是sync.Mutex绝大多数场景下,优先用atomic.AddInt64——它快、轻量、无锁,且能正确保证计数器的原子性。只有当你需要「复合操作」(比如“读+判+写”)或计数器只是更大临界区的一部分时,才考虑sync.Mutex。哪些操作不能靠atomic完成,必须上Mutexatomic只保证单个操作的原子性,不提供「多步逻辑的原子封装」。一旦涉及条件判断或依赖当前值做决策,atomic就力不从心了。「如果计数器小
-
go.bug.st/serial.v1是最省心的串口库:纯Go实现、无cgo依赖、跨平台开箱即用;需分平台排查设备名与权限,Read/Write必须设超时和终止符,并发读写须加锁或分goroutine。
-
json.MarshalIndent生成带缩进的JSON,需传入前缀和分隔符,推荐用空格而非制表符;仅导出字段参与序列化,omitempty会剔除零值,影响结构对齐。
-
Go命令行工具不走代理的常见原因是NO_PROXY未正确配置,需全大写、逗号分隔且不含通配符;Go1.19+支持CIDR,私有HTTP仓库还需设置GOINSECURE。
-
HorizontalPodAutoscalerYAML不起作用是因为集群未部署对应指标适配器,且需满足:使用autoscaling/v2+API、正确配置prometheus-adapter、Go服务暴露/metrics并带namespace/pod标签、HPA中用targetAverageValue和rate()聚合counter指标。
-
游戏服务器不用net/http因HTTP协议不适合高频实时通信,应直接用net.Conn或WebSocket;需精细控制连接生命周期、避免goroutine泄漏,并用sync.Map+sync.Pool优化性能。
-
应优先使用gomail而非原生net/smtp:它轻量、不依赖cgo、自动处理STARTTLS和AUTH降级、生成合规MIME/Message-ID,并简化HTML正文与附件添加。
-
最轻量角色-权限映射用map[string][]string实现,需加sync.RWMutex保障并发安全,权限字符串统一小写冒号分隔;多角色应从JWT的roles数组提取并合并权限;复杂场景推荐Casbin,注意初始化加载策略、校验签名及token失效机制。
-
Go项目数据库迁移审批必须嵌入CI/CD流程:PR强制填写reason/impact/rollback_plan,流水线执行migrateplan预览SQL并触发人工审批,生产环境仅允许带签名工单ID的migrateup,禁用直接down,所有SQL须人工审查语义风险。
-
c.Query()返回字符串,参数不存在或为空时均返回"",无法区分未传与显式传空;需用c.GetQuery()判断是否存在,类型转换须手动处理错误。
-
最直接安全的Base64编码方式是base64.StdEncoding.EncodeToString(),它将[]byte转为标准Base64字符串(含+/=);解码需处理*base64.CorruptInputError,URL安全场景应使用URLEncoding或RawURLEncoding。
-
&v总是指向循环变量副本的栈地址,而非原切片元素;修改*p不影响原数据,因v是独立局部变量,生命周期仅限当轮迭代。