Go问答技术文章
-
Golang · Go问答 | 3天前 | 标准库 · 并发编程 · 原子操作 · Go问答 · 竞态排查 · Go sync/atomic CompareAndSwap atomic.Bool 并发状态
用一个一次性初始化场景拆开 atomic.Bool.CompareAndSwap 的成功与失败路径,说明它如何把状态切换和抢占执行权合成原子动作,以及失败后何时跳过、何时重试。316 收藏 -
多个 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 收藏 -
Go 复用 time.Timer 时,Reset 的调用时机、旧值处理和 Go 版本语义容易混在一起。本文用一个超时循环拆开 stopped、expired、drain 与 1.23 之后的行为边界。309 收藏 -
Golang · Go问答 | 4天前 | 标准库 · golang · HTTP · url · Go问答 · Go path net/url RawPath url.URL.JoinPath URL转义
Go 的 url.URL.JoinPath 会清理路径片段,但不会替你判断斜杠是分隔符还是数据。本文用 Path、RawPath 和 PathEscape 对比说明 URL 拼接与转义的边界。309 收藏 -
Go 通过 cgo.Handle 把 Go 值暂存给 C 侧时,关键不是把指针强行塞过去,而是明确句柄的创建、回调取值和 Delete 释放边界。本文用一个回调桥接例子说明生命周期、并发与异常清理。308 收藏 -
用 runtime/trace.NewTask 给跨 goroutine 的业务操作建立可追踪边界,说明 context.Context 如何传播任务、task.End 如何收口,以及 trace.WithRegion 与 go tool trace 的分工。307 收藏 -
Go 的 Header.Get 找不到请求头和找到空值时都可能返回空字符串。本文用 Header.Set、Header.Get、Header.Values 和 CanonicalMIMEHeaderKey 拆开这个边界,给出缺失判断、重复值读取与大小写处理的可运行写法。306 收藏 -
strings.Cut 把字符串拆分成 before、after 和 found 三个结果,适合处理带前缀的配置、路由和协议字段。本文用可运行示例说明空字符串边界、与 HasPrefix 的分工,以及从 Index 写法迁移时的验收方式。305 收藏 -
Go log/slog 的 HandlerEnabled 适合把动态级别判断前移。本文用 LevelVar 和请求级过滤示例,拆开日志级别、属性改写与上下文边界。304 收藏 -
用 Go 1.23 新增的 os.CopyFS 把 embed.FS 复制到本地目录,说明目标目录创建、已有文件冲突、fs.ErrExist 判断和权限边界。299 收藏