Go语言技术文章
-
Go io.Pipe 的写入端提前关闭时,读取端可能看到 io.EOF 或具体错误。本文用最小示例梳理 Close、CloseWithError、Read 返回值和排查顺序。428 收藏 -
用 sync/atomic 的 atomic.Uint64.And 原子清除状态位,理解它返回旧值的语义、与 Load 的配合方式,以及何时应改用 CompareAndSwap。428 收藏 -
Go encoding/xml 遇到带命名空间前缀的标签时,匹配关键不是 soap、o 这样的前缀,而是命名空间 URI 与 Local 名。本文用结构体标签和 xml.Name 说明排查方法。428 收藏 -
并发测试里偶尔出现的数据竞争,关键不是反复调整 sleep,而是用 go test -race 读懂两条访问栈,锁定共享状态的所有权,再用 channel、mutex 或 atomic 建立同步关系并反向验证。428 收藏 -
sync.Once 的初始化函数 panic 后不会自动重试。本文解释 Do 的完成语义、recover 的正确位置、OnceFunc 的差异,以及需要重试时的替代设计。428 收藏 -
把 atomic.Int64 放进结构体时,优先让类型承担 64 位对齐,并配合不复制、统一原子读写和 32 位构建检查,避免裸 int64 的未对齐访问风险。428 收藏 -
Go 的 gzip.Reader 默认支持连续 gzip 成员;本文用一个小项目说明如何整体解压拼接流,以及如何关闭 Multistream 后逐个读取成员并正确处理 EOF 和校验错误。428 收藏 -
Go sync.Map.Range 能安全地遍历并发 Map,却不保证一次一致快照。本文从线上统计读数漂移切入,解释并发 Store/Delete 的影响、回调边界和需要快照时的替代方案。428 收藏 -
Go 的 tls.ClientSessionCache 命中率低,不一定是 LRU 容量太小。先确认真的建立了新 TLS 连接,再检查缓存键、会话票据、证书和协议兼容条件,最后用 ConnectionState.DidResume 验证。428 收藏 -
Golang · Go问答 | 2个月前 | String · unicode · utf-8 · Go问答 · Go []rune转字符串 Go字符串长度 Go rune长度 Go UTF-8长度 utf8.RuneCountInString
Go 中 []rune 转回 string 后长度变化,通常是因为 len(string) 统计 UTF-8 字节而不是 Unicode code point。本文用原创示例拆开三种长度口径,并给出有效性检查与场景选择方法。428 收藏 -
Go 基准测试中的 b.N 会随测量阶段变化,缓存一次结果会让后续迭代跳过被测代码,导致 ns/op 失真。本文用代码说明正确循环、计时边界和缓存命中测试的拆分方法。428 收藏 -
Go io.CopyBuffer 的第二个缓冲区参数传入非 nil 但长度为 0 的切片时,会在复制开始前直接 panic。本文区分 nil、零长度和可用容量三种状态,解释入口检查、WriterTo/ReaderFrom 快路径与安全修复方式。428 收藏 -
Go 泛型约束应只暴露算法真正需要的能力。本文用 LatestByID 示例说明如何将 HasID 与 HasVersion 组合成 SyncRecord,解释接口嵌入的交集语义、类型项边界、函数参数替代方案,以及过度约束和性能误区。428 收藏 -
围绕 Go database/sql 连接池设置 MaxOpenConns、MaxIdleConns 与生命周期参数,并用 DBStats 的等待增量判断容量不足、连接占用和归还路径问题。428 收藏 -
Golang · Go问答 | 2星期前 | 标准库 · 数据校验 · 压缩 · Go问答 · Go compress/gzip io.ReadAll ErrChecksum gzip.Reader CRC-32
Go gzip.Reader 读取内容看似正常,却在末尾返回 ErrChecksum,通常不是解压过程突然失败,而是 Reader 读到 gzip 尾部后发现 CRC-32 或未压缩长度不一致。本文说明完整读取到 EOF 的正确处理方式,并区分截断、错误格式、写入端未 Close 和多成员流等常见原因。428 收藏