Go问答技术文章
-
Go 服务变慢不一定先看 CPU。本文用 block profile 与 mutex profile 的记录语义、采样开关和 pprof 视图,说明如何区分等待方与持锁方,最后把画像结果落到具体同步点。130 收藏 -
Go append 后原切片看起来也变了,根因通常是多个切片共享底层数组且容量仍有余量。本文用 len、cap、三下标切片和 copy 说明复用边界,并给出追加隔离与完全复制的选择方法。130 收藏 -
Go encoding/xml 遇到属性和子元素同名时,不要复用一个字段。用不同 Go 字段分别标记 xml:"code,attr" 和 xml:"code",即可让 Unmarshal 与 Marshal 清晰区分两种 XML 来源。130 收藏 -
Go TestMain 没有 error 返回值,初始化失败时应先清理已创建资源,再用 os.Exit(1) 明确阻断测试;初始化成功则保存 m.Run 的退出码,清理后原样返回。130 收藏 -
Go 自定义错误只实现 Error() 时,errors.Is 可能无法匹配底层错误或业务哨兵。本文区分 Unwrap、Is 与 As,并给出错误链、语义匹配和常见坑的处理方法。130 收藏 -
给出 Go TLS 最低版本与密码套件的迁移清单:区分 TLS 1.2 与 1.3 配置边界,盘点客户端兼容性,灰度提升 MinVersion,并用 ConnectionState 验收协商结果。130 收藏 -
梳理 Go 1.27 泛型具体方法迁移旧接口时的兼容边界,给出核心类型加适配器的渐进方案、工具链要求、回滚路径与 CI 检查清单。130 收藏 -
Go 服务使用 signal.NotifyContext 接收终止信号时,常见问题不是信号不存在,而是注册时机、父 Context 已取消或测试进程没有真正发送信号。本文用一个最小服务拆解注册顺序、取消边界和可复现的验收方法。129 收藏 -
Go 泛型调用报“缺少方法”时,问题常常不在约束文字,而在值类型与指针类型的方法集不同。本文用一个可复现的命名接口例子,说明 comparable、指针接收者、隐式取址和编译期断言之间的边界。129 收藏 -
解释 Go 循环中 defer 为什么会让资源和内存峰值随迭代数增长,并用小函数边界改写为每轮及时清理。129 收藏 -
解释 Go gzip.Header.Name 解压后为空的四类原因:源流未写 FNAME、Name 设置过晚、Writer.Reset 清空头部,以及多成员默认只记录首个 Header,并给出正确代码与检查清单。129 收藏 -
crypto.Hash 只是哈希算法标识,Available 检查对应实现是否已链接并注册到当前 Go 二进制。本文用 SHA-256 示例解释 false 的原因、导入方式、New 的 panic 边界和推荐写法。129 收藏 -
Go 的 nil channel 不会就绪,因此放进 select 的收发分支永远不会被选中。本文用最小示例解释它与未就绪、已关闭通道的区别,并给出初始化、动态禁用和退出处理方案。128 收藏 -
go test 在包列表模式下会复用成功的测试结果,看到 (cached) 时不一定代表测试二进制被重新运行。本文说明 go test -count=1 的适用场景、GODEBUG=gocachetest=1 的排查方法,以及测试缓存和构建缓存的区别。128 收藏 -
Go 泛型函数通常从调用实参建立类型关系,不能只凭接收变量的类型逆向猜出返回值中的类型参数。本文用最小示例解释推断边界,并给出显式实例化、增加输入参数和非泛型包装三种改法。128 收藏