Go问答技术文章
-
C 回调进入 Go 时,关键不是猜线程会不会变化,而是明确运行时接入、线程局部状态、C 指针生命周期、cgo.Handle 和停机顺序。271 收藏 -
解释 Go 单次 iter.Seq 被重复 range 时的真实行为,对比完整消费与提前停止,并给出快照、工厂函数和 API 注释等安全设计方式。270 收藏 -
Go 客户端配置 TLS 会话缓存后仍可能频繁完整握手。本文区分 HTTP 长连接复用与 TLS 会话恢复,说明 ClientSessionCache、ServerName、进程、LRU 容量和多节点票据密钥的边界,并给出 DidResume 排查写法。270 收藏 -
Go 的 iter.Seq 是由 yield 返回值驱动停止的。本文解释 range 提前 break、iter.Pull 的 stop,以及自建异步生产者为何会继续运行,并给出可复查的资源回收方案。269 收藏 -
本文解释 atomic.Value 首次写入如何固定具体类型,分析值与指针、接口动态类型、nil 写入导致 panic 的原因,并给出稳定包装类型的安全方案。268 收藏 -
解释 Go 旧结构体中 64 位原子字段的对齐和复制边界,给出 atomic.Uint64 迁移、外部布局拆分、32 位构建与 go vet 复查方案。268 收藏 -
Go 的 fmt 在格式化实现 Stringer 的值时会调用 String;如果 String 再把原接收者交给 fmt,就可能反复分派。本文给出复现、修复与方法集边界。267 收藏 -
Go 的 rows.Scan 成功只说明当前行完成了类型转换,rows.Err 才能确认整个结果集迭代没有在 Next、网络或 context 取消处失败。本文给出可直接复用的处理模板和边界清单。267 收藏 -
结合 Go 1.27 对具体泛型方法的支持,解释为什么接口方法仍不能声明额外类型参数,并用顶层泛型函数、接收者提升参数、具体泛型方法和窄接口四种方案重构 API。267 收藏 -
Go encoding/json/v2 的 MarshalFunc 不会全局注册。自定义格式化器不生效时,应依次检查 Go 版本与导入路径、WithMarshalers 是否传入同一次调用、泛型目标类型、JoinMarshalers 顺序和选项覆盖。260 收藏 -
context.AfterFunc 返回的 stop 只在回调尚未启动时阻止它;取消与停止存在竞态,stop 返回 false 时回调可能已在独立 goroutine 中运行。本文给出等待完成、幂等清理和审计检查方案。259 收藏 -
解释 Go cmp.Compare 遇到 NaN 时的返回规则:NaN 小于任意非 NaN、NaN 与 NaN 相等、负零与正零相等,并给出默认排序及 NaN 靠后的定制写法。258 收藏 -
unique.Make 设计上不会永久保留所有失去 Handle 的规范值,但活跃 Handle 会延长生命周期,高基数长期服务还要关注弱引用清理时机与 Go 官方已知问题。本文给出适用边界、代码和监控建议。257 收藏 -
梳理 Go net/http 的 HTTP/1、TLS HTTP/2 与明文 HTTP/2 配置差异,给出客户端、服务端匹配方式和连接失败排查清单。257 收藏 -
Go HTTP 请求重试不要一股脑塞进 Transport:网络级可重放失败适合统一处理,创建和写入接口必须由业务层配合幂等键、结果查询与退避策略,才能避免超时后的重复写入。255 收藏