去1.24

去1.24

六个月后,Go 语言 1.24 版正式发布 去1.23。大多数变化都发生在工具链、运行时和库的实现中。与往常一样,该版本提供 兼容性承诺 Go 1. 语言设计者期望几乎所有的Go程序都能像以前一样继续编译和运行。

语言的变化

Go 1.24 现已完全支持 泛型类型别名:类型别名可以参数化为声明的类型。详情 语言规范。目前,可以通过设置 GOEXPERIMENT=noaliastypeparams 来禁用此功能;但是,aliastypeparams 选项将在 Go 1.25 中删除。

工具

Go 命令

Go 模块现在可以使用 go.mod 中的工具指令跟踪可执行依赖项。这样就不再需要以前的解决方法,即在通常名为“tools.go”的文件中将工具作为空导入添加。 go tool 命令现在除了可以运行 Go 自带的工具之外,还可以运行这些工具。更多信息请访问 文件资料.

go get 的新 -tool 标志除了添加 require 指令外,还会将工具指令添加到指定包的当前模块。

元模式工具 指当前模块中的所有工具。这可以用来通过 go get 工具更新它们全部,或者通过 go install 工具将它们安装到你的 GOBIN 目录中。

通过 go run 和新的 go tool 行为创建的可执行文件现在缓存在 Go build 缓存中。由于缓存增加,这使得重复启动成为可能。 #69290 展位.

go build 和 go 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 设置 工具链跟踪=1 现在可以用来跟踪 go 命令中的工具链选择过程。

哥斯达黎加

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 工具现在支持在 64 位 LoongArch(GOARCH=loong64)、RISC-V(GOARCH=riscv64)和 S390X(GOARCH=s390x)上进行反汇编。

脂肪

新的测试分析器报告测试套件中的测试、模糊测试器、基准和示例声明中的常见错误,例如格式错误的名称、无效签名或记录不存在的标识符的示例。其中一些错误可能会导致测试失败。

现有的 printf 解析器现在报告形式 fmt.Printf(s) 的调用的诊断信息,其中 s 是没有其他参数的非常量格式字符串。这样的调用几乎总是会出错,因为 s 的值可能包含 % 字符;改用 fmt.Print。 60529。此检查倾向于在现有代码中查找内容,因此仅当语言版本(由 go.mod 文件的 go 指令或 `//go:build` 注释指定)至少为 Go 1.24 时才应用,以避免在升级到 Go 1.24 工具链时导致长时间的集成中断。

现有的 buildtag 分析器现在会在 buildtag 不正确时报告诊断信息 旧版本构建限制 进入 //go:build 指令。例如,//go:build go1.23.1 指的是点发布;而是使用 //go:build go1.23。 #64127 展位.

现有的 copylock 分析器现在在三重“for”循环中声明变量时报告诊断,例如 for i := iter();完成(i); i = next(i) { … },包含sync.Locker,比如sync.Mutex。 去1.22 改变了这种循环的行为,为每次迭代创建一个新变量,并复制上一次迭代中的值;这种复制对于锁来说并不安全。 #66387 展位.

戈卡切普罗

现在可以通过在 cmd/go 工具和 GOCACHEPROG 环境变量命名的子进程之间实现 JSON 协议的子进程来实现内部 cmd/go 二进制和测试缓存机制。以前它是用于 GOEXPERIMENT。协议的详细信息可以参见 文件资料.

完成时间

在一系列代表性基准测试中,几项运行时性能改进平均将 CPU 开销降低了 2-3%。结果可能因应用程序不同而有所差异。这些改进包括基于 瑞典餐桌、更高效的小对象内存分配,以及互斥锁的全新内部运行时实现。

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

编译器

编译器已经禁止使用 cgo 生成的接收器类型定义新方法,但可以通过类型别名解决此限制。如果接收器直接或间接(通过类型别名)表示 cgo 生成的类型,Go 1.24 现在总是报告错误。

链接器

