Go 1.22 发行说明(翻译)


美国时间 2024 年 2 月 6 日,Go 团队官宣 Go 1.22 正式发布。下面让我们一起了解下 Go 1.22 为我们带来的新特性吧。

本文主要翻译自 Go 1.22 Release Notes

Go 1.22 简介

最新的 Go 1.22 比 Go 1.21 晚了 6 个月。它的大部分变化都在工具链、运行时和库的实现中。与往常一样,该版本保持了 Go 1 的兼容性承诺。我们期望几乎所有的Go程序都能像以前一样编译和运行。

语言的变化

Go 1.22 对 for 循环做了两个更改。

  • 以前,for 循环声明的变量只创建一次,并在每次迭代中更新。在 Go 1.22 中,循环的每次迭代都会创建新变量,以避免意外的共享错误。提案中描述的 transition support tooling 将继续以与 Go 1.21 相同的方式工作。
  • for 循环现在的范围可以是整数。例如:
package main

import "fmt"

func main() {
  for i := range 10 {
    fmt.Println(10 - i)
  }
  fmt.Println("go1.22 has lift-off!")
}

有关详细信息,请参阅语言规范

Go 1.22 预览了我们正在考虑的 Go 未来版本的语言变化:range-over-function 迭代器。使用GOEXPERIMENT=rangefunc 进行构建可以启用此功能。

Tools

Go command

工作区中的命令现在可以使用包含工作区依赖项的 vendor 目录。这个目录是由 go work vendor 创建的,当 -mod 标志被设置为 vendor 时,它被构建命令使用,当工作空间 vendor 目录存在时,这是默认的。

请注意,工作区的 vendor 目录的内容不同于单个模块的目录:如果工作区的根目录还包含工作区的一个模块,则其 vendor 目录可以包含工作区的依赖项或模块的依赖项,但不能同时包含两者。

在旧版 GOPATH 模式(即 GO111MODULE=off)下,模块之外不再支持 go get。其他构建命令(例如 go build 和 go test)将继续无限期地为旧版 GOPATH 程序工作。

go mod init 不再尝试从其他供应商工具(例如 Gopkg.lock)的配置文件导入模块要求。

go test -cover 现在会打印没有自己的测试文件的覆盖包的覆盖率摘要。在 Go 1.22 之前,对此类包运行 go test -cover 会报告

? mymod/mypack [no test files]

现在,使用 Go 1.22,包中的函数被视为未覆盖:

mymod/mypack coverage: 0.0% of statements

请注意,如果包根本不包含可执行代码,我们就无法报告有意义的覆盖率百分比;对于这样的包,go 工具将继续报告没有测试文件。

如果使用外部 © 链接器但未启用 cgo,则调用链接器的 go build 命令现在会出错。(Go 运行时需要 cgo 支持,以确保它与 C 链接器添加的任何其他库兼容。)

Trace

作为支持新跟踪器工作的一部分,跟踪工具的 Web UI 已进行了轻微更新,解决了几个问题并提高了各个子页面的可读性。 Web UI 现在支持在面向线程的视图中探索跟踪。 跟踪查看器现在还显示所有系统调用的完整持续时间。

这些改进仅适用于查看使用 Go 1.22 或更高版本构建的程序生成的跟踪。 未来的版本将为旧版 Go 生成的跟踪带来一些改进。

Vet

循环变量的引用

vet工具的行为已经改变,以匹配Go 1.22中循环变量的新语义(见上文)。当分析一个需要 Go 1.22 或更新版本的文件时(由于它的 go.mod 文件或每个文件的构建约束),vet 不再报告对循环变量的引用,这些引用来自可能超过循环迭代的函数字面量。在 Go 1.22 中,每次迭代都会重新创建循环变量,因此在循环更新变量后,这样的引用不再有风险。

追加后缺少值的新警告

vet 工具现在会报告未传递任何值附加到切片的 append 调用,例如,slice = append(slice)。这样的语句没有任何效果,经验表明这几乎总是一个错误。

延迟调用 time.Since 的新警告

vet 工具现在会在 defer 语句中报告对 time.Since(t) 的非延迟调用。这相当于在 defer 语句之前调用 time.Now().Sub(t),而不是在调用延迟函数时调用。在几乎所有情况下,正确的代码都需要延迟 time.Since 调用。例如:

