Go问答技术文章
-
CloseIdleConnections 只处理 Transport 中已完成请求、当前处于 keep-alive 空闲状态的连接,不会中断正在使用的连接。本文用可复现代码拆开它与 MaxIdleConnsPerHost、IdleConnTimeout 的边界。428 收藏 -
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 收藏 -
sync.Once 的初始化函数 panic 后不会自动重试。本文解释 Do 的完成语义、recover 的正确位置、OnceFunc 的差异,以及需要重试时的替代设计。428 收藏 -
把 atomic.Int64 放进结构体时,优先让类型承担 64 位对齐,并配合不复制、统一原子读写和 32 位构建检查,避免裸 int64 的未对齐访问风险。428 收藏 -
Go 的 tls.ClientSessionCache 命中率低,不一定是 LRU 容量太小。先确认真的建立了新 TLS 连接,再检查缓存键、会话票据、证书和协议兼容条件,最后用 ConnectionState.DidResume 验证。428 收藏 -
Golang · Go问答 | 3星期前 | 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 收藏 -
Golang · Go问答 | 2个月前 | 并发 · channel · range · Go问答 · 并发退出 Channel关闭 Go问答 close channel range退出 发送方关闭
Go channel 关闭后仍然可以把缓冲区里的值读完,再继续读取会得到元素类型的零值和 ok=false;但关闭后的 channel 不能再写入,也不能重复关闭。真正安全的关键是让发送方统一负责关闭,并让接收方用 range 或 ok 值退出。427 收藏 -
Golang · Go问答 | 1个月前 | 性能优化 · Context · go并发 · 故障排查 · Go goroutine泄漏 context.WithCancel 请求生命周期 defer cancel
调用 context.WithCancel 并不自动消除 goroutine 泄漏。关键在于 cancel 的调用位置、子协程是否监听 Done,以及请求提前返回时能否及时结束。本文从一个持续增长的接口现场拆出根因、修复和复查方法。427 收藏 -
Go select 没有 default 并不是异常:当所有通信 case 都暂时不可执行时,当前 goroutine 会等待;本文区分缓冲、关闭和 nil channel,并给出 default、超时与取消的选择方法。427 收藏 -
Go 读取证书时,pem.Decode 返回 nil 与 x509.ParseCertificate 返回错误不是一回事。本文用分层代码、错误阶段和边界表定位 PEM 外层格式与 DER/X.509 内容问题。427 收藏 -
Go fs.Glob 的设计就是忽略目录读取时的 I/O 错误,默认只把非法匹配模式作为返回错误。本文拆解 GlobFS 与 ReadDir 分支,并给出用 WalkDir 保留目录错误的处理方案。427 收藏