-
Go服务需显式调用http.Server.Shutdown()并传入带超时的context实现优雅停机;ListenAndServe()必须在goroutine中运行,配合signal.Notify监听SIGTERM,Shutdown前须手动清理gRPC、DB等资源。
-
sonar-scanner扫描Go项目需四点齐备:手动创建sonar-project.properties并设sonar.language=go、正确生成coverage.json覆盖率报告、标准化sonar.projectKey(/→:、.→-)、确保SonarQube≥9.9与sonar-go-plugin≥4.4版本匹配。
-
Go语言处理长连接需协同TCP层心跳、应用层心跳、连接池管理与优雅关闭:启用SetKeepAlive并设周期,加PING/PONG应用心跳,用健康连接池自动重建,读写绑定context并响应信号优雅关闭。
-
要发布Golang私有模块并成功引用,主要步骤是:1.将模块代码推送到私有仓库;2.打版本标签并推送远程;3.在客户端设置GOPRIVATE环境变量;4.配置SSH或HTTPS认证。GOPRIVATE通过绕过公共代理和校验,解决私有模块无法访问、认证失败及隐私泄露问题,其支持通配符匹配路径,需根据实际需求配置单个或多个路径前缀,并可在开发机、CI/CD中持久化设置。此外,还需关注GONOPROXY、GONOSUMDB及认证方式,以确保私有模块正确拉取。
-
Go网络数据序列化应按场景选择:JSON适用于跨语言、可读性要求高的场景;binary(如gob)适用于Go同构系统高性能通信;protobuf等适合跨语言且需向后兼容的高吞吐场景。
-
mongo.Connect()默认无超时,需用context.WithTimeout控制;FindOne()查无结果返回nil但err为nil;primitive.M不可替换map[string]interface{};InsertMany()不填充原结构体_id;连接池应全局复用。
-
MQTTQoS0/1/2由客户端库(如paho.mqtt.golang)在Publish()调用时通过qos参数指定并自动实现语义保障;qos必须为0、1或2,传其他值将静默失败;服务端可降级QoS且不通知客户端;QoS2易因Broker不支持或网络问题导致token.Wait()卡住。
-
微信签名验证需手动排序拼接并SHA1,XML解析须处理CDATA和字段类型,access_token需缓存、预刷新与串行更新,code须5分钟内单次使用并幂等处理。
-
runtime.GC()不该被频繁调用,因其破坏Go自适应GC节奏、激增STW次数、干扰内存学习;应优先调优GOGC、复用对象、预分配切片,并通过业务指标验证优化效果。
-
Go服务需手动监听SIGINT/SIGTERM并调用http.Server.Shutdown()配合带超时的context,否则进程猝死导致请求中断、日志截断、事务不完整;Shutdown()须用WithTimeout上下文,忽略ErrServerClosed,后台goroutine须统一监听ctx.Done()退出。
-
应使用FunctionalOptions模式而非结构体字面量传参,因其避免硬编码、支持可选配置、防止序列化污染、统一管理默认值、保障类型安全且组合灵活;Option应定义为函数类型别名typeOptionfunc(*Config),各WithXXX函数返回闭包,校验逻辑应延后至构建后执行。
-
errgroup.Group比sync.WaitGroup更适合错误传播,因其内置首次错误即返回机制,支持自动终止未启动任务,并需配合context实现可取消并发;零值不可用,须用new或WithContext初始化;子任务须显式返回error。
-
“cannotdeterminemodulepath”错误是因为Go无法推断合法模块路径,需显式执行gomodinitgithub.com/user/repo(不能省略路径),且项目不能位于$GOPATH/src内。
-
Go接口是隐式实现的契约,只检查方法签名是否完全匹配;interface{}与any等价但语义不同;嵌入接口是方法集合而非继承;接口变量nil不等于底层值nil。
-
不安全;Go原生map非线程安全,并发读写会panic,须用sync.RWMutex或sync.Map保护,且密码必须哈希存储、注册需原子性校验、登录须用bcrypt.CompareHashAndPassword验证。