-
gin.Logger()不记录请求体和响应体,因其不消费c.Request.Body也不拦截ResponseWriter;需手动读取Body并包装ResponseWriter才能记录,但要注意内存与安全问题。
-
Go编译共享库必须用-buildmode=c-shared,生成C兼容ABI的.so文件供C调用;导出函数需//export声明、参数返回值限C类型、须在main包中且含至少一个export函数、CGO_ENABLED=1为前提。
-
main.go应放在cmd/子目录下(如cmd/myapp/main.go),根目录仅保留go.mod等元信息;internal/是Go强制的访问边界,用于封装不对外承诺的实现;API层负责错误映射为HTTP状态码,domain层只定义业务语义错误;go.mod的module名应为最终导入路径(如github.com/user/repo)。
-
dockersystemprune不够用,因它无差别删除悬空资源,而实际需按前缀、时间、数量精准清理镜像并跳过被容器引用的;推荐用dockerimages--format'{{json.}}'解析结构化输出,结合容器镜像白名单与ID去重策略安全删除。
-
在Gin中注册自定义验证器需在路由初始化前调用RegisterValidation,函数签名必须为func(flvalidator.FieldLevel)bool,且结构体字段须使用binding标签;支持通过fl.Param()解析带参标签(如phone=CN);调试需用ShouldBind并类型断言ValidationErrors。
-
Go反射校验struct需先判指针再IsNil,非指针用IsZero;自定义validatetag替代json,缓存Type和规则提升性能;递归校验须限深度并严格按Kind分支处理。
-
Go语言可用skip2/go-qrcode库命令行生成二维码:支持中文、纠错等级、自定义尺寸/颜色/透明背景,WriteFile保存PNG/JPEG,WriteColorFile支持前景色与透明底,适合批量生成。
-
Go中函数返回函数需显式写出完整签名,如func()func(int)string,返回的函数字面量必须类型匹配,注意闭包变量生命周期及循环变量复用陷阱。
-
Go的GC压力源于代码而非参数,盲目调GOGC或GOMEMLIMIT仅掩盖问题;应通过gotooltrace、runtime.ReadMemStats和gctrace日志定位真实瓶颈,再结合压测谨慎调整GOGC。
-
excelize是Go语言Excel导出最成熟方案,纯Go实现、支持.xlsx、中文/公式/样式/多Sheet;不可用encoding/csv替代因其不支持格式、类型控制及高级功能;需注意UTF-8编码、列宽设置、字符串类型写入、内存优化(手动GC/流式写入)及并发安全(避免全局样式)。
-
net.ListenTCP在内网直接监听无法被公网访问,因路由器/NAT默认不转发外部请求,仅局域网可达;需配置端口映射或改用反向连接穿透方案。
-
Go语言中包之间不能形成循环导入,主包与子包的双向访问需通过合理分层设计(如提取公共接口或中间包)来规避importcycle,而非依赖目录结构。
-
需手动安装protoc二进制并配置PATH:Windows放%GOPATH%\bin,macOS/Linux放$GOPATH/bin;再用goinstall安装protoc-gen-go和protoc-gen-go-grpc;生成命令须分开指定--go_out和--go-grpc_out,且结构体需嵌入UnimplementedXXXServer。
-
Go在函数调用前通过stackguard0(约8KB安全缓冲区)预判栈是否够用,SP低于它即触发runtime.morestack扩容;若扩至1GB仍不足,则报栈超限错误。
-
WaitGroup必须先Add再go,否则main可能提前退出;Done需每条退出路径都执行,推荐deferwg.Done();不可复用,用完需新建实例;WaitGroup仅用于等待完成,控制退出需配合context或channel。