Go 1.24 发行说明

Go 1.24 简介

最新发布的 Go 版本 1.24 将于 2025 年 2 月 发布,比 Go 1.23 晚六个月。其大部分改动集中在工具链、运行时和库的实现上。一如既往,本次发布也遵循 Go 1 兼容性承诺。我们预计绝大多数 Go 程序都能像以前一样继续编译和运行。

语言变化

Go 1.24 现在完全支持 泛型类型别名:类型别名可以像定义类型一样进行参数化。详情请参阅 语言规范。目前,可以通过设置 GOEXPERIMENT=noaliastypeparams 来禁用此功能;但 aliastypeparams 设置将在 Go 1.25 中移除。

工具

Go 命令

Go 模块现在可以使用 go.mod 中的 tool 指令来跟踪可执行依赖项。这消除了之前通过将工具作为空白导入添加到命名为“tools.go”的文件的变通方法。go tool 命令现在可以运行这些工具,以及 Go 发行版自带的工具。更多信息请参阅 文档

go get 命令的新 -tool 标志会在为命名包添加 require 指令的同时,为当前模块添加 tool 指令。

新的 tool 元模式 指的是当前模块中的所有工具。可以使用 go get tool 来升级它们,或使用 go install tool 将它们安装到 GOBIN 目录。

go run 命令和新的 go tool 行为现在会将可执行文件缓存在 Go 构建缓存中。这使得重复执行速度更快,但会增加缓存的大小。请参阅 #69290

go buildgo install 命令现在接受 -json 标志,该标志会将构建输出和失败信息以结构化的 JSON 格式报告到标准输出。有关报告格式的详细信息,请参阅 go help buildjson

此外,go test -json 现在会以 JSON 格式报告构建输出和失败信息,并与测试结果 JSON 交错。这些可以通过新的 Action 类型区分,但如果这在测试集成系统中引起问题,您可以使用 GODEBUG 设置 gotestjsonbuildtext=1 恢复到文本构建输出。

新的 GOAUTH 环境变量提供了一种灵活的方式来认证私有模块的获取。有关更多信息,请参阅 go help goauth

go build 命令现在会在编译后的二进制文件中设置 主模块版本,该版本基于版本控制系统的标签和/或提交。如果存在未提交的更改,则会附加 +dirty 后缀。使用 -buildvcs=false 标志可以从二进制文件中省略版本控制信息。

新的 GODEBUG 设置 toolchaintrace=1 可用于跟踪 go 命令的工具链选择过程。

Cgo

Cgo 支持用于 C 函数的新注解,以提高运行时性能。#cgo noescape cFunctionName 告诉编译器传递给 C 函数 cFunctionname 的内存不会逃逸。#cgo nocallback cFunctionName 告诉编译器 C 函数 cFunctionName 不会回调到任何 Go 函数。有关更多信息,请参阅 cgo 文档

Cgo 目前拒绝编译对具有多个不兼容声明的 C 函数的调用。例如,如果 f 被声明为 void f(int)void f(double),cgo 将报告一个错误,而不是可能为 f(0) 生成不正确的调用序列。此版本的新增功能是,当不兼容的声明出现在不同的文件中时,能够更好地检测到此错误情况。请参阅 #67699

Objdump

objdump 工具现在支持 64 位 LoongArch (GOARCH=loong64)、RISC-V (GOARCH=riscv64) 和 S390X (GOARCH=s390x) 的反汇编。

Vet

新的 tests 分析器报告测试包中声明的测试、fuzzers、基准和示例的常见错误,例如名称格式错误、签名不正确或文档中不存在标识符的示例。其中一些错误可能导致测试无法运行。此分析器属于 go test 运行的分析器子集。

