-
Go的http.Client默认不重试,需手动实现;仅对幂等请求和特定网络错误(如net.OpError)重试,配合指数退避加jitter、最大次数/时间限制,并用backoff库更稳妥。
-
Go切片传参时传递的是包含ptr、len、cap的结构体副本,ptr值被复制但指向同一底层数组;修改元素生效,append等操作需返回新切片才能影响调用方。
-
不能直接将reflect.Value转为reflect.Type,只能通过v.Type()提取其绑定的类型;reflect.Type无法反向生成reflect.Value,需用reflect.New(t).Elem()创建新值。
-
json-iterator更快是因为绕过反射、预编译解析逻辑、支持零拷贝字符串读取,但仅在结构体稳定、字段固定且高频解析场景下优势显著;动态map或深层interface会削弱性能,甚至更慢。
-
Go标准库log不支持日志轮转,需用第三方库:lumberjack适合按大小轮转(如100MB/个,保留7个+28天),file-rotatelogs适合按日期轮转(如daily,带软链和精确时间控制)。
-
环境变量未生效因加载时机过早,应移至main()后或用os.LookupEnv;YAML解析失败多因缩进、字段未导出或缺少yamltag;多环境配置需在ReadInConfig前设绝对路径;热更新须WatchConfig在ReadInConfig后调用并用channel通知变更。
-
包名冲突时必须用点号前缀重命名Go不允许两个同名包直接导入,哪怕路径不同也会报import"xxx"isaprogram,notanimportablepackage或更常见的multiplepackagesnamedxxx。这时候不能删包、不能改源码,唯一解法是显式重命名——而且必须加点号(.)或自定义别名,否则编译器不认。常见场景:你同时用github.com/golang/freetype和golang.org/x/image/font,两者都导出了Font
-
必须传入切片指针并调用Elem()才能获得可设置的reflect.Value;2.通过reflect.Value修改切片元素需确保索引合法且值类型匹配,例如传&slice后使用sliceValue.Index(index).Set(reflect.ValueOf(newValue))完成赋值。
-
pre-push钩子须置于.git/hooks/pre-push,命名无后缀且需chmod+x;Go测试应限定包范围、显式设GOOS/GOARCH、避免重定向stderr;失败时用||exit1传递退出码;团队需文档化安装步骤并依赖CI冗余校验。
-
必须用责任链的场景是需串行、可插拔且可能提前终止或改写请求/响应的环节:①鉴权(失败即返回401);②日志(前后操作);③解密/压缩(替换r.Body);④CORS(顺序敏感)。
-
GOMAXPROCS不能替代WorkerPool,因其仅控制OS线程数(并行度),不限制goroutine总数;WorkerPool通过channel限流实现可控并发,worker数决定实际并发量,缓冲区需按突发流量窗口合理设置。
-
在Go中使用rows.Scan()读取多行SQL数据时,若重复复用同一[]string切片并追加到结果集合中,会导致所有行数据最终指向同一内存地址,从而出现“后一行覆盖前一行”的现象——根本原因在于切片的底层指针特性。
-
Go中声明[N]T类型指针需用varp[N]T,再通过&arr(arr为[N]T变量)赋值;N必须是编译期常量,不能用&arr[0]或[]T替代,解引用后才能操作数组元素。
-
LockOSThread()有时无效的根本原因是调用时机或上下文错误:仅对当前goroutine生效,遇调度点(如I/O、Sleep)即失效;必须在关键操作前立即调用,不可defer;CGO返回后线程可能已解绑;非必须成对调用但错配易致线程泄漏或状态继承;仅三类场景需用:依赖CTLS、信号屏蔽、极高实时轮询;多数情况应优先用sync.Pool等替代方案。
-
gRPC反射服务没启用,grpcurl直接报错"failedtoresolvemethod:notfound"根本原因不是工具问题,而是服务端压根没注册反射服务。Go的grpc.Server默认不开启反射,必须手动加一行注册逻辑。实操建议:在启动gRPC服务的main函数里,调用reflection.Register(server),且必须在server.Serve()之前确保导入了"google.golang.org/grpc/reflection"包,这