-
zap.String仅构造Field不输出日志,需传给Logger/Sugar方法(如Info)才生效;字段名重复时后写覆盖前写;性能敏感时优先用zap.Int等原生函数避免字符串拼接分配内存。
-
在Golang中设置请求Header需用req.Header.Set或Add方法,且必须在http.DefaultClient.Do前完成;自定义Host头须设req.Host字段;Content-Type需在NewRequest后设置;不可手动设Content-Length或Transfer-Encoding。
-
rate.Limiter的Allow()仅非阻塞试探,失败后继续处理会破坏限流语义;Wait()才是带等待语义的正确入口,适用于必须执行且延迟不敏感的场景。
-
redis-cell是Go分布式限流最省心的选择,因其CL.THROTTLE命令将令牌桶逻辑封装在Redis服务端,Go客户端只需调用一条命令并解析五元组响应,无需处理时间窗口、并发竞争或本地状态。
-
Go的JSON序列化默认通过structtag控制,无需手动反射;仅在需动态字段名、批量检查或构建通用工具时才需主动用反射解析tag。
-
空接口在Go语言中非常实用,其定义是没有方法的接口,任何类型都默认实现它,因此可用作通用类型的容器。①空接口可作为泛型替代方案,在Go1.18之前广泛用于处理多种类型,如fmt.Println函数;②使用时需进行类型断言来提取实际类型,例如用i.(string)或带判断的if语句;③可结合switch语句处理多类型;④反射机制可用于动态获取值、调用方法、修改字段等操作;⑤反射适用于ORM框架、序列化工具等高级场景,但性能低且易出错;⑥建议优先使用类型断言而非反射,并在支持泛型时优先使用泛型以提高类型安全和
-
超时错误本质是context.DeadlineExceeded,须用errors.Is(err,context.DeadlineExceeded)判断;HTTP客户端需分层设Timeout、DialContext和ResponseHeaderTimeout;禁用time.AfterFunc替代上下文超时,数据库操作必须用Context方法。
-
Go中需显式检查指针是否为nil再解引用,因nil指针解引用会直接panic;所有可能为nil的指针(如函数返回、map查找、结构体字段等)都必须判空,常见场景包括json.Unmarshal后、HTTP请求嵌套字段、sql.NullString等。
-
Casbin是Go生态RBAC权限控制的事实标准,支持多模型、不绑定框架,推荐用NewEnforcer快速启动,生产环境切换适配器并手动LoadPolicy,权限检查需透传资源ID、统一拦截返回403,模型文件字段顺序必须严格对齐,敏感操作须叠加二次验证与完整审计日志。
-
Go原生map并发写会panic,因运行时主动检测并中止;sync.Map适用于读多写少、键生命周期长场景,不适用于高频增删或需遍历/有序迭代的场景。
-
gofix是Go1.0到1.12期间用于自动修复过时API调用的工具,但自Go1.13起已被正式弃用,命令不再可用;现需结合golist-u-mall、goget、govet、gopls快速修复及手动验证完成迁移。
-
gomodinit路径须与最终导入路径一致,推荐直接使用GitHub地址如github.com/username/myapp;cmd/存放main包,internal/存放私有代码且不可被外部import;单模块项目无需go.work;Makefile可统一构建流程,需声明.PHONY。
-
errors.New和fmt.Errorf不带堆栈因其不记录调用位置;需用github.com/pkg/errors的errors.New、errors.Errorf或errors.WithStack显式捕获,且必须用%+v才能打印完整堆栈。
-
Go标准库未提供sync.Barrier,推荐用sync.WaitGroup加channel实现可重用屏障:每个goroutine到达时Add(1)并等待channel,最后一个到达者关闭旧channel、重置计数并创建新channel。
-
资产表不应默认加软删除字段;应依业务选硬删除+归档表、status字段或deleted_at,GORM映射须用structtag显式声明,主键、时间字段、关联查询、JSON字段均需按规范设计。