现有的 printf 分析器现在会报告对 fmt.Printf(s) 形式调用的诊断,其中 s 是一个非常量格式字符串,没有其他参数。此类调用几乎总是错误,因为 s 的值可能包含 % 符号;请改用 fmt.Print。请参阅 #60529。此检查倾向于在现有代码中产生发现,因此仅在语言版本(由 go.mod go 指令或 //go:build 注释指定)至少为 Go 1.24 时才应用,以避免在更新到 1.24 Go 工具链时导致持续集成失败。

现有的 buildtag 分析器现在会在 //go:build 指令中存在无效的 Go 主要版本构建约束时报告诊断。例如,//go:build go1.23.1 指的是一个点发布;请改用 //go:build go1.23。请参阅 #64127

现有的 copylock 分析器现在会在 3 节“for”循环(例如 for i := iter(); done(i); i = next(i) { ... })中声明的变量包含 sync.Locker(如 sync.Mutex)时报告诊断。Go 1.22 更改了这些循环的行为,为每次迭代创建一个新变量,并从前一次迭代复制值;此复制操作对锁不安全。请参阅 #66387

GOCACHEPROG

cmd/go 内部二进制文件和测试缓存机制现在可以通过实现 cmd/go 工具和 GOCACHEPROG 环境变量指定的子进程之间的 JSON 协议的子进程来实现。这以前是隐藏在 GOEXPERIMENT 后面。有关协议详细信息,请参阅 文档

运行时

运行时的一些性能改进,在代表性基准测试套件的平均 CPU 开销降低了 2-3%。结果可能因应用程序而异。这些改进包括基于 Swiss Tables 的新内置 map 实现、对小对象的更高效内存分配以及新的运行时内部互斥锁实现。

新的内置 map 实现和新的运行时内部互斥锁可以通过在构建时分别设置 GOEXPERIMENT=noswissmapGOEXPERIMENT=nospinbitmutex 来禁用。

编译器

编译器已经不允许为 cgo 生成的接收者类型定义新方法,但可以通过别名类型规避该限制。Go 1.24 现在始终报告错误,如果接收者直接或间接(通过别名类型)表示 cgo 生成的类型。

链接器

在默认情况下,链接器现在会在 ELF 平台上生成 GNU 构建 ID(ELF NT_GNU_BUILD_ID 注释),在 macOS 上生成 UUID(Mach-O LC_UUID 加载命令)。构建 ID 或 UUID 源自 Go 构建 ID。可以通过 -B none 链接器标志禁用它,或通过 -B 0xNNNN 链接器标志以及用户指定的十六进制值来覆盖它。

引导

正如 Go 1.22 发行说明中所述,Go 1.24 现在需要 Go 1.22.6 或更高版本才能引导。我们预计 Go 1.26 将需要 Go 1.24 的点发布或更高版本才能引导。

标准库

目录限制的文件系统访问

新的 os.Root 类型提供了在特定目录内执行文件系统操作的能力。

os.OpenRoot 函数打开一个目录并返回一个 os.Rootos.Root 上的方法在目录内操作,并且不允许使用指向目录外部位置的路径,包括那些跟随符号链接出目录的路径。os.Root 上的方法镜像了 os 包中几乎所有可用的文件系统操作,例如 os.Root.Openos.Root.Createos.Root.Mkdiros.Root.Stat

新的基准测试函数

基准测试现在可以使用更快、更不易出错的 testing.B.Loop 方法来执行基准测试迭代,例如 for b.Loop() { ... },而不是涉及 b.N 的典型循环结构,如 for range b.N。这提供了两个显著的优势:

  • 基准测试函数将在每个 -count 执行一次,因此昂贵的设置和清理步骤仅执行一次。
  • 函数调用参数和结果会保持存活,防止编译器完全优化掉循环体。

改进的 finalizers

新的 runtime.AddCleanup 函数是一种 finalization 机制,它比 runtime.SetFinalizer 更灵活、更高效、更不易出错。AddCleanup 将一个清理函数附加到一个对象上,该函数将在对象不再可达时运行。但是,与 SetFinalizer 不同的是,可以将多个清理函数附加到同一个对象上,可以将清理函数附加到内部指针上,清理函数通常不会在对象形成循环时导致内存泄漏,并且清理函数不会延迟对象或其指向的对象被释放。新代码应优先使用 AddCleanup 而不是 SetFinalizer