t := time.Now()
defer log.Println(time.Since(t)) // non-deferred call to time.Since
tmp := time.Since(t); defer log.Println(tmp) // equivalent to the previous defer

defer func() {
  log.Println(time.Since(t)) // a correctly deferred call to time.Since
}()

对 log/slog 调用中不匹配的键值对的新警告

vet 工具现在会报告结构化日志包 log/slog 中接受交替键/值对的函数和方法调用中的无效参数。它会报告键位置上的参数既不是字符串也不是 slog.Attr 的调用,以及最后一个键缺少值的调用。

Runtime

运行时现在将基于类型的垃圾收集元数据保持在更靠近每个堆对象的位置,从而将 Go 程序的 CPU 性能(延迟或吞吐量)提高 1-3%。此更改还通过删除重复的冗余元数据将大多数 Go 程序的内存开销减少了约 1%。某些程序可能会看到较小的改进,因为此更改调整了内存分配器的大小类边界,因此某些对象可能会向上移动一个大小类。

这一变化的结果是,一些对象的地址以前总是与 16 字节(或更高)边界对齐,现在将仅与 8 字节边界对齐。一些使用汇编指令的程序可能会中断,这些指令要求内存地址对齐超过 8 字节,并依赖于内存分配器以前的对齐行为,但我们预计此类程序很少见。此类程序可以使用 GOEXPERIMENT=noallocheaders 构建以恢复到旧的元数据布局并恢复以前的对齐行为,但软件包所有者应更新其汇编代码以避免对齐假设,因为此解决方法将在未来版本中被删除。

在 windows/amd64 平台上,链接或加载使用 -buildmode=c-archive 或 -buildmode=c-shared 构建的 Go 库的程序现在可以使用 SetUnhandledExceptionFilter Win32 函数来捕获 Go 运行时未处理的异常。请注意,这已在 windows/386 平台上得到支持。

Compiler

Profile-guided Optimization (PGO) 构建现在可以取消虚拟化更高比例的调用。通过启用 PGO,一组代表性 Go 程序中的大多数程序在运行时的性能提升了 2% 到 14%。

编译器现在交错执行去虚拟化和内联,因此接口方法调用得到更好的优化。

Go 1.22 还包含编译器内联阶段增强实现的预览,该实现使用启发式方法来提高被认为“重要”的调用点(例如,在循环中)的可内联性,并阻止被认为“不重要”的调用点(例如,在恐慌路径上)的内联。使用GOEXPERIMENT=newinliner进行构建可启用新的调用点启发式方法;请参阅问题 #61502 了解更多信息并提供反馈。

Linker

链接器的 -s 和 -w 标志现在在所有平台上的行为更加一致。-w 标志可抑制 DWARF 调试信息生成。-s 标志可抑制符号表生成。-s 标志还暗示 -w 标志,可以使用 -w=0 将其否定。也就是说,-s -w=0 将生成一个带有 DWARF 调试信息生成但不带有符号表的二进制文件。

在 ELF 平台上,-B 链接器标志现在接受一种特殊形式:使用 -B gobuildid,链接器将生成一个从 Go 构建 ID 派生的 GNU 构建 ID(ELF NT_GNU_BUILD_ID 注释)。

在 Windows 上,使用 -linkmode=internal 进行构建时,链接器现在通过将 .pdata 和 .xdata 部分复制到最终二进制文件中来保留来自 C 目标文件的 SEH 信息。这有助于使用本机工具(如 WinDbg)调试和分析二进制文件。请注意,到目前为止,C 函数的 SEH 异常处理程序尚未得到遵守,因此此更改可能会导致某些程序的行为不同。-linkmode=external 不受此更改的影响,因为外部链接器已经保留了 SEH 信息。

自举(Bootstrap)

正如 Go 1.20 发行说明中所述,Go 1.22 现在需要 Go 1.20 或更高版本的最终版本才能进行自举。我们预计 Go 1.24 将需要 Go 1.22 或更高版本的最终版本才能进行自举。

Standard library

新包 math/rand/v2

