Go 1.28 草案:vet 新增两个「循环后忘查 err」分析器,自举门槛升到 Go 1.26
信源是 Go 1.28 Next Release Notes Draft。先记状态:Go 1.28 尚未发布,这份是 work-in-progress 草案,预计 2027 年 2 月发布。下面按模块过一遍。
vet
新增两个分析器,指向同一个老毛病:循环跑完了,忘了看 err。
scannererr:检查bufio.Scanner.Scan循环结束后是否漏检scanner.Err()。漏检时扫描错误或底层 I/O 错误会被静默吞掉:
for s.Scan() {
// 处理 s.Text()
}
// 少了 if err := s.Err(); err != nil { ... }
sqlrowserr:对sql.Rows.Next的循环做类似检查,确保迭代错误与小结果集能区分开。rows.Next()返回 false 可能是正常遍历结束,也可能是出错。
两个分析器都是对「循环结束后忘了看 err」的自动化兜底。
Bootstrap
Go 1.28 现在要求用 Go 1.26.0 或更高版本自举,这点承接 Go 1.26 release notes 的说明。预计 Go 1.30 会要求 Go 1.28.0 的小版本或更高。
encoding/base32、encoding/base64
Encoding.EncodedLen 在编码长度溢出 int 时现在会 panic,而不是返回负数。之前返回负值会在后续切片或缓冲分配处引发更难定位的问题。
go/parser
ResolveFile 对 ast.File 做旧的语法标识符解析。该解析已弃用,新应用应改用 go/types。这个函数是为过渡准备的:多数文件用 SkipObjectResolution 模式解析、但偶尔需要旧解析的应用,可以继续用它。
net
IPMask、IPNet、HardwareAddr 类型现在各自实现 encoding.TextUnmarshaler。该方法能识别当前的 marshal 格式,也能识别一个计划中的未来格式。当前格式是 base64,未来格式是 JSON 可读的。未来格式会在后续 Go 版本成为默认;采用两步走,是为了让本版本生成的 JSON 仍可被旧版 Go 读取。
net/http
ProxyFromEnvironment 现在在 http_proxy、https_proxy、no_proxy(小写)与对应大写变量都存在且值不同时,优先使用小写变量。该变化也影响 DefaultTransport 和 DefaultClient 的默认代理查找。
net/url
新增 MustParse 函数:返回解析后的 URL,出错则 panic。可简化 Parse 的常见用法,比如用合法 URL 字符串常量初始化变量:
var endpoint = url.MustParse("https://go.dev/ref/spec")
注意它只适合初始化期就确定合法的常量,运行时输入仍应走 Parse 拿 error。
syscall
Linux 上 SysProcAttr 现在支持对新生成的子进程强制 Landlock 策略,以及 PR_SET_NO_NEW_PRIVS 标志。
testing/synctest
新增 Subtest 便捷函数,组合 testing.(*T).Run 与 testing/synctest.Test,省掉手写这层包装。
草案内容还会继续变动,落地前以正式 release notes 为准。