新的 weak 包

新的 weak 包提供了弱指针。

弱指针是一种低级原语,用于创建内存高效的数据结构,例如用于关联值的弱映射、用于任何未被 unique 包覆盖的规范化映射以及各种缓存。为了支持这些用例,此版本还提供了 runtime.AddCleanupmaphash.Comparable

新 crypto/mlkem 包

新的 crypto/mlkem 包实现了 ML-KEM-768 和 ML-KEM-1024。

ML-KEM 是一种后量子密钥交换机制,以前称为 Kyber,并在 FIPS 203 中进行了规定。

新 crypto/hkdf、crypto/pbkdf2 和 crypto/sha3 包

新的 crypto/hkdf 包实现了 HMAC 提取和扩展密钥派生函数 HKDF,如 RFC 5869 所定义。

新的 crypto/pbkdf2 包实现了基于密码的密钥派生函数 PBKDF2,如 RFC 8018 所定义。

新的 crypto/sha3 包实现了 SHA-3 哈希函数以及 SHAKE 和 cSHAKE 可扩展输出函数,如 FIPS 202 所定义。

这三个包都基于预先存在的 golang.org/x/crypto/... 包。

FIPS 140-3 合规性

此版本包含 一套新的机制,以促进 FIPS 140-3 合规性

Go Cryptographic Module 是一组内部标准库包,用于透明地实现 FIPS 140-3 批准的算法。应用程序无需更改即可使用 Go Cryptographic Module 来实现批准的算法。

新的 GOFIPS140 环境变量可用于在构建中选择要使用的 Go Cryptographic Module 版本。新的 fips140 GODEBUG 设置可用于在运行时启用 FIPS 140-3 模式。

Go 1.24 包含 Go Cryptographic Module 版本 v1.0.0,目前正在与 CMVP 认可的实验室进行测试。

新的实验性 testing/synctest 包

新的实验性 testing/synctest 包提供了对并发代码测试的支持。

  • synctest.Run 函数在一个隔离的“气泡”中启动一组 goroutine。在气泡中,time 包函数操作于一个伪造的时钟。
  • synctest.Wait 函数等待当前气泡中的所有 goroutine 阻塞。

有关更多详细信息,请参阅包文档。

synctest 包是实验性的,必须通过在构建时设置 GOEXPERIMENT=synctest 来启用。包 API 在未来的版本中可能会发生变化。有关更多信息和提供反馈,请参阅 issue #67434

对库的微小更改

archive

archive/ziparchive/tar 中的 (*Writer).AddFS 实现现在为已空目录写入目录头。

bytes

bytes 包添加了几个处理迭代器的函数。

  • Lines 返回一个字节切片中以换行符结尾的行的迭代器。
  • SplitSeq 返回一个按分隔符分割的字节切片子切片迭代器。
  • SplitAfterSeq 返回一个在每次出现分隔符后分割的字节切片子切片迭代器。
  • FieldsSeq 返回一个根据 unicode.IsSpace 定义的,按空白字符运行分割的字节切片子切片迭代器。
  • FieldsFuncSeq 返回一个按满足谓词的 Unicode 代码点运行分割的字节切片子切片迭代器。

crypto/aes

NewCipher 返回的值不再实现 NewCTRNewGCMNewCBCEncrypterNewCBCDecrypter 方法。这些方法是未文档化的,并且并非在所有架构上都可用。相反,应该将 Block 值直接传递给相关的 crypto/cipher 函数。目前,crypto/cipher 仍然会检查 Block 值上的这些方法,即使它们不再被标准库使用。

crypto/cipher

