Go问答技术文章
-
本文回答 Go range 循环变量取地址为什么容易踩坑:旧语义下多个指针可能指向同一个循环变量,Go 1.22 后每轮变量语义改变,但如果目标是修改原切片元素,仍应使用索引取址。319 收藏 -
Go 1.26 放宽了内置 new 的参数限制,new(表达式) 可以直接创建带初始值的指针。本文用 JSON 可选字段和泛型示例说明它解决了什么问题、旧代码是否需要迁移,以及升级后如何验证兼容性。318 收藏 -
从一个一次性迭代器出发,拆开 slices.SortedFunc 的收集、比较与返回边界,说明如何处理结构体排序、空序列和比较器契约。317 收藏 -
Go 1.21 之后,go 命令会根据 go.mod 的 go、toolchain 指令选择工具链。本文用一个 CI 版本漂移场景,拆开自动切换的依据、GOTOOLCHAIN 的三种边界,以及如何保留本地便利和线上可复现。316 收藏 -
Golang · Go问答 | 4天前 | 标准库 · 错误处理 · IO · 文件读取 · Go问答 · Go LimitReader eof Reader io.LimitedReader 读取上限
io.LimitedReader 读完 N 个字节后会先把 N 变成 0,并在下一次读取时返回 EOF;这和底层 Reader 是否已经到达结尾不是一回事。本文用可运行示例拆开上限耗尽、真实 EOF 和底层错误的判断边界。316 收藏 -
Golang · Go问答 | 4天前 | 标准库 · 并发编程 · 原子操作 · Go问答 · 竞态排查 · Go sync/atomic CompareAndSwap atomic.Bool 并发状态
用一个一次性初始化场景拆开 atomic.Bool.CompareAndSwap 的成功与失败路径,说明它如何把状态切换和抢占执行权合成原子动作,以及失败后何时跳过、何时重试。316 收藏 -
本文解释 Go for range 中 goroutine 打印错值的问题,区分 Go 1.22 新循环变量语义和旧模块行为,并给出版本检查、代码排查、兼容写法和验证清单。315 收藏 -
Golang · Go问答 | 2个月前 | JSON · time.Time · 接口设计 · Go问答 · encoding/json · encoding/json API响应 JSON序列化 time.Time omitempty Go问答 omitzero
Go 里 time.Time 是结构体零值,旧的 omitempty 不会按很多人期待的方式省略它。Go 1.24 起可用 omitzero;需要区分缺失和有值时,用 *time.Time 更清楚。315 收藏 -
多个 goroutine 同时查询时,如何只接收一个可用结果并让其余任务及时退出?本文用一个可复现的 Go 示例拆开 select 竞争、取消信号和结果通道关闭顺序。312 收藏 -
Go 的 regexp.FindStringSubmatchIndex 返回的是字节下标,不是字符位置。本文用带中文的日志片段说明如何读取捕获组、处理未匹配分组,并避免切片越界。312 收藏 -
Go 的 bytes.Buffer.AvailableBuffer 返回可借用的尾部空间,但它不是已经写入的数据。本文用最小程序说明 Bytes、AvailableBuffer、Write 与 Reset 的边界,避免把缓冲容量误当成有效长度。312 收藏 -
用 Go archive/tar.Reader.Next 遍历带 PAX 扩展的 tar 包时,扩展头不会作为普通文件交给业务层。本文说明如何读取真实 Header、处理当前文件剩余数据,并区分 io.EOF 与 ErrInsecurePath。312 收藏 -
Golang · Go问答 | 3星期前 | 并发 · 故障排查 · Go问答 · encoding/json · 配置中心 · sync/atomic · encoding/json atomic.Value Go配置热加载 Decoder 配置复用 旧值残留
Go 服务热加载 JSON 配置时,偶发读到旧值通常不是文件没有更新,而是解码目标被复用、缺失字段没有覆盖旧内容,或读写过程没有通过不可变快照切换。本文从一次线上故障切入,给出可复现证据、修复代码和回归检查。311 收藏 -
Go fuzzing 里,F.Add 负责把开发者已知的边界样本放进种子语料,F.Fuzz 再从这些样本出发进行覆盖引导的变异;失败输入保存到 testdata/fuzz 后,会成为后续 go test 默认执行的回归样本。311 收藏 -
Golang · Go问答 | 1个月前 | 超时 · 错误处理 · go · Context · errors.Is Go context deadline exceeded WithCancelCause
Go 服务里看到 context deadline exceeded,不代表所有请求都只是超时。本文从上游主动取消、下游调用超时和本地截止时间三种现场出发,演示 WithCancelCause、Cause 与 errors.Is 的判断顺序,让日志能指出真正的中断来源。309 收藏