Go语言技术文章
-
net.LookupCNAME 返回的是跟随零条或多条 CNAME 后的规范化名称。判断查询是否失败要先看 err;没有显式 CNAME 但主机能解析到地址时不一定是错误,需要上下文时使用 Resolver.LookupCNAME。183 收藏 -
net.LookupTXT 返回的是 TXT 记录组成的字符串切片;单条 TXT 记录内部有多个字符串片段时,Go 会把它们拼成一个字符串。生产代码应使用带超时的 Resolver.LookupTXT,并明确保留记录边界、处理错误和限制日志内容。440 收藏 -
Go netip.Addr.Next 在最大 IPv4 或 IPv6 地址之后返回零值 Addr,这是没有后继地址的正常语义。本文说明如何用 IsValid 识别边界并安全结束地址池遍历。465 收藏 -
URL.Opaque 非空时不会与 Path 合并。本文用最小 Go 示例说明两类 URL 表示、普通 HTTP 路径替换写法,以及 RawPath、查询参数、请求目标和完整 URL 的区别。181 收藏 -
Go 1.22 以后,ServeMux 的单段路径变量和末尾多段通配符并非一重叠就冲突。本文用请求集合解释真正的交叉模式,说明如何通过字面路径段拆开路由边界,并提醒 PathValue、尾部斜杠和旧版本兼容开关的使用边界。170 收藏 -
ResponseController.Flush 返回成功只代表 Go 端把当前缓冲交给下一跳,经过反向代理后仍可能被代理继续缓存。排查时先确认 ResponseWriter 的 Flush 能力,再关闭对应接口的 proxy_buffering 或设置 X-Accel-Buffering: no,并区分直连与代理链路。156 收藏 -
解释 go test 中 T.Cleanup 的父子测试层级、同层后进先出和 t.Parallel 等待屏障,帮助排查清理顺序与共享资源释放问题。161 收藏 -
Go 测试使用 t.Parallel 后,t.Setenv 修改的环境变量可能互相覆盖。本文解释两者的作用范围,给出参数化和串行边界两种稳定处理方式。469 收藏 -
go vet 的 %w 指针告警不等于禁止指针错误。本文结合值接收者与指针接收者示例,解释错误链动态类型、Is/As 匹配差异,以及保留 CI 检查、记录例外和修复错误契约的方法。178 收藏 -
go test 只会复用满足缓存条件的成功测试结果。环境变量改变后仍看到缓存提示,先确认测试是否读取了该变量、变量是否真的传入进程,再用 -count=1 强制本次重新执行。495 收藏 -
Go 1.27 修复了 gofmt 的列对齐判断,少量旧文件重新格式化时可能出现空格变化。本文说明如何固定 Go 工具链、审阅纯格式化 diff,并把检查接入 CI。288 收藏 -
Go 1.27 的 response file 解析属于 compile、link、asm、cgo、cover、pack 等底层工具,不是 go build 外层任意参数的通用语法。带空格的参数必须按 GCC-compatible 规则用单双引号包住,并先确认到底是哪一层在解析。350 收藏 -
Go 启用 GOEXPERIMENT=simd 后构建失败,应分别核对工具链、实验环境、目标架构与 API 版本。本文提供包探针和项目构建排查命令,说明标量回退、基准比较方法与实验功能上线边界。224 收藏 -
Go 1.27 的 testing/synctest.Sleep 不只是等待虚拟时间,还会等 bubble 内其它 goroutine 稳定阻塞。本文解释只写 time.Sleep、未进入 bubble、使用真实网络或没有清理后台任务时为什么仍会不稳定,并给出按版本选择的最小写法。306 收藏 -
go/types.Hasher 面向源码类型与 types.Identical,reflect.Type 面向运行时类型表示。本文解释两者为什么不能直接比较哈希值,以及源码分析缓存和运行时缓存分别应该怎样选键。475 收藏