新的 NewGCMWithRandomNonce 函数返回一个实现 AES-GCM 的 AEAD,它会在 Seal 时生成一个随机 nonce 并将其前置到密文中。

当与 crypto/aes 一起使用时,NewCTR 返回的 Stream 实现现在在 amd64 和 arm64 上速度提高了数倍。

NewOFBNewCFBEncrypterNewCFBDecrypter 现在已弃用。OFB 和 CFB 模式不进行身份验证,这通常允许主动攻击来操纵和恢复明文。建议应用程序改用 AEAD 模式。如果需要未经验证的 Stream 模式,请改用 NewCTR

crypto/ecdsa

PrivateKey.Sign 现在根据 RFC 6979 生成确定性签名(如果随机源为 nil)。

crypto/md5

md5.New 返回的值现在也实现了 encoding.BinaryAppender 接口。

crypto/rand

Read 函数现在保证不会失败。它将始终返回 nil 作为 error 结果。如果 Read 在从 Reader 读取时遇到错误,程序将不可挽回地崩溃。请注意,默认 Reader 使用的平台 API 文档表明总是成功,因此此更改只会影响重写 Reader 变量的程序。一个例外是 3.17 版本之前的 Linux 内核,其中默认 Reader 仍然打开 /dev/urandom 并且可能会失败。

在 Linux 6.11 及更高版本上,Reader 现在通过 vDSO 使用 getrandom 系统调用。这速度更快,特别是对于小读取。

在 OpenBSD 上,Reader 现在使用 arc4random_buf(3)

新的 Text 函数可用于生成加密安全的随机文本字符串。

crypto/rsa

GenerateKey 现在会在请求小于 1024 位的密钥时返回错误。所有 Sign、Verify、Encrypt 和 Decrypt 方法现在在与小于 1024 位的密钥一起使用时返回错误。此类密钥不安全,不应使用。使用 GODEBUG 设置 rsa1024min=0 可以恢复旧行为,但我们建议仅在必要时且仅在测试中使用,例如通过将 //go:debug rsa1024min=0 行添加到测试文件中。新的 GenerateKey 示例 提供了一个易于使用的标准 2048 位测试密钥。

现在可以在 PrivateKey.Validate 之前安全且更高效地调用 PrivateKey.Precompute。在存在部分填充的 PrecomputedValues 的情况下,Precompute 现在速度更快,例如在从 JSON unmarshal 密钥时。

该包现在拒绝更多无效密钥,即使没有调用 Validate,并且 GenerateKey 可能会因损坏的随机源而返回新错误。PrivateKeyPrimesPrecomputed 字段现在使用并验证,即使某些值丢失。另请参阅下面 描述的 crypto/x509 解析和 marshaling RSA 密钥的变化

SignPKCS1v15VerifyPKCS1v15 现在支持 SHA-512/224、SHA-512/256 和 SHA-3。

GenerateKey 现在使用略有不同的方法来生成私有指数(Carmichael 的欧拉函数而不是欧拉的欧拉函数)。极少数从仅素数因子外部重新生成密钥的应用程序可能会产生不同但兼容的结果。

在 wasm 上,公钥和私钥操作现在速度提高了一倍。

crypto/sha1

sha1.New 返回的值现在也实现了 encoding.BinaryAppender 接口。

crypto/sha256

sha256.Newsha256.New224 返回的值现在也实现了 encoding.BinaryAppender 接口。

crypto/sha512

sha512.Newsha512.New384sha512.New512_224sha512.New512_256 返回的值现在也实现了 encoding.BinaryAppender 接口。

crypto/subtle

新的 WithDataIndependentTiming 函数允许用户运行一个函数,其中启用特定于体系结构的特性,这些特性保证特定的指令是数据值时间不变的。这可以用来确保设计为在恒定时间内运行的代码不会被 CPU 级特性优化为在可变时间内运行。目前,WithDataIndependentTiming 使用 arm64 上的 PSTATE.DIT 位,在所有其他体系结构上则不起作用。GODEBUG 设置 dataindependenttiming=1 会为整个 Go 程序启用 DIT 模式。

