编程 Go 1.28 的 vet 新增 scannererr / sqlrowserr:循环里漏检 Err 会被点名

2026-09-26 21:02:54

Go 1.28 的 vet 新增 scannererr / sqlrowserr:循环里漏检 Err 会被点名

Go 1.28 尚未发布。以下是 tip.golang.org/doc/next 上的草稿版 release notes,Go 1.28 预计在 2027 年 2 月发布。

vet

新增两个 analyzer:

  • scannererr:检查在 bufio.Scanner.Scan 外层循环结束后未处理 scanner 错误的情况。漏检会让扫描错误或 I/O 错误被静默吞掉,没有任何上报。
  • sqlrowserr:对 sql.Rows.Next 外层循环做同样的检查,目的是把迭代过程中的错误与「结果集本来就比较小」区分开,避免把出错当成正常结束。

Bootstrap

Go 1.26 的 release notes 中已经提过:Go 1.28 现在要求用 Go 1.26.0 或更高版本来 bootstrap。按目前计划,Go 1.30 会要求 Go 1.28.0 的某个小版本或更高版本。

encoding/base32 与 encoding/base64

Encoding.EncodedLen 在编码长度溢出 int 时改为 panic,不再返回负数。

go/parser

ResolveFile 对 ast.File 语法树执行旧的语法级标识符解析。这套解析方式已弃用,新应用应改用 go/types。保留该函数是为了让迁移过程平滑一些。

net

IPMask、IPNet、HardwareAddr 现在各自实现了 encoding.TextUnmarshaler。该方法同时识别这些类型当前的 marshaling 形式,以及计划中的未来 marshaling 格式。未来格式相比当前格式(base64 编码)的差别在于它在 JSON 里是可读的;该格式会在后续某个 Go 版本中成为默认值。

之所以分两步走,是为了让本版本 Go 生成的 JSON 仍能被更早的 Go 版本读取。

net/http

当小写和大写代理环境变量同时存在且取值不同时,ProxyFromEnvironment 现在优先采用小写版本(http_proxy、https_proxy、no_proxy)。这一改动同样影响 DefaultTransport 和 DefaultClient 中默认的代理查找逻辑。

net/url

新增 MustParse:解析成功返回 URL,失败则 panic。它可以简化 Parse 的一些常见用法,例如用合法的 URL 字符串常量初始化变量。

syscall

在 Linux 上,SysProcAttr 现在支持对新创建的子进程施加 Landlock 策略,以及设置 PR_SET_NO_NEW_PRIVS 标志。

testing/synctest

新增便捷函数 Subtest,把 testing.(*T).Run 和 testing/synctest.Test 组合在一起。

跟踪信息

  • Tracking issue:golang/go#79581(Go 1.28 开发分支于 2026 年 8 月重新开放)
  • Release freeze 开始时间:2026 年 11 月 24 日,星期二
  • 文档:go.dev/doc/go1.28(暂无片段)
复制全文 生成海报 Go go vet 静态检查 升级迁移

推荐文章

程序员茄子在线接单