Go语言技术文章
-
通过 net.Resolver 的 Dial 为单次 Go DNS 查询指定服务器 IP,配合 PreferGo、context 超时和 LookupHost 处理 UDP/TCP、取消及错误边界。100 收藏 -
Go 的 httptest.NewServer 关闭后仍有连接,通常要分别处理 Server、Response.Body 和 Client/Transport。本文用最小测试示例说明读取关闭响应体、关闭服务端和回收空闲连接的正确边界。419 收藏 -
Go net/netip 比较 IPv4 与 IPv4-mapped IPv6 时,应先用 Unmap 统一表示,再按 Addr 或 AddrPort 选择等值判断;本文说明 Is4、Is6、Is4In6、Compare 与端口边界。391 收藏 -
解释 Go httptest.ResponseRecorder 为什么常见 200,梳理 NewRecorder 初始值、Write 的隐式状态、WriteHeader 首次生效和 Result().StatusCode 的稳定断言边界。125 收藏 -
用 Go 的 atomic.Uint64 实现并发请求计数,掌握 Add、Load、零值、复制限制、溢出与旧版 sync/atomic 函数的使用边界。125 收藏 -
go list -m all 展示的是模块构建列表,不等于某个目标包实际编译进二进制的全部依赖。本文从模块模式、vendor、workspace、构建条件和二进制 BuildInfo 五层排查版本不一致。490 收藏 -
用一个有界并发队列讲清 Go sync.Cond 的 Wait、Signal、Broadcast 和 for 条件检查,避免消费者空取与关闭后永久等待。429 收藏 -
Go 私有模块报错时,GOPRIVATE、GOPROXY、GONOPROXY 与 GONOSUMDB 解决的不是同一件事。本文从实际生效配置、报错位置和企业代理场景拆分排查路径。193 收藏 -
Go sync.Once 只保证初始化函数执行一次,不会因为返回错误自动重试。本文解释其完成状态语义,并给出失败可重试、成功只执行一次的互斥封装。331 收藏 -
Go module checksum mismatch 不要先删 go.sum。本文通过 go mod download -json、go.sum、GOSUMDB 与 GOPROXY 对照,判断是内容变化、代理缓存还是私有模块配置边界。328 收藏 -
用 Go signal.NotifyContext 把 SIGINT、SIGTERM 转成统一的 Context 取消,说明 worker、HTTP 服务和外部资源如何优雅收尾,以及 stop 的注销边界。299 收藏 -
Go 用 unsafe.String 把可变字节缓冲区借用成字符串后,如果原切片被复用、写入或提前失去生命周期约束,字符串读取时就可能偶发乱码。本文按触发条件定位原因,并给出安全的复制写法。158 收藏 -
Go exec.CommandContext 取消后,不能只看 ctx.Done。本文用 Wait 确认子进程退出,并区分超时、主动取消、非零退出和 WaitDelay 边界。323 收藏 -
整理 reflect.Value.IsNil 支持的 Kind,解释无效 Value、typed nil 与空切片的差异,并给出带 Kind 白名单的安全封装。277 收藏 -
Go os/exec 启动命令后,相对路径默认跟随子进程工作目录。本文用 Cmd.Dir 设置独立目录,并区分目录不存在、命令失败和结果文件落点错误等常见问题。249 收藏