XORBytes 的输出必须完全重叠或完全不重叠。以前,行为是未定义的,而现在 XORBytes 会 panic。

crypto/tls

TLS 服务器现在支持加密客户端问候 (ECH)。可以通过填充 Config.EncryptedClientHelloKeys 字段来启用此功能。

新的后量子 X25519MLKEM768 密钥交换机制现在受支持,并且在 Config.CurvePreferences 为 nil 时默认启用。GODEBUG 设置 tlsmlkem=0 会恢复默认值。当处理有 bug 的 TLS 服务器(它们无法正确处理大记录,导致握手超时)时,这可能很有用(参见 TLS post-quantum TL;DR fail)。

已移除对实验性 X25519Kyber768Draft00 密钥交换的支持。

密钥交换顺序现在完全由 crypto/tls 包处理。Config.CurvePreferences 的顺序现在被忽略,并且当字段被填充时,其内容仅用于确定启用哪些密钥交换。

新的 ClientHelloInfo.Extensions 字段列出了在 Client Hello 消息中收到的扩展 ID。这对于 TLS 客户端指纹识别很有用。

crypto/x509

x509sha1 GODEBUG 设置已被移除。Certificate.Verify 不再支持 SHA-1 签名。

OID 现在实现了 encoding.BinaryAppenderencoding.TextAppender 接口。

默认证书策略字段已从 Certificate.PolicyIdentifiers 更改为 Certificate.Policies。解析证书时,两个字段都将被填充,但在创建证书时,策略将从 Certificate.Policies 字段而不是 Certificate.PolicyIdentifiers 字段中获取。此更改可以通过 GODEBUG 设置 x509usepolicies=0 来恢复。

当传递一个带有 nil Certificate.SerialNumber 字段的模板时,CreateCertificate 现在将使用符合 RFC 5280 的方法生成序列号,而不是失败。

Certificate.Verify 现在支持策略验证,如 RFC 5280 和 RFC 9618 所定义。新的 VerifyOptions.CertificatePolicies 字段可以设置为一组可接受的策略 OIDs。只有具有有效策略图的证书链才会从 Certificate.Verify 返回。

MarshalPKCS8PrivateKey 现在返回一个错误,而不是 marshaling 一个无效的 RSA 密钥。(MarshalPKCS1PrivateKey 没有错误返回,并且在提供无效密钥时的行为仍然是未定义的。)

ParsePKCS1PrivateKeyParsePKCS8PrivateKey 现在使用并验证编码的 CRT 值,因此可能会拒绝以前接受的无效 RSA 密钥。使用 GODEBUG 设置 x509rsacrt=0 来恢复重新计算 CRT 值。

debug/elf

debug/elf 包增加了对处理动态 ELF(可执行和可链接格式)文件中的符号版本支持。新的 File.DynamicVersions 方法返回 ELF 文件中定义的动态版本列表。新的 File.DynamicVersionNeeds 方法返回此 ELF 文件在其他 ELF 对象中定义的动态版本列表。最后,新的 Symbol.HasVersionSymbol.VersionIndex 字段指示符号的版本。

encoding

引入了两个新接口:TextAppenderBinaryAppender,用于将对象的文本或二进制表示附加到字节切片。这些接口提供了与 TextMarshalerBinaryMarshaler 相同的功能,但它们不是每次都分配新切片,而是将数据直接附加到现有切片。这些接口现在由已经实现了 TextMarshaler 和/或 BinaryMarshaler 的标准库类型实现。

encoding/json

在 marshaling 时,如果 struct 字段的 omitzero 选项(在 struct 字段标签中)的值为零,则该字段将被省略。如果字段类型具有 IsZero() bool 方法,则使用该方法来确定值是否为零。否则,当值为 其类型的零值时,该值为零。omitzero 字段标签比 omitempty 更清晰且不易出错,当意图是省略零值时。特别是,与 omitempty 不同,omitzero 会省略零值的 time.Time 值,这是一个常见的摩擦点。

