Go 1.28 的 net/url 与 net/http:小写代理变量优先、MustParse 出错 panic、IP 类型将支持 JSON 可读格式
来源:Go next release notes(Go 1.28 draft)。
net/http:ProxyFromEnvironment 改为小写代理变量优先
ProxyFromEnvironment 现在当 http_proxy、https_proxy、no_proxy 的大小写两套环境变量同时存在且值不同时,优先取小写版本,而不是以前的大写优先。该变化也会通过 DefaultTransport 和 DefaultClient 影响默认代理查找。
升级后如果请求走了不同代理,先确认两套变量是否同时存在:
env | grep -iE '^(http_proxy|https_proxy|no_proxy)='
若 http_proxy 与 HTTP_PROXY、https_proxy 与 HTTPS_PROXY、no_proxy 与 NO_PROXY 的值不同,Go 1.28 下小写生效。需要统一值或删除不期望的一套。
net/url:新增 MustParse
新增 MustParse,返回解析后的 URL,出错则 panic,可简化常见 Parse 用法,例如用合法 URL 字符串常量初始化变量。
var u = url.MustParse("https://example.com")
运行时用户输入不要走 MustParse,错误输入会直接 panic。适合包级变量、测试或已知合法的常量 URL。
net:IPMask、IPNet、HardwareAddr 新增 encoding.TextUnmarshaler
IPMask、IPNet、HardwareAddr 各自新增 encoding.TextUnmarshaler 方法。该方法会识别这些类型当前的 marshaling 格式,以及计划中的未来格式;未来格式是 JSON 可读的,不同于当前 base64 编码。未来格式将在后续 Go 版本成为默认。这是两步走,以便本版本生成的 JSON 仍能被更早版本读取。
跨版本传输 JSON 时,本版本的解析端会同时接受当前格式和未来格式;本版本生成的 JSON 仍可被更早版本读取。后续 Go 版本把未来格式切为默认后,旧版本读取新 JSON 需要关注。
其他 Go 1.28 变化
go命令现在识别已被移除支持的 GODEBUG 设置,如asynctimerchan;若出现在go.mod的godebug条目或.go源文件的//go:debug注释里,只接受设为最终默认值的设置,设为旧值则go命令失败。- Linux 上
SysProcAttr支持对新建子进程强制 Landlock 策略与PR_SET_NO_NEW_PRIVS标志。 - 新增
Subtest便捷函数,组合testing.(*T).Run与testing/synctest.Test。 go/types:ResolveFile做旧式语法标识符解析,已弃用,新应用应使用go/types。encoding:EncodedLen在编码长度溢出int时 panic,而不再返回负数。vet新增scannererr/sqlrowserranalyzer,检查循环里未处理bufio.Scanner.Scan/sql.Rows.Next的错误。- Go 1.28 要求引导用 Go 1.26.0 或更高。