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 1.19 及以上项目通常优先使用 atomic.Int64;兼容旧版本或已有 *int64 接口时继续使用旧式原子函数。本文从 API 形状、计数器迁移、版本、对齐和复制约束说明如何选择。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 的 zip.OpenReader 负责打开磁盘上的 ZIP 归档,真正按成员名读取要调用返回值的 Reader.Open。本文给出完整函数,讲清斜杠相对路径、成员不存在、目录成员、读取上限、ErrInsecurePath 与关闭顺序。130 收藏 -
Go 的 zip.Writer.Copy 会通过 OpenRaw 直接复制 ZIP 条目的原始压缩数据,避免解压和重新压缩。本文给出合并归档的完整写法,并说明改名、关闭顺序与错误边界。130 收藏 -
Go 的 x509.SystemCertPool 在 Linux、macOS、Windows 和容器中使用的信任来源与实现不同;Subjects 也不会完整枚举平台系统根,因此数量差异不等于验证能力差异。本文按故障时间线说明根因、排查与修复。130 收藏 -
用 Go crypto/rand 读取固定长度随机字节时,区分 Reader 的短读语义、io.ReadFull 的完整读取保证与错误传播边界,并用可控测试替身复核实现。129 收藏 -
Go 服务使用 signal.NotifyContext 接收终止信号时,常见问题不是信号不存在,而是注册时机、父 Context 已取消或测试进程没有真正发送信号。本文用一个最小服务拆解注册顺序、取消边界和可复现的验收方法。129 收藏 -
Go 1.27 为 go/types 增加 Hasher 与 HasherIgnoreTags。本文用结构体标签和 maphash 说明两套类型等价关系如何生成一致缓存键,以及碰撞、种子和并发边界。129 收藏 -
Go 泛型调用报“缺少方法”时,问题常常不在约束文字,而在值类型与指针类型的方法集不同。本文用一个可复现的命名接口例子,说明 comparable、指针接收者、隐式取址和编译期断言之间的边界。129 收藏