如果同时指定了 omitemptyomitzero,则当值为空或为零(或两者)时,该字段将被省略。

UnmarshalTypeError.Field 现在包含嵌入式 struct,以提供更详细的错误消息。

go/types

所有暴露使用 Len() intAt(int) T 对方法序列的 go/types 数据结构现在也都具有返回迭代器的方法,这允许您简化如下代码:

params := fn.Type.(*types.Signature).Params()
for i := 0; i < params.Len(); i++ {
   use(params.At(i))
}

到如下代码:

for param := range fn.Signature().Params().Variables() {
   use(param)
}

这些方法是:Interface.EmbeddedTypesInterface.ExplicitMethodsInterface.MethodsMethodSet.MethodsNamed.MethodsScope.ChildrenStruct.FieldsTuple.VariablesTypeList.TypesTypeParamList.TypeParamsUnion.Terms

hash/adler32

New 返回的值现在也实现了 encoding.BinaryAppender 接口。

hash/crc32

NewNewIEEE 返回的值现在也实现了 encoding.BinaryAppender 接口。

hash/crc64

New 返回的值现在也实现了 encoding.BinaryAppender 接口。

hash/fnv

New32New32aNew64New64aNew128New128a 返回的值现在也实现了 encoding.BinaryAppender 接口。

hash/maphash

新的 ComparableWriteComparable 函数可以计算任何可比较值的哈希值。这使得可以哈希任何可以用作 Go map 键的值。

日志/slog

新的 DiscardHandler 是一个永远不会被启用且始终丢弃其输出的 handler。

LevelLevelVar 现在实现了 encoding.TextAppender 接口。

math/big

FloatIntRat 现在实现了 encoding.TextAppender 接口。

math/rand

调用已弃用的顶级 Seed 函数不再生效。要恢复旧行为,请使用 GODEBUG 设置 randseednop=0。有关更多背景信息,请参阅 proposal #67273

math/rand/v2

ChaCha8PCG 现在实现了 encoding.BinaryAppender 接口。

net

ListenConfig 在支持 MPTCP 的系统上(目前仅限 Linux)默认使用 MPTCP。

IP 现在实现了 encoding.TextAppender 接口。

net/http

Transport 对收到 1xx 信息性响应的限制已更改。之前,它会在收到超过 5 个 1xx 响应后中止请求并返回错误。现在,如果所有 1xx 响应的总大小超过 Transport.MaxResponseHeaderBytes 配置设置,它将返回错误。

此外,当请求具有 net/http/httptrace.ClientTrace.Got1xxResponse trace hook 时,1xx 响应的总数不再有限制。Got1xxResponse hook 可以返回一个错误来中止请求。

TransportServer 现在有一个 HTTP2 字段,允许配置 HTTP/2 协议设置。

新的 Server.ProtocolsTransport.Protocols 字段提供了一种简单的方法来配置服务器或客户端使用的 HTTP 协议。

服务器和客户端可以配置为支持未加密的 HTTP/2 连接。

Server.Protocols 包含 UnencryptedHTTP2 时,服务器将在未加密的端口上接受 HTTP/2 连接。服务器可以在同一个端口上接受 HTTP/1 和未加密的 HTTP/2。

Transport.Protocols 包含 UnencryptedHTTP2 且不包含 HTTP1 时,传输将对 http:// URL 使用未加密的 HTTP/2。如果传输配置为同时使用 HTTP/1 和未加密的 HTTP/2,它将使用 HTTP/1。

未加密的 HTTP/2 支持使用“带优先知识的 HTTP/2”(RFC 9113,第 3.3 节)。已弃用的“Upgrade: h2c”头不受支持。

net/netip

AddrAddrPortPrefix 现在实现了 encoding.BinaryAppenderencoding.TextAppender 接口。

