Go问答技术文章
-
Go sync.Pool 的 Get 不保证返回刚 Put 的对象,池内元素也可能被自动移除。本文用最小代码说明 Get、Put、New 的边界,并给出复用临时对象时的排查清单。336 收藏 -
Go sync.Once.Do 内部函数发生 panic 后不会自动重试;本文用调用计数、recover 和对比表说明 Once、OnceFunc 与显式重试状态机的边界。434 收藏 -
Go 报 sync: negative WaitGroup counter,通常不是 Wait 本身出错,而是某条执行路径让 Done 多于已完成的 Add。本文从计数关系、defer 作用域、错误分支和 helper 责任四个位置定位多余的 Done,并给出可复用的修复写法。366 收藏 -
Go 里把 WaitGroup.Add 写进 goroutine,会让 Wait 有机会在计数建立前先返回。本文用时序拆解根因,给出 Add、Done、Wait 的安全写法,并说明嵌套任务和 WaitGroup.Go 的边界。434 收藏 -
Golang · Go问答 | 6天前 | 并发 · Context · Go问答 · channel生命周期 · 协程退出 · range Go channel context WaitGroup goroutine泄漏
channel range 结束只说明 channel 已关闭且缓存值已读完,不代表发送方 goroutine 已经退出。本文用发送方关闭 channel、WaitGroup 汇总和 context 取消,说明如何确认发送方真正结束并避免协程泄漏。125 收藏 -
Go 的 nil channel 不会就绪,因此放进 select 的收发分支永远不会被选中。本文用最小示例解释它与未就绪、已关闭通道的区别,并给出初始化、动态禁用和退出处理方案。128 收藏 -
Go 中重复关闭 channel 会触发 panic,向已关闭 channel 发送也会 panic,而从已关闭 channel 接收会返回零值。本文用状态表、单一关闭者、多生产者协调和 done 广播说明如何修复。359 收藏 -
Go map 并发读写没有立刻崩溃,不代表代码安全。本文用 -race 定位冲突,说明普通 map 的锁封装方式,并比较 sync.Map 的适用边界。374 收藏 -
Golang · Go问答 | 6天前 | go · DNS · net.Resolver · 网络超时 · DNS Go net.Resolver Resolver.Dial DialContext
讲清 Go 自定义 net.Resolver.Dial 的调用边界,使用同一个 net.Dialer 转发上下文、网络类型和 DNS 地址,并接入 HTTP Transport 保留请求超时与本地网络配置。122 收藏 -
Go DNS 查询超时后仍看到延迟,常见原因不是 context 失效,而是调用了不带 context 的包级函数、纯 Go 解析发生重试,或 cgo 底层阻塞调用尚未收尾。本文给出区分三种情况的排查与写法。229 收藏 -
Golang · Go问答 | 6天前 | 解析器 · go · 排查 · DNS · 网络 · net.Resolver LookupHost PreferGo Go DNS StrictErrors
Go net.Resolver.PreferGo 改变域名解析结果时,先区分 Go 内置解析器与系统解析器,再检查 DNS 配置、A/AAAA 部分结果和 context 超时,避免把解析路径差异误判成 DNS 故障。166 收藏 -
Go HTTP 请求已经超时,但服务端日志还在继续时,先分清客户端、请求上下文和服务端 deadline 三个边界,再检查下游是否真正收到 ctx,最后用 Err 与 Cause 记录责任归属。465 收藏 -
Go 中 context.Err 只能说明上下文因取消还是 deadline 结束,不能代替下游函数自己的 error。本文用 WithCancelCause、Cause 和错误映射示例,拆开判断上游取消、超时与下游失败。398 收藏 -
context.Cause 在取消发生前返回 nil。本文用 WithCancelCause 和 WithTimeoutCause 说明读取时机、Err 与 Cause 的区别,以及下游错误映射边界。456 收藏 -
Go Transport 参数调大后延迟不一定下降。本文从 Client 生命周期、空闲连接与并发上限、Response.Body 关闭和可观测信号四个方面排查原因。407 收藏