-
Go实时消息推送需用并发安全的广播通道,WebSocket适合双向通信,SSE适合单向通知;HTTPHandler中直接WriteMessage会因非并发安全、阻塞写入和生命周期不匹配导致panic或卡死,应通过带缓冲channel解耦触发与发送。
-
BFF层需组合多服务响应,net/http缺乏上下文取消、中间件等能力;gorilla/mux轻量可控,gin更易错误终止与数据共享;须防goroutine泄漏、安全解码JSON、环境化鉴权及统一错误处理。
-
跨平台构建需正确设置GOOS和GOARCH环境变量,依赖始终按host平台解析,仅build/run时应用目标平台约束;含cgo时须设CGO_ENABLED=0;vendor不区分平台,但模块须跨平台友好;私有模块拉取依赖GOPRIVATE和凭据配置;缓存污染是隐形陷阱,应定期goclean-cache-modcache。
-
必须用sync.Mutex的场景是多个goroutine同时读写同一内存且含写操作;sync.WaitGroup用于等待goroutine结束,需Add、Done、Wait严格配对;二者可安全组合,但职责分离:Mutex管数据访问,WaitGroup管生命周期。
-
Go不支持运行时动态import,必须在编译期通过构建标签(如//go:buildprod)或注册表模式实现环境隔离;推荐用接口+构建标签分离实现,避免环境变量分支和类型断言。
-
unsafe.Pointer转换必须经uintptr中间层,因Go类型系统强制保障安全;需确认内存对齐、生命周期可控,优先用reflect或binary包替代。
-
Go中time.Ticker定时任务需在每次tick内用defer+recover独立捕获panic,避免goroutine崩溃中断;不可将recover放在外层;应区分panic(运行时错误)与error(业务错误)处理,并结合context实现优雅退出。
-
模块缓存默认开启,自动存储解压校验后的模块副本于GOMODCACHE(默认$GOPATH/pkg/mod),gobuild等命令自动复用;需避免CI中误清缓存或错误配置路径。
-
推荐使用oschwald/maxminddb-golang库直接解析GeoLite2-City.mmdb,复用*maxminddb.Reader,定义结构体按需解码字段(如Country.IsoCode、City.Names["en"]),注意可信IP提取、超时控制、原子热更新及日志告警。
-
闭包引用循环变量会导致所有goroutine操作同一变量副本,因forrange复用变量地址;应显式传参切断隐式引用,如gofunc(vT){...}(v)。
-
Go禁止import循环是因编译期需确定初始化顺序和符号可见性,强制接口解耦、职责分离;常用解法包括提取公共接口到第三方包、使用internal隔离共享逻辑、延迟初始化及函数注入依赖。
-
Go结构体字段首字母大写才可导出并被其他包访问;JSON序列化和ORM仅处理大写字段;方法接收者需根据是否修改原值选择指针或值类型;初始化推荐显式命名字段;嵌入结构体是字段提升而非继承;含不可比较类型时结构体不可用==比较。
-
Go并发下载需用goroutine处理任务、channel协调状态,并通过带缓冲channel(如sem:=make(chanstruct{},5))实现并发控制,配合WaitGroup确保worker启动完成后再关闭输入channel。
-
Go中Prototype模式本质是手动实现深拷贝,需为含指针、切片、map等字段的结构体定制Clone()方法,避免浅拷贝错误;gob和json仅适用于特定场景,性能差且有类型限制。
-
defer在return表达式求值后、函数退出前执行,影响命名返回值;需确保绑定正确资源实例,panic时仍执行但无法recover;性能敏感路径应慎用。