net/url

URL 现在也实现了 encoding.BinaryAppender 接口。

os/user

在 Windows 上,Current 现在可以在 Windows Nano Server 中使用。实现已更新,避免使用 NetApi32 库中的函数,该库在 Nano Server 中不可用。

在 Windows 上,CurrentLookupLookupId 现在支持以下内置服务用户帐户:

  • NT AUTHORITY\SYSTEM
  • NT AUTHORITY\LOCAL SERVICE
  • NT AUTHORITY\NETWORK SERVICE

在 Windows 上,当当前用户加入一个慢速域时(这对于许多企业用户来说是常见情况),Current 的速度显著加快。新实现的性能现在是毫秒级的,而之前的实现可能需要几秒钟甚至几分钟才能完成。

在 Windows 上,当当前线程模拟另一个用户时,Current 现在会返回进程所有者的用户。以前,它会返回一个错误。

regexp

Regexp 现在实现了 encoding.TextAppender 接口。

runtime

GOROOT 函数现在已弃用。在新代码中,建议使用系统路径来定位“go”二进制文件,并使用 go env GOROOT 来查找其 GOROOT。

strings

strings 包添加了几个处理迭代器的函数。

  • Lines 返回一个字符串中以换行符结尾的行的迭代器。
  • SplitSeq 返回一个按分隔符分割的字符串子字符串迭代器。
  • SplitAfterSeq 返回一个在每次出现分隔符后分割的字符串子字符串迭代器。
  • FieldsSeq 返回一个根据 unicode.IsSpace 定义的,按空白字符运行分割的字符串子字符串迭代器。
  • FieldsFuncSeq 返回一个按满足谓词的 Unicode 代码点运行分割的字符串子字符串迭代器。

sync

sync.Map 的实现已更改,提高了性能,尤其是在地图修改方面。例如,修改不相交键集合的地图在高并发地图上发生冲突的可能性大大降低,并且地图从低并发负载中获得的性能不再需要有任何启动时间。

如果您遇到任何问题,请在构建时设置 GOEXPERIMENT=nosynchashtriemap 来切换回旧实现,并请 提交 issue

testing

新的 T.ContextB.Context 方法返回一个上下文,该上下文在测试完成并且测试清理函数运行之前被取消。

新的 T.ChdirB.Chdir 方法可用于在测试或基准测试期间更改工作目录。

text/template

模板现在支持 range-over-func 和 range-over-int。

time

Time 现在实现了 encoding.BinaryAppenderencoding.TextAppender 接口。

移植

Linux

正如 Go 1.23 发行说明 中公布 的那样,Go 1.24 需要 Linux 内核版本 3.2 或更高版本。

Darwin

Go 1.24 是最后一个支持 macOS 11 Big Sur 的版本。Go 1.25 将需要 macOS 12 Monterey 或更高版本。

WebAssembly

添加了 go:wasmexport 编译器指令,供 Go 程序将函数导出到 WebAssembly 主机。

在 WebAssembly 系统接口预览版 1 (GOOS=wasip1 GOARCH=wasm) 上,Go 1.24 支持通过指定 -buildmode=c-shared 构建标志将 Go 程序构建为 reactor/library

现在允许更多类型作为 go:wasmimport 函数的参数或结果类型。具体来说,允许使用 boolstringuintptr 以及指向某些类型的指针(有关详细信息,请参阅 文档),以及 32 位和 64 位整数和浮点类型,以及已允许的 unsafe.Pointer。这些类型也允许作为 go:wasmexport 函数的参数或结果类型。

WebAssembly 的支持文件已从 misc/wasm 移动到 lib/wasm

初始内存大小显著减小,特别是对于小型 WebAssembly 应用程序。

Windows

32 位 Windows/ARM 端口 (GOOS=windows GOARCH=arm) 已被标记为损坏。有关详细信息,请参阅 issue #70705