Go 1.22 包含标准库中的第一个 v2 包 math/rand/v2。与 math/rand 相比的变化在提案#61716 中有详细说明。最重要的变化是:

  • 在math/rand中已弃用的Read方法没有在math/rand/v2中继续使用。(在math/rand中仍然可用。)绝大多数对Read的调用应该使用 crypto/rand.Read 来代替。否则,可以使用 Uint64 方法构造自定义 Read。
  • 顶级函数访问的全局生成器是无条件随机播种的。由于 API 不保证结果的固定顺序,因此现在可以进行每个线程随机生成器状态等优化。
  • Source 接口现在有一个 Uint64 方法;没有 Source64 接口。
  • 现在许多方法使用更快的算法,而这些算法在 math/rand 中无法采用,因为它们改变了输出流。
  • math/rand 中的 Intn、Int31、Int31n、Int63 和 Int64n 顶级函数和方法在 math/rand/v2 中的拼写更加符合规范:IntN、Int32、Int32N、Int64 和 Int64N。此外还有新的顶级函数和方法 Uint32、Uint32N、Uint64、Uint64N 和 UintN。
  • 新的泛型函数 N 类似于 Int64N 或 Uint64N,但适用于任何整数类型。例如,从 0 到 5 分钟的随机持续时间为 rand.N(5*time.Minute)
  • math/rand 源提供的 Mitchell & Reeds LFSR 生成器已被两个更现代的伪随机生成器源取代:ChaCha8PCG。ChaCha8 是一种新的、加密性强的随机数生成器,其效率与 PCG 大致相似。ChaCha8 是 math/rand/v2 中顶级函数使用的算法。从 Go 1.22 开始,math/rand 的顶级函数(未明确播种时)和 Go 运行时也使用 ChaCha8 来实现随机性。

我们计划在未来的版本中包含一个 API 迁移工具,可能是 Go 1.23。

新包 go/version

新的 go/version 包实现了验证和比较 Go 版本字符串的功能。

增强的路由模式

标准库中的 HTTP 路由现在更具表现力。net/http.ServeMux 使用的模式已得到增强,可以接受方法和通配符。

使用方法注册处理程序(如“POST /items/create”)会将处理程序的调用限制为使用给定方法的请求。具有方法的模式优先于没有方法的匹配模式。特殊情况下,使用“GET”注册处理程序也会使用“HEAD”注册。

模式中的通配符(如 /items/{id})可匹配 URL 路径的片段。实际片段值可通过调用 Request.PathValue 方法访问。以“…”结尾的通配符(如 /files/{path…})必须出现在模式末尾,并与所有剩余片段匹配。

以“/”结尾的模式会匹配所有以它为前缀的路径,一如既往。要匹配包括尾部斜杠的精确模式,请以{$}结尾,例如 /exact/match/{$}

如果两个模式在匹配的请求中重叠,则更具体的模式优先。如果两者都不更具体,则模式冲突。此规则概括了原始优先规则,并保持了模式注册顺序无关紧要的特性。

此更改会破坏向后兼容性,有些方面比较明显,即带有“{”和“}”的模式的行为有所不同,而有些方面则不那么明显,即对转义路径的处理已得到改进。此更改由名为 httpmuxgo121 的 GODEBUG 字段控制。设置 httpmuxgo121=1 可恢复旧行为。

对库的 Minor改动

与往常一样,对标准库进行了各种细微更改和更新,以保证 Go 1 的兼容性。此外还有各种性能改进,这里就不一一列举了。

archive/tar

新方法 Writer.AddFSfs.FS 中的所有文件添加到档案中。

archive/zip

新方法 Writer.AddFSfs.FS 中的所有文件添加到档案中。

bufio

SplitFunc 返回带有 nil 标记的 ErrFinalToken 时,Scanner 现在将立即停止。以前,它会在停止之前报告最后一个空标记,这通常是不希望的。如果调用者确实希望报告最后一个空标记,可以通过返回 []byte{} 而不是 nil 来实现。

cmp

新函数 Or 返回序列中第一个非零值。

crypto/tls

除非使用 TLS 1.3,或者服务器和客户端都支持 extended_master_secret 扩展,否则 ConnectionState.ExportKeyingMaterial 现在将返回错误。crypto/tls 自 Go 1.20 起支持此扩展。可以使用 tlsunsafeekm=1 GODEBUG 设置禁用此功能。

默认情况下,如果未使用 config.MinimumVersion 指定,则 crypto/tls 服务器提供的最低版本现在为 TLS 1.2,这与 crypto/tls 客户端的行为一致。可以使用 tls10server=1 GODEBUG 设置恢复此更改。

