-
RedisPubSub容易丢消息,因其非线程安全、默认缓冲区仅10条、无超时控制易卡死goroutine、重连不自动恢复订阅、无ACK机制且panic或慢处理会导致缓冲区溢出。
-
应使用每条消息独立的time.Timer而非全局time.Ticker实现重发,绑定seqID和retryCount状态,收到ACK即stop并清除,失败后reset支持指数退避。
-
Go中interface{}值的相等性比较依赖于其底层动态类型是否可比较;若类型不可比较(如含slice、map、func或包含此类字段的struct),直接使用==会导致编译错误,需改用reflect.DeepEqual或自定义逻辑。
-
Go不支持循环导入,编译时报错“importcyclenotallowed”,需通过接口抽象、依赖倒置、分层设计、回调注入和包结构重构来解耦,核心是明确模块边界与职责。
-
Go1.23+中range只能遍历形如func(yieldfunc(T)bool)的函数,标准库提供iter.Seq[T]别名;需在yield内按需执行DB查询,避免提前全量加载,并显式管理资源生命周期。
-
Go语言单元测试中,验证错误处理需从基础错误返回、类型匹配、外部依赖模拟、错误链检查等层面入手,结合errors.Is和errors.As实现精准断言,通过接口抽象与mock技术模拟哨兵错误、自定义错误及包装错误,确保代码在各类错误场景下的正确响应与韧性。
-
热更新必须采用双缓冲+atomic.Value原子切换:维护新旧缓存指针,加载完成后再原子替换,确保读写不中断、旧数据安全延迟释放。
-
net/http长连接性能问题源于内核TCP栈与Goruntime隐式耦合;fasthttp吞吐下降40%是因workerPool模型与长连接场景错配;gnet“无调度器”引发三重内核级陷阱;务实优化需调整IdleTimeout、LockOSThread及MaxBytesReader。
-
Go中指针本身不提供并发安全,真正保障安全的是sync包中的同步机制;指针仅用于共享数据结构地址,需配合Mutex、RWMutex或Atomic等正确同步访问。
-
应锁“绑定凭证+动作类型”组合而非uuid,如"bind:sms:13800138000",配合服务端token校验与DB幂等检查,或用RedisLua原子脚本实现高效防重,但下游仍需自行幂等校验。
-
Done信号非即时广播而是逐层递归触发,延迟随嵌套深度线性增长;cancelCtx.children遍历是性能瓶颈,每次父cancel()调用均需遍历childrenmap并对每个子cancelCtx递归调用cancel(),属深度优先递归而非并发通知。
-
OpenTelemetrySDK默认采样策略在TracerProvider初始化时固定,后续修改无效;必须在创建trace.NewTracerProvider时传入采样器,且高QPS接口需组合ParentBased与自定义采样器实现差异化采样。
-
不能直接用net/smtp封装通用发送函数,因不同邮件后端(如SendGrid、Postfix)认证方式、API路径、请求格式、错误结构互不兼容;net/smtp仅支持SMTP协议,对HTTP类API无效;强行统一会导致参数爆炸、类型难收敛、调用方需预知后端类型。
-
Go1.18起原生支持覆盖率引导的模糊测试,需写合规fuzz函数(单参数*testing.F)、提供有效种子语料、在Fuzz闭包中做断言并合理约束运行时长与资源。
-
Go测试代码不会被编译进生产二进制,因gobuild默认完全忽略*_test.go文件;测试文件须与被测代码同包同目录才能访问私有标识符;应使用-build标签、-run参数和testing.Short()控制执行,数据文件放testdata子目录并注意跨平台换行符。