Go 1.25 (2025-08-12)
Go 1.25 版本在 2025 年 8 月发布。此版本在工具链、运行时和标准库方面进行了大量改进,同时保持了 Go 1 的兼容性承诺。
语言变化
Go 1.25 没有影响 Go 程序的语言级变化。但在语言规范中,核心类型(core types)的概念已被移除,改为专门的描述性文本。
工具链
Go 命令
-
ASan 内存泄漏检测:
go build -asan选项现在默认在程序退出时进行泄漏检测。如果由 C 分配的内存未被释放且未被任何其他 C 或 Go 分配的内存引用,将报告错误。可通过设置环境变量ASAN_OPTIONS=detect_leaks=0禁用此功能。 -
工具依赖优化: Go 发行版将包含更少的预构建工具二进制文件。编译器和链接器等核心工具链二进制文件仍将包含,但不由构建或测试操作调用的工具将由
go tool按需构建和运行。 -
ignore 指令: 新的
go.modignore指令可用于指定go命令应忽略的目录。这些目录及其子目录中的文件在匹配包模式时将被忽略,但仍将包含在模块 zip 文件中。 -
go doc 增强: 新的
go doc -http选项将启动文档服务器,显示请求对象的文档,并在浏览器窗口中打开文档。 -
go version 改进: 新的
go version -m -json选项将以 JSON 格式打印嵌入在给定 Go 二进制文件中的runtime/debug.BuildInfo结构体编码。 -
模块子目录支持:
go命令现在支持使用存储库子目录作为模块根路径,使用<meta name="go-import" content="root-path vcs repo-url subdir">语法表示root-path对应于repo-url的subdir。 -
work 包模式: 新的
work包模式匹配工作模块中的所有包(在模块模式下为单个工作模块,在工作区模式下为工作区模块集合)。 -
工具链行移除:
go命令更新go.mod或go.work文件中的go行时,不再添加指定命令当前版本的工具链行。
Vet 工具
- 新增分析器:
- waitgroup: 报告对
sync.WaitGroup.Add的错误位置调用。 - hostport: 报告使用
fmt.Sprintf("%s:%d", host, port)为net.Dial构造地址的用法,因为这对 IPv6 不起作用。建议使用net.JoinHostPort。
- waitgroup: 报告对
运行时
容器感知的 GOMAXPROCS
Go 1.25 改变了 GOMAXPROCS 的默认行为:
-
Linux cgroup 感知: 在 Linux 上,运行时现在考虑进程所在 cgroup 的 CPU 带宽限制。如果 CPU 带宽限制低于可用的逻辑 CPU 数,
GOMAXPROCS将默认为较低的限制。在 Kubernetes 等容器运行时系统中,cgroup CPU 带宽限制通常对应于"CPU 限制"选项。 -
动态更新: 在所有操作系统上,运行时会在可用逻辑 CPU 数或 cgroup CPU 带宽限制变化时定期更新
GOMAXPROCS。为支持读取更新的 cgroup 限制,运行时将在进程的整个生命周期内保留 cgroup 文件的缓存文件描述符。 -
禁用机制: 如果通过
GOMAXPROCS环境变量或runtime.GOMAXPROCS调用手动设置GOMAXPROCS,这两个行为都会自动禁用。也可通过containermaxprocs=0和updatemaxprocs=0GODEBUG 设置显式禁用。
新的实验性垃圾收集器
-
新垃圾收集器现作为实验提供。该设计通过更好的局部性和 CPU 可扩展性改进了小对象的标记和扫描性能。基准测试结果各不相同,但预期重度使用垃圾收集器的实际程序的垃圾收集开销可减少 10-40%。
-
可通过在构建时设置
GOEXPERIMENT=greenteagc启用新垃圾收集器。设计预计将继续演进和改进。鼓励 Go 开发者尝试并报告反馈。详见 GitHub issue。
Trace 飞行记录器
-
新的 runtime/trace.FlightRecorder API 提供了一种轻量级方式来捕获运行时执行 trace,通过连续将 trace 记录到内存环形缓冲区。当发生重要事件时,程序可调用
FlightRecorder.WriteTo将过去几秒的 trace 快照写入文件。此方法通过使应用仅捕获相关 trace 而生成更小的 trace。 -
FlightRecorderConfig 可配置 FlightRecorder 捕获的时间长度和数据量。
未处理 panic 输出变化
- 程序因恢复然后重新 panic 的未处理 panic 而退出时打印的消息不再重复 panic 值的文本。
之前:
panic: PANIC [recovered]
panic: PANIC
现在:
panic: PANIC [recovered, repanicked]
Linux VMA 名称
- 在支持匿名虚拟内存区域(VMA)名称的 Linux 系统上(
CONFIG_ANON_VMA_NAME),Go 运行时将使用上下文注解匿名内存映射,例如[anon: Go: heap]表示堆内存。可通过 GODEBUG 设置decoratemappings=0禁用此功能。
编译器
nil 指针 bug 修复
- 修复了 Go 1.21 中引入的编译器 bug,该 bug 可能会不当延迟 nil 指针检查。以下程序之前会错误地执行成功(违反 Go 规范),现在将正确地 panic:
package main
import "os"
func main() {
f, err := os.Open("nonExistentFile")
name := f.Name() // 如果 err 非 nil,则 f 为 nil,应该 panic
if err != nil {
return
}
println(name)
}
如果此改变影响你的代码,解决方案是将非 nil 错误检查提前到代码中,最好紧接在错误生成语句之后。
DWARF 5 支持
- Go 1.25 中的编译器和链接器现在使用 DWARF version 5 生成调试信息。较新的 DWARF 版本显著减少了 Go 二进制文件中调试信息所需的空间,并缩短了链接时间,特别是对于大型 Go 二进制文件。DWARF 5 生成可通过在构建时设置环境变量
GOEXPERIMENT=nodwarf5禁用(此回退在未来 Go 版本中可能被移除)。
更快的切片
- 编译器现在可在更多情况下在栈上分配切片的后备存储,提高了性能。此改变可能会放大不正确
unsafe.Pointer使用的影响(见 issue 73199)。可使用 bisect tool 的-compile=variablemake标志找到造成问题的分配。所有新的栈分配也可通过-gcflags=all=-d=variablemakehash=n关闭。
链接器
链接器现在接受 -funcalign=N 命令行选项,指定函数条目的对齐。默认值取决于平台,在此版本中保持不变。
标准库
新的 testing/synctest 包
-
新的 testing/synctest 包为并发代码测试提供支持。
-
Test 函数在隔离的"气泡"中运行测试函数。在气泡内,时间被虚拟化:
time包函数对虚拟时钟进行操作,如果气泡内所有 goroutine 都被阻止,时钟立即向前移动。 -
Wait 函数等待当前气泡中所有 goroutine 阻止。
此包首先在 Go 1.24 中作为 GOEXPERIMENT=synctest 可用,API 略有不同。实验现已普遍可用。如果设置 GOEXPERIMENT=synctest,旧 API 仍然存在,但将在 Go 1.26 中移除。
新的实验性 encoding/json/v2 包
- Go 1.25 包含新的实验性 JSON 实现,可通过在构建时设置环境变量
GOEXPERIMENT=jsonv2启用。
启用后,两个新包可用:
- encoding/json/v2 包是
encoding/json包的重大修订。 - encoding/json/jsontext 包提供较低级别的 JSON 语法处理。
另外,启用"jsonv2" GOEXPERIMENT 时:
- encoding/json 包使用新 JSON 实现。序列化和反序列化行为不变,但包函数返回的错误文本可能会改变。
- encoding/json 包包含许多新选项可用于配置序列化器和反序列化器。
新实现在许多场景下性能显著更好。一般而言,编码性能在两种实现之间相当,解码在新实现中明显更快。详见 github.com/go-json-experiment/jsonbench。
鼓励 encoding/json 用户使用启用的 GOEXPERIMENT=jsonv2 测试他们的程序以帮助检测新实现的任何兼容性问题。
标准库的其他改进
归档和编码:
-
archive/tar:
Writer.AddFS实现现在对实现io/fs.ReadLinkFS的文件系统支持符号链接。 -
encoding/asn1:
Unmarshal和UnmarshalWithParams现在更一致地解析 ASN.1 类型 T61String 和 BMPString,可能导致一些之前被接受的格式错误的编码现在被拒绝。
密码学和安全:
-
crypto: 新增
MessageSigner签名接口和SignMessage函数,用于支持需要自己对被签名消息进行哈希的签名者。修改fips140GODEBUG 设置后现在为无操作。SHA-1、SHA-256 和 SHA-512 在 amd64 上没有 AVX2 指令时现在性能更差。 -
crypto/ecdsa: 新增低级编码函数
ParseRawPrivateKey、ParseUncompressedPublicKey、PrivateKey.Bytes和PublicKey.Bytes。FIPS 140-3 模式下签名速度提升 4 倍。 -
crypto/ed25519: FIPS 140-3 模式下签名速度提升 4 倍。
-
crypto/elliptic: 移除了隐藏的未文档化的
Inverse和CombinedMult方法。 -
crypto/rsa:
PublicKey不再声称模数值被视为机密。RSA 密钥生成速度提升 3 倍。 -
crypto/sha1: amd64 上有 SHA-NI 指令时,哈希速度提升 2 倍。
-
crypto/sha3: Apple M 处理器上哈希速度提升 2 倍。新增
SHA3.Clone方法。 -
crypto/tls: 新增
ConnectionState.CurveID字段表示密钥交换机制;新增Config.GetEncryptedClientHelloKeys回调。SHA-1 签名算法在 TLS 1.2 握手中现已禁用(RFC 9155),可通过tlssha1=1GODEBUG 设置重新启用。FIPS 140-3 模式下,TLS 1.2 现要求扩展主密钥,且允许 Ed25519 和 X25519MLKEM768。TLS 服务器现优先选择最高支持的协议版本。TLS 客户端和服务器现在更严格地遵循规范,拒绝不符合规范的行为。 -
crypto/x509:
CreateCertificate、CreateCertificateRequest和CreateRevocationList现在支持crypto.MessageSigner签名接口。CreateCertificate现在使用截断 SHA-256 填充缺失的SubjectKeyId(可通过x509sha256skid=0GODEBUG 设置回退到 SHA-1)。ParseCertificate现在拒绝包含负值 pathLenConstraint 的 BasicConstraints 扩展的证书,以及处理 ASN.1 T61String 和 BMPString 类型时更加一致。
调试和分析:
- debug/elf: 新增
PT_RISCV_ATTRIBUTES和SHT_RISCV_ATTRIBUTES常量用于 RISC-V ELF 解析。
代码分析和编译:
-
go/ast:
FilterPackage、PackageExports和MergePackageFiles函数已弃用。新增PreorderStack函数,提供 AST 遍历和节点堆栈。 -
go/parser:
ParseDir函数已弃用。 -
go/token: 新增
FileSet.AddExistingFiles方法,可向 FileSet 添加现有 File,或为任意 File 集合构造 FileSet。 -
go/types:
Var新增Kind方法用于分类变量(包级、接收器、参数、结果、局部变量或结构字段)。新增LookupSelection函数,类似LookupFieldOrMethod但返回Selection形式的结果。
哈希和日志:
-
hash: 新增
XOF接口用于实现可扩展输出函数(如 SHAKE)。所有标准库 Hash 实现现都实现Cloner接口,可通过该接口获得 Hash 状态的拷贝。 -
hash/maphash: 新增
Hash.Clone方法实现hash.Cloner接口。 -
log/slog: 新增
GroupAttrs函数从 Attr 切片创建组 Attr。Record新增Source方法返回源位置或 nil。
MIME 和网络:
-
mime/multipart: 新增
FileContentDisposition辅助函数用于构建 multipart Content-Disposition 头字段。 -
net:
LookupMX和Resolver.LookupMX现在返回看起来像有效 IP 地址的 DNS 名称以及有效域名(根据规范之前会丢弃 IP 地址,但实际中某些名称服务器会返回 IP 地址)。Windows 上ListenMulticastUDP现支持 IPv6 地址。Windows 上实现了FileConn、FilePacketConn和FileListener函数用于 os.File 和网络连接的相互转换,同时TCPConn、UDPConn、UnixConn、IPConn、TCPListener和UnixListener的File方法也已实现。 -
net/http: 新增
CrossOriginProtection实现 CSRF 防护,使用现代浏览器 Fetch 元数据,无需 token 或 cookie,支持基于来源和模式的绕过。
操作系统和文件系统:
-
io/fs: 新增
ReadLinkFS接口提供读取符号链接的能力。 -
os: Windows 上
NewFile现支持为异步 I/O 打开的句柄(FILE_FLAG_OVERLAPPED),通过关联到运行时的 I/O 完成端口提供好处。DirFS和Root.FS实现io/fs.ReadLinkFS接口。CopyFS支持在复制实现io/fs.ReadLinkFS的文件系统时复制符号链接。Root新增多个方法:Chmod、Chown、Chtimes、Lchown、Link、MkdirAll、ReadFile、Readlink、RemoveAll、Rename、Symlink、WriteFile。
反射和模式:
-
reflect: 新增
TypeAssert函数用于将 Value 直接转换为给定类型的 Go 值,避免不必要的内存分配。 -
regexp/syntax:
\p{name}和\P{name}现接受更多名称(Any、ASCII、Assigned、Cn、LC)和 Unicode 类别别名(如\p{Letter}代表\pL)。遵循 Unicode TR18,现在使用不区分大小写的名称查找。
运行时和测试:
-
runtime:
AddCleanup清理函数现并发和并行执行。新增SetDefaultGOMAXPROCS函数重置为运行时默认值。新增checkfinalizers=1GODEBUG 设置用于诊断 finalizers 和 cleanups 相关问题。 -
runtime/pprof: mutex 竞争配置文件现在正确指向导致延迟的临界区末尾。
runtimecontentionstacksGODEBUG 设置已移除。 -
sync: 新增
WaitGroup.Go方法简化 goroutine 创建和计数。 -
testing: 新增
T.Attr、B.Attr和F.Attr方法向测试日志发送属性(以 "attr" action 形式出现在-json标志输出中)。新增Output方法提供io.Writer写入测试输出流(与TB.Log相同但不包括文件和行号)。AllocsPerRun在并行测试运行时现在 panic(此行为帮助捕获这类 bug)。 -
testing/fstest:
MapFS实现io/fs.ReadLinkFS接口。TestFS验证io/fs.ReadLinkFS接口功能(如已实现),并不再跟随符号链接以避免无限递归。
Unicode 和值实习:
-
unicode: 新增
CategoryAliases映射提供访问类别别名(如"Letter"代表"L")。新增Cn(未分配码点)和LC(大小写字母)类别(这些之前虽由 Unicode 定义但在 Go 早期版本中误被省略)。C类别现在包括Cn,包括所有未分配的码点。 -
unique: 更积极、高效且并行地回收实习值,防止大量唯一值实习时的内存爆炸。
Make的值包含 Handle 链时,现在在单个垃圾回收周期内快速收集,无需多个周期。
平台支持
Darwin (macOS)
- Go 1.25 要求 macOS 12 Monterey 或更高版本。对之前版本的支持已停止。
Windows
- Go 1.25 是包含损坏的 32 位 windows/arm 端口的最后一个版本。它将在 Go 1.26 中移除。
AMD64
- 在
GOAMD64=v3模式或更高模式下,编译器现在使用融合乘加指令使浮点运算更快更准确。这可能会改变程序生成的精确浮点值。为避免融合,可使用显式的float64强制转换,如float64(a*b)+c。
Loong64
- linux/loong64 端口现支持竞态检测器,可使用
runtime.SetCgoTraceback从 C 代码收集回溯信息,支持内部链接模式链接 cgo 程序。
RISC-V
- linux/riscv64 端口现支持
plugin构建模式。 GORISCV64环境变量现接受新值rva23u64,用于选择 RVA23U64 用户模式应用配置。
兼容性说明
Go 1.25 继续遵循 Go 1 兼容性承诺。几乎所有 Go 程序都应继续按预期编译和运行。
弃用
以下内容已弃用,计划在未来版本中移除:
- go/ast:
FilterPackage、PackageExports、MergePackageFiles函数和MergeMode类型,仅用于已弃用的Object和Package机制。 - go/parser:
ParseDir函数已弃用。 - testing/synctest: 如设置
GOEXPERIMENT=synctest,旧 API 仍然存在,但将在 Go 1.26 中移除。
参考资源
更多详细信息请参考官方发布说明:Go 1.25 Release Notes