默认情况下,在 TLS 1.3 之前的握手期间,客户端或服务器不再提供不支持 ECDHE 的密码套件。可以使用 tlsrsakex=1 GODEBUG 设置恢复此更改。

crypto/x509

新的 CertPool.AddCertWithConstraint 方法可用于向根证书添加自定义约束,以便在构建链期间应用。

在 Android 上,根证书现在将从 /data/misc/keychain/certs-added 以及 /system/etc/security/cacerts 加载。

新类型 OID 支持单个组件大于 31 位的 ASN.1 对象标识符。使用此类型的新字段 Policies 已添加到证书结构中,现在在解析期间填充。任何无法使用 asn1.ObjectIdentifier 表示的 OID 都将出现在策略中,但不会出现在旧的 PolicyIdentifiers 字段中。调用 CreateCertificate 时,Policies 字段将被忽略,策略将从 PolicyIdentifiers 字段中获取。使用 x509usepolicies=1 GODEBUG 设置会反转此设置,从策略字段填充证书策略,并忽略 PolicyIdentifiers 字段。我们可能会在 Go 1.23 中更改 x509usepolicies 的默认值,使 Policies 成为 marshaling 的默认字段。

database/sql

新的 Null[T] 类型提供了一种扫描任何列类型的可空列的方法。

debug/elf

常量 R_MIPS_PC32 被定义为用于 MIPS64 系统。

定义了额外的 R_LARCH_* 常量以用于 LoongArch 系统。

encoding

包 encoding/base32、encoding/base64 和 encoding/hex 中的每个编码类型都添加了新方法 AppendEncode 和 AppendDecode,通过处理字节切片缓冲区管理,简化了字节切片的编码和解码。

如果 padding 参数是除 NoPadding 之外的负值,则方法 base32.Encoding.WithPaddingbase64.Encoding.WithPadding 现在会引起 panic。

encoding/json

序列化和编码功能现在将“\b”和“\f”字符转义为\b和\f,而不是 \u0008 和 \u000c。

go/ast

以下与语法标识符解析相关的声明现已弃用:Ident.Obj、Object、Scope、File.Scope、File.Unresolved、Importer、Package、NewPackage。通常,如果没有类型信息,就无法准确解析标识符。例如,考虑 T{K: ""} 中的标识符 K:如果 T 是映射类型,则它可以是局部变量的名称;如果 T 是结构类型,则它可以是字段的名称。新程序应使用 go/types 包来解析标识符;有关详细信息,请参阅 ObjectInfo.UsesInfo.Defs

新的 ast.Unparen 函数从表达式中删除所有括起来的括号。

go/types

新的 Alias 类型表示类型别名。以前,类型别名没有明确表示,因此对类型别名的引用相当于拼写出别名类型,并且别名的名称会丢失。新的表示保留了中间 Alias。这可以改进错误报告(可以报告类型别名的名称),并允许更好地处理涉及类型别名的循环类型声明。在未来的版本中,Alias 类型还将携带类型参数信息。新函数 Unalias 返回 Alias 类型(或任何其他类型)表示的实际类型。

由于 Alias 类型可能会破坏不知道检查它们的现有类型开关,因此此功能由名为 gotypesalias 的 GODEBUG 字段控制。使用 gotypesalias=0,一切都像以前一样运行,并且永远不会创建 Alias 类型。使用 gotypesalias=1,会创建 Alias 类型,并且客户端必须期待它们。默认值为 gotypesalias=0。在未来的版本中,默认值将更改为 gotypesalias=1。敦促 go/types 的客户端尽快调整其代码以使用 gotypesalias=1 以尽早消除问题。

Info 结构现在导出提供每个文件 Go 版本信息的 FileVersions 映射。

新的辅助方法 PkgNameOf 返回给定导入声明的本地包名称。

SizesFor 的实现已调整为当 SizesFor 的编译器参数为“gc”时,计算与编译器相同的类型大小。类型检查器使用的默认 Sizes 实现现在是 types.SizesFor(“gc”, “amd64”)。

代表函数体的词法环境块(Scope)的起始位置(Pos)已经发生了变化:它过去从函数体的开始花括号开始,但现在从函数的 func 标记开始。

html/template

JavaScript 模板文字现在可以包含 Go 模板操作,并且解析包含该操作的模板将不再返回 ErrJSTemplate。同样,GODEBUG 设置 jstmpllitinterp 不再有效。

