Go语言技术文章
-
pkg.go.dev API 的 latest 代表索引已识别的最新模块版本,不等于仓库默认分支或任意 Git 标签。本文从语义化标签、子模块前缀、主版本路径和索引传播四层排查差异,并给出最小验证命令。481 收藏 -
Go net.Resolver 的自定义超时要分成两层:调用 LookupIPAddr 时用 context.WithTimeout 限制整次解析,Resolver.Dial 内部再用 net.Dialer.DialContext 约束连接 DNS 服务的时间。本文给出可复用代码,并说明 PreferGo、StrictErrors、UDP/TCP 与错误判断边界。481 收藏 -
高频循环里反复调用time.After会让计时器无法主动取消。本文用可复用的time.NewTimer演示Stop、排空、Reset和退出清理,并说明Go 1.23前后的Timer语义差异。481 收藏 -
用 Go t.Cleanup 把资源创建与释放登记绑定起来,理解后进先出、父子测试生命周期、提前失败和清理错误记录的实现边界。481 收藏 -
Go 遍历 tar 归档时,不要只看文件名后缀,而应读取 tar.Header.Typeflag。本文用一套最小遍历代码说明如何识别目录、符号链接和硬链接,并处理 Linkname、Read、io.EOF 及路径安全边界。481 收藏 -
fmt.Errorf 用 %w 包装自定义错误后,调用方可通过 errors.As 找回具体类型;本文解释值接收者、指针接收者、%v 与目标指针的对应关系。481 收藏 -
Go archive/zip 的 Writer.Close 负责写入 ZIP 中央目录,忽略其错误可能把半成品当成成功文件。本文用分层错误处理和临时文件发布说明可靠写法。481 收藏 -
Go 用 context.WithValue 传 trace id 时,key 不要直接用 string;用包内私有类型配合类型化存取函数,既能避免跨包碰撞,也能限制值只服务于请求链路。481 收藏 -
Go 接口类型本身支持比较,但接口里的动态值如果是 slice、map、func,或包含这些字段的数组和结构体,比较相同动态类型的两个接口就可能触发 panic。本文说明判断边界,并给出 reflect.Value.Comparable、reflect.DeepEqual 和类型化比较的选择方法。481 收藏 -
多模块 Go 仓库里,go test ./... 只覆盖当前模块并不一定是测试失效。本文从 go.work、use、replace 和模块边界入手,给出补齐工作区并逐模块测试的实用做法。481 收藏 -
用 pkg.go.dev API 读取 Go 包、模块和版本元数据,处理路径歧义、构建上下文与分页,并划清目录数据和本地构建验证的边界。481 收藏 -
Go 包变量没有显式初始化表达式时不会出现在 InitOrder,但仍具有零值语义。本文对照显式零值声明,结合包作用域示例说明怎样生成完整的具名变量清单。480 收藏 -
用Ed25519短消息示例明确签名与验证接口,区分种子、密钥和文本编码,定位空结果、不匹配与算法变体混用问题。480 收藏 -
Go 的 ETag 条件请求总是返回 200,通常不是客户端没有缓存,而是服务端没有读取 If-None-Match、比较规则不兼容,或在写入响应体后才尝试返回 304。本文给出可直接改造的 net/http handler 和排障顺序。480 收藏 -
Go ServeMux 匹配不到路径时,按 Go 版本、路径段、尾斜杠、通配符、HTTP 方法和 Host 逐项排查,掌握 {id}、{path...} 与 {$} 的实际边界。480 收藏