链接器现在默认在 ELF 平台上生成 GNU 构建标识符(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 或更高版本的版本。

标准库

目录限制的文件系统访问

新型 操作系统根目录 提供在特定目录内执行文件系统操作的能力。

功能 OpenRoot 操作系统 打开目录并返回 操作系统根目录。方法 操作系统根目录 在该目录中操作,并且不允许路径引用目录外的位置,包括那些遵循目录外的符号链接的路径。 os.Root 上的方法反映了 os 包中可用的大多数文件系统操作,例如, 操作系统根目录打开, os.Root.创建, os.Root.创建目录 и 操作系统根目录状态.

新的基准测试功能

基准测试现在可以使用更快、更不容易出错的方法 测试.B.循环 对类似 for b.Loop() { … } 的基准进行迭代,而不是像 for range bN 这样的涉及 bN 的典型循环结构。这有两个显著的​​优点:

  • 基准测试函数每计数只执行一次,因此昂贵的设置和清理步骤仅执行一次。
  • 函数调用参数和结果仍然存在,从而阻止编译器完全优化循环体。

改进的终结器

新功能 运行时.AddCleanup 是一种比以下更灵活、更高效、更不容易出错的完成机制: 运行时.SetFinalizer。 AddCleanup 将清理函数附加到对象,该函数将在对象不可用时立即运行。但是,与 SetFinalizer 不同的是,可以将多个清理附加到单个对象,可以将清理附加到内部指针,当对象形成循环时,清理通常不会导致泄漏,并且清理不会延迟它指向的对象或对象的释放。新代码应该优先选择 AddCleanup 而不是 SetFinalizer。

新的弱包

新包装 提供弱指针。

弱指针是一种低级原语,用于创建内存高效的结构,例如用于映射值的弱字典、用于包未涵盖的任何内容的规范化字典。 独特的,以及各种类型的缓存。为了支持这些用例,此版本还提供了 运行时.AddCleanup и maphash.Comparable.

新的 crypto/mlkem 包

新包装 加密/mlkem 实现ML-KEM-768和ML-KEM-1024。

ML-KEM 是一种后量子密钥交换机制,以前称为 Kyber,在 第 203 章.

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

新包装 加密/hkdf 实现基于 HMAC 的“提取和扩展”密钥派生函数 HKDF,定义如下: RFC 5869.

新包装 加密/pbkdf2 实现基于密码的密钥派生函数 PBKDF2,定义如下 RFC 8018.

新包装 加密/sha3 实现 SHA-3 哈希函数以及 SHAKE 和 cSHAKE 可扩展输出函数,定义如下: 第 202 章.

所有三个软件包都基于现有的 golang.org/x/crypto/… 软件包。

符合 FIPS 140-3 标准

此版本包括 一套确保符合 FIPS 140-3 要求的新机制.

Go 加密模块是一组内部标准库包,透明地用于实现 FIPS 140-3 批准的算法。应用程序不需要进行更改即可使用已批准算法的 Go 加密模块。

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

Go 1.24 包含 Go 加密模块 v1.0.0,目前正在 CMVP 认可的实验室进行测试。

新的实验包 testing/synctest

新的实验包 测试/同步测试 提供对测试并发代码的支持。

  • 功能 同步测试.运行 在一个孤立的“气泡”中运行一组 goroutine。在封装函数的气泡中 根据错误的时钟进行操作。
  • 功能 同步测试.等待 等到所有 goroutine 都被阻塞在当前气泡中。

详细信息可以在包文档中找到。

synctest 包是实验性的,必须通过设置 GOEXPERIMENT=synctest 来启用。该包的 API 在未来版本中可能会发生变化。在 #67434 展位 您可以查看更多详细信息并提供反馈。

图书馆的细微变化

档案

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

字节

字节 添加几个与迭代器一起使用的函数:

  • 线 返回字节切片中换行符分隔的字符串的迭代器。
  • SplitSeq 返回一个遍历字节切片的所有子切片的迭代器,这些子切片由分隔符分隔。
  • 序列后拆分 返回字节切片的子切片上的迭代器,每次出现分隔符后进行分割。
  • 字段序列 返回一个迭代器,迭代围绕空格字符序列的字节切片的子切片,如定义 unicode.IsSpace
  • 字段函数顺序 返回一个迭代器,该迭代器针对满足谓词的 Unicode 代码点序列的字节切片的子切片进行迭代。

加密/aes

返回值 新奇弗 不再实现 NewCTR、NewGCM、NewCB​​CEncrypter 和 NewCB​​CDecrypter 方法。这些方法没有记录,并且不适用于所有架构。现在的意思 阻止 必须直接传递给适当的函数 密码/密码。目前,crypto/cipher 仍然会在 Block 值上检查这些方法,即使标准库不再支持它们。

密码/密码

新功能 NewGCMWithRandomNonce 回报 AEAD,它通过在 Seal 期间生成随机数并将其添加到密文前面来实现 AES-GCM。

履行 资讯,返回 新点击率 当与 加密/aes 现在在 amd64 和 arm64 上速度快了几倍。

新OFB, 新CFBEncrypter и 新CFB解密器 现已被宣布过时。 OFB 和 CFB 模式是未经认证的,通常允许主动攻击操纵和恢复明文。建议使用应用程序 AEAD 回报。如果未认证模式 资讯 必要时,可以使用 新点击率 代替。

加密/ecdsa

私钥签名 现在根据创建确定性签名 RFC 6979,如果随机源为零。

加密/MD5

返回值 md5文件,现在还实现了接口 编码.binaryappender.

加密/兰特

功能 了解 现在可以保证不会失败。如果 Read 在读取时遇到错误 读者,程序将永久终止。请注意,有记录显示默认 Reader 始终能成功运行,因此此更改只会影响覆盖 Reader 变量的程序。一个例外是 3.17 之前的 Linux 内核,其中默认读取器仍会打开 /dev/urandom 并且可能会失败。

在 Linux 6.11 及更高版本中,Reader 现在通过 vDSO 使用 getrandom 系统调用。这要快几倍,通常适用于小读取。

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

新功能 文本 现在可以生成加密安全的随机文本字符串。

加密/RSA

生成密钥 如果请求的密钥长度小于 1024 位,则会返回错误。如果使用的密钥大小小于 1024 位,则所有 Sign、Verify、Encrypt 和 Decrypt 方法都会返回错误。此类密钥不安全,不应使用。 设置 GODEBUG rsa1024min=0 恢复旧行为,但 Go 开发人员建议仅在必要时且仅在测试中执行此操作,例如在测试文件中添加行 //go:debug rsa1024min=0。新的 例子 GenerateKey 提供了一个易于使用的标准 2024 位测试密钥。

现在拨打电话更安全、更高效 私钥.预先计算私钥验证。在部分填充的情况下,预计算现在速度更快 预计算值,例如从 JSON 中提取密钥时。

即使未调用 Validate,该包现在也会拒绝更多无效密钥,并且 生成密钥 现在可以针对损坏的随机源返回新的错误。字段 素数 и 预先计算 结构 PrivateKey 即使缺少某些值,现在也会使用和验证。用于解析和提取 RSA 密钥的 crypto/x509 也发生了变化,如下所述。

SignPKCS1v15 и 验证PKCS1v15 现在支持SHA-512/224、SHA-512/256和SHA-3。

生成密钥 现在使用稍微不同的方法来生成私有指数(卡迈克尔函数而不是欧拉函数)。仅从素数外部重新生成密钥的罕见应用程序可能会产生不同但兼容的结果。

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

加密/SHA*

加密/微妙

新功能 数据独立时间 允许用户执行启用了特定于架构的特性的功能,以确保某些指令不会相对于数据值的时间而改变。这可用于确保编写的以恒定时间运行的代码尚未通过处理器级函数进行优化,以便它以可变时间运行。目前,WithDataIndependentTiming 在 arm64 上使用 PSTATE.DIT 位,在所有其他架构上不执行任何操作。 设置 GODEBUG dataindependenttiming=1 为整个 Go 程序启用 DIT 模式。

结论 异或字节 必须与输入完全重叠或者根本不重叠。以前,否则行为是未定义的,而现在 XORBytes 会引起恐慌。

加密/tls

TLS 服务器现在支持加密客户端 Hello (ECH)。填写字段即可启用该功能。 配置.加密客户端HelloKeys.

一种新的后量子密钥交换机制 X25519MLKEM768 现在默认支持并启用 配置曲线偏好 为零。 设置 GODEBUG tlsmlkem=0 返回默认值。

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

密钥交换顺序现在完全由 crypto/tls 包处理。命令 配置曲线偏好 现在被忽略,并且内容仅用于确定在填写字段时要包含哪些关键交换。

新领域 客户端HelloInfo.扩展 列出客户端 Hello 消息中收到的扩展标识符列表。这对于指纹识别 TLS 客户端很有用。

加密/x509

设置 GODEBUG x509sha1已被删除。 认证.验证 不再支持基于 SHA-1 的签名。

OID 现在实现接口 编码.binaryappender и 编码.TextAppender.

默认证书策略字段已从 证书.策略标识符证书.策略。解析证书时,两个字段都会被填充,但创建证书策略时,它们将从 Certification.Policies 字段而不是 Certification.PolicyIdentifiers 中获取。此更改可以恢复。 GODEBUG 设置 x509usepolicies=0。

创建证书 现在将在传递模板字段时使用符合 RFC 5280 的方法生成序列号 证书序列号 nil,而不是崩溃。

证书.验证 现在支持 RFC 5280 和 RFC 9618 中定义的策略验证。新字段 验证选项.证书政策 可以设置为一组可接受的策略 的OID。仅返回具有有效策略图的证书链 证书.验证.

MarshalPKCS8私钥 现在返回错误而不是检索无效的 RSA 密钥。 (MarshalPKCS1私钥 没有错误返回,并且当提供无效键时其行为仍然未定义。)

解析PKCS1PrivateKey и 解析PKCS8PrivateKey 现在使用并验证编码的 CRT 值,因此可以拒绝先前接受的无效 RSA 密钥。用法 GODEBUG 设置 x509rsacrt=0 返回重新计算 CRT 值。

调试/小精灵

调试/小精灵 增加了对处理动态 ELF(可执行和可链接格式)文件中的符号版本的支持。新方法 文件.动态版本 返回 ELF 文件中定义的动态版本列表。新方法 文件.动态版本需求 返回此 ELF 文件所需的、在其他 ELF 对象中定义的动态版本列表。最后,新领域 符号.HasVersion и 符号.版本索引 标明符号的版本。

编码

两个新界面 文本追加器 и 二进制追加器 被引入来将对象的文本或二进制表示添加到字节切片中。这些接口提供与 文本编组器 и 二进制编组器,但它们不是每次都分配一个新的切片,而是直接将数据附加到现有的切片中。这些接口当前由已经实现 TextMarshaler 和/或 BinaryMarshaler 的标准库类型实现。

编码/json

构建时,如果结构字段标签中具有新的 omitzero 选项的结构字段的值为零,则将被省略。如果字段类型具有 IsZero() bool 方法,则它将用于确定值是否为零。否则,如果 其类型的空值。当意图省略空值时,omitzero 字段标签比 omitempty 更简洁且更不容易出错。特别地,与 omitempty 不同,omitzero 省略零 时间.时间 价值观,这是问题的常见根源。

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

解析错误类型 现在包括内置结构以提供更详细的错误消息。

去/类型

所有公开方法对序列的 go/types 数据结构,例如 Len() int 和 At(int) T,现在也具有返回迭代器的方法,从而允许更简单的代码,如下所示:

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

关于这一点:

对于参数:=范围fn.Signature()。Params()。Variables(){使用(参数)}

方法: 接口.嵌入类型 接口.显式方法 接口.方法 方法集.方法 命名方法 范围.子项 结构.字段 元组.变量 类型列表.类型 类型参数列表.类型参数 联盟条款

哈希/*

记录/日志

丢弃处理程序 是一个永远不会启用并且始终丢弃其输出的处理程序。

水平 и 水平变量 现在实现接口 编码.TextAppender.

数学/*

听康迪格 现在在支持的系统上默认使用 MPTCP(目前仅限 Linux)。

IP 现在实现接口 编码.TextAppender.

网络/http

限制已改变 运输 对接收到的1xx信息做出响应以响应请求。以前,在收到超过 5 个 1xx 响应后,这将停止请求并返回错误。现在,仅当所有 1xx 响应的总大小超出配置设置时才会返回错误 传输.MaxResponseHeaderBytes.

此外,当请求具有跟踪钩子时 净/http/httptrace.ClientTrace.Got1xxResponse,现在答案1xx的总数没有限制。 Got1xxResponse钩子可以返回错误来停止请求。

运输 и 服务器 现在有一个 HTTP2 字段,允许配置 HTTP/2 协议设置。

新领域 服务器协议 и 传输协议 提供一种简单的方法来配置服务器或客户端使用的 HTTP 协议。

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

何时 服务器协议 包含 UnencrypterHTTP2,服务器将接受未加密端口上的 HTTP/2 连接。服务器可以在同一端口上同时接受 HTTP/1 和未加密的 HTTP/2。

何时 传输协议 包含 UnencryptedHTTP2 且不包含 HTTP1,传输将使用未加密的 HTTP/2 作为地址 http://. 如果传输配置为同时使用 HTTP/1 和未加密的 HTTP/2,则它将使用 HTTP/1。

对未加密的 HTTP/2 的支持使用“具有前向学习的 HTTP/2”(RFC 9113,第 3.3 节)。不支持已弃用的标头“Upgrade: h2c”。

净/netip

住所, 地址端口 и 字首 现在实现接口 编码.binaryappender и 编码.TextAppender.

网络/网址

网址 现在还实现了接口 编码.binaryappender.

操作系统/用户

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

在 Windows 上 电流, 查找 и 查找编号 现在支持以下内置用户服务账户:

  • NT授权系统
  • 北领地当局地方服务
  • NT AUTHORITY网络服务

在 Windows 上 电流 当当前用户加入较慢的域时,速度会显著加快,这是许多企业用户的常见情况。新实现的性能现在以毫秒为单位,而以前的实现可能需要几秒钟甚至几分钟才能完成。

在 Windows 上 电流 当当前线程模仿另一个用户时,现在返回进程所有者用户。此前这会返回一个错误。

正则表达式

正则表达式 现在实现接口 编码.TextAdapter.

运行

功能 现已弃用。在较新的环境中,您应该倾向于使用系统路径来定义“go”二进制文件,并使用 go env GOROOT 来定义 GOROOT。

字符串

字符串 增加了几个用于迭代器的函数:

  • 线 返回字符串中以换行符分隔的行的迭代器。
  • SplitSeq 返回一个迭代器,迭代所有由分隔符分隔的字符串子字符串。
  • 序列后拆分 返回字符串子字符串的迭代器,每次出现分隔符后进行拆分。
  • 字段序列 返回一个迭代器,迭代围绕空格字符序列的字符串子字符串,如定义unicode.IsSpace
  • 字段函数顺序 返回一个迭代器,迭代满足谓词的 Unicode 代码点序列的字符串子字符串。

同步

履行 同步地图 已经进行了更改以提高性能,特别是对于字典更改。例如,大型字典中不相交集合改变争用的可能性较小,并且不再需要建立时间来实现低争用字典负载。

如果您遇到任何问题,请在构建期间设置 GOEXPERIMENT=nosynchashtriemap 以恢复到旧实现,然后请 填写问题表格.

测试

新方法 上下文 и B.背景 返回在测试完成后和执行测试清理函数之前丢弃的上下文。

新方法 奇迪尔 и 奇迪尔 可用于在测试或基准测试期间更改工作目录。

文本/模板

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

时间 现在实现接口 编码.binaryappender и 编码.TextAppender.

端口

Linux

怎么样 公布 根据 Go 1.23 发行说明,Go 1.24 需要 Linux 内核版本 3.2 或更高版本。

达尔文

Go 1.24 是可在 macOS 11 Big Sur 上运行的最后一个版本。 Go 1.25 将需要 macOS 12 Monterey 或更高版本。

WebAssembly

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

在 WebAssembly 系统接口预览 1 (GOOS=wasip1 GOARCH=wasm) 中,Go 1.24 支持以如下方式构建 Go 程序 反应堆/库 通过指定构建标志 -buildmode=c-shared。

现在允许更多类型作为 go:wasmimport 函数的参数或结果类型。特别是,bool、string、uintptr 和指向某些类型的指针是允许的(详细信息请参阅 文件资料),以及已经允许的32位和64位整数和浮点类型以及unsafe.Pointer。这些类型也可以作为 go:wasmexport 函数的参数或结果类型。

WebAssembly 的支持文件已从 misc/wasm 移至 lib/wasm。

初始内存占用显著减少,尤其是对于小型 WebAssembly 应用程序。

Windows

32 位 windows/arm 端口(GOOS=windows GOARCH=arm)已被标记为损坏。详情 #70705 展位

来源: linux.org.ru

添加评论