io

新的 SectionReader.Outer 方法返回传递给 NewSectionReader 的ReaderAt、偏移量和大小。

log/slog

新的 SetLogLoggerLevel 函数控制 slog 和 log 包之间的桥梁级别。它设置对顶级 slog 日志记录函数的调用的最低级别,并设置通过 slog 的 log.Logger 调用的级别。

math/big

新方法 Rat.FloatPrec 计算将有理数准确表示为浮点数所需的小数部分位数,以及是否可以首先进行准确的十进制表示。

net

当 io.Copy 从 TCPConn 复制到 UnixConn 时,它现在将尽可能使用 Linux 的 splice(2) 系统调用,并使用新方法TCPConn.WriteTo

net/http

HTTP 服务器和客户端现在拒绝包含无效的空 Content-Length 标头的请求和响应。可以通过设置 GODEBUG 字段 httplaxcontentlength=1 来恢复以前的行为。

新方法 Request.PathValue 从请求返回路径通配符值,新方法 Request.SetPathValue 在请求上设置路径通配符值。

net/http/cgi

执行 CGI 进程时,PATH_INFO 变量现在始终设置为空字符串或以 / 字符开头的值,这是 RFC 3875 的要求。以前,Handler.Root 和请求 URL 的某些组合可能会违反此要求。

net/netip

新AddrPort.Compare 方法对两个AddrPorts 进行比较。

os

在 Windows 上,该 Stat 函数现在会跟踪链接到系统中另一个命名实体的所有重新解析点。它以前只跟踪IO_REPARSE_TAG_SYMLINK和 IO_REPARSE_TAG_MOUNT_POINT重新解析点。

在 Windows 上,传递 O_SYNC 给 OpenFilenow 会导致写入操作直接转到磁盘,相当于O_SYNC在 Unix 平台上。

在 Windows 上,ReadDir、File.ReadDir、File.Readdir 和 File.Readdirnames 函数现在可以批量读取目录条目以减少系统调用的次数,从而将性能提高 30%。

当 io.Copy 从文件复制到 net.UnixConn 时,它现在将尽可能使用 Linux 的 sendfile(2) 系统调用,使用新方法 File.WriteTo。

os/exec

在 Windows 上,LookPath 现在会忽略 %PATH% 中的空条目,如果没有找到可执行文件扩展名来解析其他明确的名称,则返回 ErrNotFound(而不是 ErrNotExist)。

在 Windows 上,如果可执行文件的路径已经是绝对路径且具有可执行文件扩展名,则 Command 和 Cmd.Start 不再调用 LookPath。此外,Cmd.Start 不再将解析后的扩展名写回 Path 字段,所以现在可以安全地在调用Start的同时调用String方法。

reflect

Value.IsZero 方法现在将对浮点或复数负零返回 true,并且如果空白字段(名为 _ 的字段)以某种方式具有非零值,则将对结构值返回 true。这些更改使 IsZero 与使用语言 == 运算符将值与零进行比较一致。

PtrTo 函数已被弃用,取而代之的是 PointerTo

新函数 TypeFor 返回表示类型参数 T 的 Type。以前,要获取类型的 reflect.Type 值,必须使用 reflect.TypeOf((*T)(nil)).Elem()。现在可以写为 reflect.TypeFor[T]()

runtime/metrics

四个新的直方图指标 /sched/pauses/stopping/gc:seconds、/sched/pauses/stopping/other:seconds、/sched/pauses/total/gc:seconds 和 /sched/pauses/total/other:seconds 提供了有关停止世界暂停的更多详细信息。“stopping” 指标报告从决定停止世界到所有 goroutine 停止所用的时间。“total”指标报告从决定停止世界到重新启动所用的时间。

/gc/pauses:seconds 指标已被弃用,因为它等同于新的 /sched/pauses/total/gc:seconds 指标。

/sync/mutex/wait/total:seconds 现在除了 sync.Mutex 和 sync.RWMutex 之外还包括对运行时内部锁的争用。

runtime/pprof

互斥锁性能文件现在根据互斥锁上阻塞的 goroutine 数量来衡量争用程度。这可以更准确地表示互斥锁在 Go 程序中成为瓶颈的程度。例如,如果 100 个 goroutine 在互斥锁上阻塞了 10 毫秒,则互斥锁配置文件现在将记录 1 秒的延迟,而不是 10 毫秒的延迟。

