Go问答技术文章
-
Go 升级后 encoding/json.Decoder 的结果或错误发生变化时,不要先修改业务逻辑。本文按工具链、实现、Decoder 配置、输入字节和目标类型五层建立最小复现矩阵,说明如何区分真实语义差异与错误文本变化。347 收藏 -
Go binary.Uvarint 返回 n=0 不是解出了数字 0,而是当前缓冲区还不够完整;n<0 则表示溢出。本文从分片输入场景出发,给出三种返回值的判断、游标推进、尾部保留和 ReadUvarint 选择方法。346 收藏 -
Go 的 netip.ParseAddr 不只解析普通 IPv4 和 IPv6,也能保留带作用域 zone 的 IPv6 地址。本文说明带百分号的地址如何解析、怎样读取 Zone、如何避免把端口误传给 ParseAddr。346 收藏 -
解释 Go x/text/secure/precis 中昵称强制规范化、比较键和等价比较的区别,给出处理 Unicode 昵称冲突的实用写法。346 收藏 -
判断 Go append 是否更换底层数组,先比较追加量与剩余容量,再在非空、相同起点的整数切片中观察元素地址和修改影响。文中给出容量充足与不足的对照示例,并区分限制容量与复制。346 收藏 -
context.WithoutCancel 会保留父 Context 的值,但切断取消、截止时间和 Err 传播。本文用请求收尾场景说明它的适用边界、调用链写法和超时风险,避免把它当成无限期后台执行开关。345 收藏 -
用 Go crypto/x509 验证证书链时,Roots 决定信任锚,Intermediates 只负责补链,VerifyHostname 还要单独核对主机名。本文用最小代码说明三者的边界与排错顺序。345 收藏 -
Go 中向 nil channel 发送会永久阻塞,本文从运行时语义、排查路径和修复边界说明如何定位声明遗漏、select 门控与退出控制问题。345 收藏 -
Go 模糊测试的时间上限由 go test 的 -fuzztime 控制,既可以按 30s 这样的持续时间设置,也可以按 1000x 这样的迭代次数设置。本文同时区分 -timeout、-fuzzminimizetime 和 -parallel,帮助你把 testing.F 接入本地开发与 CI。345 收藏 -
Go 的 time.After 每调用一次都会得到一个新的定时器通道。循环中高频调用会增加定时器和分配开销,但 Go 1.23 起不再引用的未停止定时器可以被回收;需要反复等待时应改用可复用的 time.Timer。345 收藏 -
Golang · Go问答 | 1个月前 | 并发 · channel · goroutine · Go问答 · Go channel 关闭 channel 接收零值 双值接收 range channel
Go channel 关闭后,接收操作会在没有更多数据时返回元素类型的零值。要区分真实业务零值与关闭信号,应使用双值接收的 ok 标志,或用 range 消费到结束;本文同时说明缓冲区残留、关闭责任和重复 close 的常见边界。345 收藏 -
解释 Go runtime/cgo.Handle 删除后的有效性边界:C 端继续回传旧句柄时,Go 侧 Value 会触发 panic,并给出回调停止、所有权交接和重复释放的处理方式。345 收藏 -
Go 1.27 的 size-specialized memory allocation 会让部分小对象分配更快,同时让二进制增加约 60 KB。本文说明如何区分预期体积变化与真实回归,使用同一源码构建对照产物,并在必要时用 GOEXPERIMENT=nosizespecializedmalloc 临时退回。345 收藏 -
Go 中 channel 无人关闭不一定等于内存泄漏,但 range 接收、发送阻塞和提前退出都会让 goroutine 长期存活。本文用 goroutine 栈定位阻塞点,并给出 ctx.Done、发送方关闭和复查清单。345 收藏 -
Go 代码用 slices.Delete 移除大对象后,进程内存为何仍然居高不下?本文从底层数组、切片尾部引用和长生命周期缓存三个角度解释原因,并给出可验证的清零与缩容方案。344 收藏