Go语言技术文章
-
Go 的 trace.Stop 太晚会让无关运行阶段混入追踪,也可能因 defer 顺序错误在文件关闭后仍尝试写入。本文用采集窗口和资源生命周期解释正确写法。440 收藏 -
Go 自定义错误只实现 Error() 时,errors.Is 可能无法匹配底层错误或业务哨兵。本文区分 Unwrap、Is 与 As,并给出错误链、语义匹配和常见坑的处理方法。130 收藏 -
用 Go runtime/trace 采集一次请求的短时执行轨迹,结合 task、region 和 go tool trace 观察 goroutine 调度、阻塞、系统调用与 GC 事件。176 收藏 -
Go init 函数一多,启动顺序难查通常不是 init 本身失控,而是包级变量依赖、文件呈现顺序和隐藏副作用混在了一起。本文给出依赖定位、显式构造和重构检查方法。238 收藏 -
Go module graph pruning 不是简单删除 go.mod 条目。本文从 go 1.17+ 的模块图规则出发,说明如何用 go mod graph、go mod why -m 和 go list -m all 定位仍被下载的依赖。168 收藏 -
Go 中 defer 后修改变量却打印旧值,通常是因为参数在 defer 登记时已经求值。本文用最小示例区分参数快照与闭包读取,并给出日志、循环和命名返回值的选择方法。210 收藏 -
Go vendor 模式下,不能只看 go.mod 猜依赖版本。本文用 vendor/modules.txt、go list -mod=vendor 和 go version -m 建立从源码目录到最终二进制的核对路径。276 收藏 -
Go context 创建派生上下文后应尽快调用 cancel。本文解释 WithTimeout 的定时器和父子关系为何需要主动释放,并给出函数、循环、goroutine 的安全写法。112 收藏 -
用 go.work 在本地联调多个 Go 模块,理解 use、GOWORK=off 与 go work sync 的职责,避免把临时 replace 带进正式发布。480 收藏 -
Go 的 time.After 每调用一次都会得到一个新的定时器通道。循环中高频调用会增加定时器和分配开销,但 Go 1.23 起不再引用的未停止定时器可以被回收;需要反复等待时应改用可复用的 time.Timer。345 收藏 -
Go 的 net.Dialer 通过 LocalAddr 指定出站连接的本地 IP 和端口,通过 Timeout 限制拨号等待;本文说明 tcp 地址类型匹配、context 截止时间、连接读写 deadline 以及常见绑定失败的排查方法。295 收藏 -
Golang · Go问答 | 1个月前 | JSON · Go问答 · 接口测试 · Go JSON测试 map比较顺序不稳定 encoding/json测试 reflect.DeepEqual比较JSON cmp.Diff用法
Go JSON 测试失败不一定是数据变了,map 遍历顺序、JSON 成员排列与字节级快照是三个不同问题。本文用反序列化、reflect.DeepEqual 和 cmp.Diff 说明稳健的比较方式。397 收藏 -
通过 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 收藏