除了 sync.Mutex 和 sync.RWMutex 之外,互斥性能文件现在还包括对运行时内部锁的争用。对运行时内部锁的争用始终在 Runtime._LostContendedRuntimeLock 中报告。未来版本将在这些情况下添加完整的堆栈跟踪。

Darwin 平台上的 CPU 配置文件现在包含进程的内存映射,从而可以在 pprof 工具中启用反汇编视图。

runtime/trace

在此版本中,执行跟踪器已经彻底改造,解决了几个长期存在的问题,为执行跟踪的新用例铺平了道路。

执行跟踪现在在大多数平台(Windows 除外)上使用操作系统的时钟,因此可以将它们与较低级别组件生成的跟踪相关联。执行跟踪不再依赖平台时钟的可靠性来生成正确的跟踪。执行跟踪现在定期动态分区,因此可以以可流式处理的方式进行处理。执行跟踪现在包含所有系统调用的完整持续时间。执行跟踪现在包含有关 goroutine 在其上执行的操作系统线程的信息。启动和停止执行跟踪的延迟影响已大大降低。执行跟踪现在可以在垃圾收集标记阶段开始或结束。

为了让 Go 开发人员能够利用这些改进,golang.org/x/exp/trace 提供了一个实验性的跟踪读取包。请注意,此包目前仅适用于使用 Go 1.22 构建的程序生成的跟踪。请试用该包并针对相应的提案问题提供反馈。

如果您在使用新的执行跟踪器实现时遇到任何问题,您可以通过使用 GOEXPERIMENT=noexectracer2 构建 Go 程序来切换回旧实现。如果您这样做,请提交问题,否则此选项将在未来的版本中被删除。

slices

新函数 Concat 连接多个片。

缩小切片大小的函数(Delete、DeleteFunc、Compact、CompactFunc 和 Replace)现在将新长度和旧长度之间的元素归零。

如果参数 i 超出范围,Insert 现在总会 panic。以前,如果没有元素可插入,则在这种情况下不会 panic。

syscall

syscall 包自 Go 1.4 起就被冻结,并在 Go 1.11 中被标记为弃用,导致许多编辑器警告不要使用该包。但是,一些非弃用功能需要使用 syscall 包,例如 os/exec.Cmd.SysProcAttr 字段。为了避免对此类代码产生不必要的投诉,syscall 包不再被标记为弃用。该包对大多数新功能保持冻结状态,新代码仍然鼓励尽可能使用 golang.org/x/sys/unix 或 golang.org/x/sys/windows。

在 Linux 上,新的 SysProcAttr.PidFD 字段允许在通过 StartProcess 或 os/exec 启动子进程时获取 PID FD。

在 Windows 上,将 O_SYNC 传递给 Open 现在会导致写入操作直接进入磁盘,相当于 Unix 平台上的 O_SYNC。

testing/slogtest

新的 Run 函数使用子测试来运行测试用例,提供更细粒度的控制。

Ports

Darwin

在 64 位 x86 架构的 macOS(darwin/amd64 端口)上,Go 工具链现在默认生成位置无关的可执行文件 (PIE,position-independent executables)。可以通过指定 -buildmode=exe 构建标志来生成非 PIE 二进制文件。在基于 64 位 ARM 的 macOS(darwin/arm64 端口)上,Go 工具链已经默认生成 PIE。

Go 1.22 是可在 macOS 10.15 Catalina 上运行的最后一个版本。Go 1.23 需要 macOS 11 Big Sur 或更高版本。

Arm

GOARM 环境变量现在允许您选择使用软件浮点还是硬件浮点。以前,有效的 GOARM 值为 5、6 或 7。现在,这些相同的值可以选择性地后跟 softfloat 或 hardfloat 来选择浮点实现。

此新选项对于版本 5 默认为 softfloat,对于版本 6 和 7 默认为 hardfloat。

Loong64

loong64 架构现在支持使用寄存器传递函数参数和结果。

OpenBSD

Go 1.22 版本增加了对 OpenBSD 操作系统在 big-endian 64 位 PowerPC 架构(即 openbsd/ppc64)的实验性支持。


参考文献

Go 1.22 is released!
Go 1.22 Release Notes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值