-
Go中构造函数必须返回error,因无类机制而用NewXXX函数初始化结构体,需校验参数、避免goroutine、用选项函数传参、立即清理失败资源并提供上下文错误信息。
-
RabbitMQ消费者重复消费是因“至少一次投递”设计所致,需通过Redis+消息ID实现幂等,而非依赖DeliveryTag、MessageId或数据库唯一索引兜底。
-
合理预分配slice容量、减少字符串键拷贝、用slice+索引map替代纯map存储可显著提升Go中map与slice混合使用性能,尤其在频繁插入和遍历场景下。
-
连NATS需显式配置重连、凭证和TLS;JetStream需手动初始化上下文并创建流,设对RetentionPolicy、发布带唯一MsgID、订阅用DeliverAll,多goroutine并发publish会导致乱序。
-
Go中同一文件多个init函数按源码出现顺序执行,不可互相调用;跨包按导入依赖拓扑序执行,main包init最后运行;init内panic导致程序立即终止,不可recover。
-
sync.Map适合读多写少且键生命周期不一的场景,如HTTP上下文缓存;写操作超20%时应优先用sync.RWMutex+map,因其写路径更轻量、无双层结构开销。
-
Go项目README是“安装即用”说明书,须含模块名、用途、快速启动、依赖说明四要素;模块路径首行声明,用途一句话说清问题,快速启动用goinstall命令可复制执行,依赖只列外部服务;示例需带真实输入输出和环境变量写法;标明Go版本、平台、cgo等硬性约束;CI/CD和贡献指南应外链,所有命令须在干净环境手动验证。
-
账号注销需同步清理token、缓存、服务注册及业务数据:token黑名单须持久化并前置校验;关联缓存需主动失效;服务注册须显式注销;业务数据应异步分步清理并留回滚窗口;跨系统需事件广播通知。
-
Go缓存核心是避免重复计算和I/O以降延迟、提吞吐,关键在缓存内容、时效、失效策略及线程安全;分内存、分布式、函数级三类方案,需防击穿、雪崩、穿透,并注意并发安全与资源控制。
-
因为未设置种子,rand默认使用固定种子0,导致每次运行结果相同;应改用rand.New(rand.NewSource(time.Now().UnixNano()))并避免全局状态污染。
-
reflect.Value无公开InterfaceData方法,它仅存在于runtime内部且不可调用;获取底层地址应使用UnsafeAddr()等安全方式,而非非法访问内部实现。
-
Goplugin仅支持Linux/macOS,Windows完全不支持;主程序与插件须同Go版本、构建参数及依赖版本;导出符号须为首字母大写的包级变量或函数,且类型具体;plugin.Open后必须检查Lookup错误。
-
Go测试中不手写if断言因易漏错误信息、格式不统一、定位难,且缺乏t.Helper()和并发支持;标准库刻意不提供断言以鼓励显式检查,社区多用testify/assert(新路径github.com/stretchr/testify/assert),它类型安全、自动t.Helper()、差异友好、错误链展开准确;简单场景用原生t.Errorf需带预期/实际值及上下文;自定义断言必调t.Helper()并注意延迟求值。
-
GoModules采用最小版本选择(MVS)算法确定依赖版本,优先满足所有约束的最小可行版本而非最新版,例如在github.com/A@v1.2.0+、B@v1.3.0+、C@v1.3.5要求下选v1.3.5;goget-u升级次要/补丁版本并触发完整MVS重算,而goget-u=patch仅升补丁版、更安全可控;gomodgraph显示局部依赖边,golist-mall展示全局MVS归一化结果;replace不改变语义约束但易致go.sum校验失败,尤其与majorversionbump共存时会分裂模块
-
Finalizer会显著拖慢GC周期,因对象需多存活一个GC周期且finalizer执行在独立goroutine中,易阻塞回收;应优先用显式关闭、避免对高频对象或栈变量使用,并严禁IO/锁/panic。