-
在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。
-
net/http默认ServeMux不适合生产路由管理,因其仅支持前缀匹配,不支持路径参数、方法区分、正则约束及中间件机制,导致路由扩展性差、维护困难且易出错。
-
用gotest模拟并发HTTP请求需启动临时服务并用goroutine发请求,关键在于避免泄漏与阻塞:设超时、用WaitGroup等待、禁用log.Fatal;读多写少用RWMutex,高频计数用atomic;GOMAXPROCS不宜过高,应结合pprof优化;Transport需调优连接复用参数以匹配后端能力。
-
net/http默认长连接不适用于高并发弹幕,因HTTP/1.1串行处理、连接状态维护开销大;应改用WebSocket,配合sync.Map管理连接、单连接限流及Origin校验防攻击。
-
sync.Map仅适用于低频写、高频读且键数量少的场景;频繁增删或大数据量会导致内存上涨和GC压力,应改用gcache等支持TTL和淘汰策略的库。