-
交叉编译前需确认GOOS/GOARCH组合是否被当前Go版本支持,如windows/arm64自1.21起支持,ios则完全不支持;启用CGO_ENABLED=0可实现静态编译,但会限制cgo依赖及部分标准包功能。
-
关键不是“要不要缓存”,而是“缓存什么、什么时候失效、谁来清理”;用sync.Map+文件修改时间做轻量级缓存适合中小规模Web服务。
-
Go服务无需修改代码即可被Istio管理,关键在于Kubernetes配置:命名空间启用istio-injection、Pod标签含app键、Service端口命名规范、使用Service名而非IP调用;VirtualService路由需匹配Host头与Gateway;金丝雀发布依赖DestinationRule子集与VirtualService权重;gRPC需启用HTTP/2、端口名设为grpc、客户端用dns:///前缀;全链路Sidecar注入是前提。
-
在Go的const块中,iota严格按行号从0开始递增,每行自增1,与前置表达式无关;表达式仅对当前iota值运算,不干扰下一行iota取值。
-
使用reflect.ValueOf获取结构体字段前必须先解引用:v:=reflect.ValueOf(&s).Elem(),否则NumField()会panic;需检查指针非nil且仅对struct和非nilptr递归;导出字段才可Interface(),私有字段需跳过或用其他方式处理。
-
Go程序启动错误无法通过main()返回值捕获,必须在main()内显式处理;init()中panic会立即终止程序;os.Exit()跳过defer导致资源泄漏;第三方库init()需主动验证。
-
正确初始化KubernetesGo客户端需优先使用rest.InClusterConfig(Pod内自动读取ServiceAccount证书),fallback到clientcmd.BuildConfigFromFlags(指定绝对路径kubeconfig);配置QPS/Burst防限流;通过kubernetes.NewForConfig获取clientset,再调用clientset.CoreV1()获取typedclient;Watch需手动处理断连重试。
-
Go的并发内存模型通过“happens-before”原则确保操作的可见性和顺序。1.同一个goroutine中代码顺序即happens-before顺序;2.channel发送happens-before接收;3.Mutex.Unlockhappens-before下一次Lock;4.sync.Once保证初始化完成前的操作对所有后续访问可见;5.原子操作提供同步保障。若未显式建立该关系,则可能因重排导致行为不确定。
-
slice中存指针易引发数据竞争,因循环变量地址复用(如&i)导致所有指针指向同一内存;正确做法是取可寻址变量元素地址(如&data[i]),并确保其生命周期足够长。
-
预设容量是高频append场景下的必要实践,因超出cap会触发runtime.growslice导致多次分配与复制,应结合数据特征合理估算而非盲目填大数或依赖默认扩容策略。
-
超时错误本质是context.DeadlineExceeded,须用errors.Is(err,context.DeadlineExceeded)判断;HTTP客户端需分层设Timeout、DialContext和ResponseHeaderTimeout;禁用time.AfterFunc替代上下文超时,数据库操作必须用Context方法。
-
Badgerv1升级到v2/v3遇“manifesthasunsupportedversion”需导出/导入迁移;Update比View慢因写锁和WAL;value.log涨满需启用RunValueLogGC;并发读写需避免复用Txn并正确使用快照。
-
Log.Fatal不能用于服务因其调用os.Exit(1)跳过defer、资源清理和HTTP关闭,导致连接硬中断、数据库未释放;仅适用于单次脚本,服务应改用log.Error+显式shutdown+os.Exit或context统一错误处理。
-
gzip.Writer写入后必须调用Close()以写入尾部校验信息,否则解压会失败;gzip.Reader要求完整gzip格式输入,不支持裸deflate数据;压缩级别需按场景权衡性能与体积。
-
Go模块版本不可变是因proxy校验机制强制哈希一致性,非语言限制;首次发布后checksum锁定,改tag无效;修复须发新版本或极难获批的撤销;replace仅本地开发用,不解决发布问题。