Go 1.22 发布注记
Go 1.22 介绍
最新的 Go 版本 1.22 在 Go 1.21 发布六个月后到来。其大部分变化集中在工具链、运行时和库的实现上。一如既往,此版本保持了 Go 1 的兼容性承诺。我们预计几乎所有 Go 程序都能像以前一样继续编译和运行。
语言变更
Go 1.22 对“for”循环进行了两项更改。
-
此前,“for”循环声明的变量只创建一次,并在每次迭代中更新。在 Go 1.22 中,循环的每次迭代都会创建新变量,以避免意外的共享 bug。提案中描述的过渡支持工具仍以与 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
进行构建可以启用此功能。
工具
Go 命令
现在,工作空间中的命令可以使用包含工作空间依赖项的 vendor
目录。此目录由 go work vendor
命令创建,当 -mod
标志设置为 vendor
时(工作空间存在 vendor
目录时的默认设置),构建命令会使用该目录。
请注意,工作空间的 vendor
目录内容与单个模块的内容不同:如果工作空间的根目录也包含工作空间中的某个模块,则其 vendor
目录可以包含工作空间或模块的依赖项,但不能同时包含两者。
在旧版 GOPATH
模式下(即使用 GO111MODULE=off
时),模块外部不再支持 go get
命令。其他构建命令,例如 go build
和 go test
,对于旧版 GOPATH
程序将继续无限期地工作。
go mod init
不再尝试从其他 vendoring 工具的配置文件(例如 Gopkg.lock
)导入模块需求。
go test -cover
现在会打印包含代码但没有自己测试文件的包的代码覆盖率摘要。在 Go 1.22 之前,对此类包运行 go test -cover
会报告
? mymod/mypack [无测试文件]
而在 Go 1.22 中,包中的函数被视为未覆盖
mymod/mypack coverage: 0.0% 的语句
请注意,如果一个包根本不包含可执行代码,我们将无法报告有意义的覆盖率百分比;对于此类包,go
工具将继续报告没有测试文件。
调用链接器的 go
build 命令现在会在使用外部 (C) 链接器但未启用 cgo 时报错。(Go 运行时需要 cgo 支持,以确保其与 C 链接器添加的任何附加库兼容。)
跟踪工具 (Trace)
trace
工具的 Web UI 已作为支持新跟踪器工作的一部分进行了轻微刷新,解决了几个问题并提高了各种子页面的可读性。Web UI 现在支持以线程导向视图探索跟踪。跟踪查看器现在还显示所有系统调用的完整持续时间。
这些改进仅适用于查看使用 Go 1.22 或更高版本构建的程序生成的跟踪。未来版本将为旧版本 Go 生成的跟踪带来其中一些改进。
Vet 工具
循环变量的引用
vet
工具的行为已更改,以匹配 Go 1.22 中循环变量的新语义(见上文)。在分析需要 Go 1.22 或更高版本(因其 go.mod 文件或按文件构建约束)的文件时,vet
不再报告函数字面量中可能比循环迭代生命期更长的循环变量引用。在 Go 1.22 中,循环变量在每次迭代中都会重新创建,因此此类引用不再面临在循环更新变量后使用该变量的风险。
append 后缺少值的新警告
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
中接受交替键值对的函数和方法的调用中的无效参数。它会报告键位置的参数既不是 string
也不是 slog.Attr
的调用,以及缺少值的最终键的调用。
运行时
运行时现在将基于类型的垃圾回收元数据保存在靠近每个堆对象的位置,从而将 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
端口上已得到支持。
编译器
配置文件引导优化 (PGO) 构建现在可以比以前更多地对调用进行去虚拟化。在一组有代表性的 Go 程序中,大多数程序启用 PGO 后在运行时性能上提升 2% 到 14%。
编译器现在交错进行去虚拟化和内联,从而更好地优化接口方法调用。
Go 1.22 还包含一个增强的编译器内联阶段实现预览,该实现使用启发式方法在被认为“重要”的调用站点(例如,循环中)提高内联能力,并在被认为“不重要”的调用站点(例如,panic 路径上)抑制内联。使用 GOEXPERIMENT=newinliner
进行构建可以启用新的调用站点启发式方法;详情和反馈请参阅 issue #61502。
链接器
链接器的 -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
note)。
在 Windows 上,使用 -linkmode=internal
构建时,链接器现在通过将 .pdata
和 .xdata
节复制到最终二进制文件中来保留 C 对象文件的 SEH 信息。这有助于使用本地工具(如 WinDbg)对二进制文件进行调试和分析。请注意,在此之前,C 函数的 SEH 异常处理程序未被遵守,因此此更改可能会导致某些程序行为不同。-linkmode=external
不受此更改影响,因为外部链接器已经保留 SEH 信息。
自举
正如 Go 1.20 发布注记中所述,Go 1.22 现在自举需要 Go 1.20 的最终小版本或更高版本。我们预计 Go 1.24 将自举需要 Go 1.22 的最终小版本或更高版本。
标准库
新的 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
的Source
提供的 Mitchell & Reeds LFSR 生成器已被两种更现代的伪随机生成器源取代:ChaCha8
和PCG
。ChaCha8 是一种新的、密码学安全的随机数生成器,其效率大致与 PCG 相似。ChaCha8 是math/rand/v2
中顶级函数使用的算法。从 Go 1.22 开始,math/rand
的顶级函数(未明确播种时)和 Go 运行时也使用 ChaCha8 生成随机数。
我们计划在未来的版本中,可能是 Go 1.23,包含一个 API 迁移工具。
新的 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
可以恢复旧的行为。
库中的次要更改
一如既往,库中进行了各种次要更改和更新,都考虑了 Go 1 的兼容性承诺。还有各种性能改进,此处未一一列举。
- archive/tar
-
新的方法
Writer.AddFS
将来自fs.FS
的所有文件添加到归档中。 - archive/zip
-
新的方法
Writer.AddFS
将来自fs.FS
的所有文件添加到归档中。 - bufio
-
当
SplitFunc
返回带有nil
记号的ErrFinalToken
时,Scanner
现在将立即停止。以前,它会在停止之前报告一个最终的空记号,这通常不是期望的行为。希望报告最终空记号的调用者可以通过返回[]byte{}
而不是nil
来实现。 - cmp
-
新的函数
Or
返回一系列值中第一个非零值。 - crypto/tls
-
ConnectionState.ExportKeyingMaterial
现在将返回错误,除非正在使用 TLS 1.3,或者服务器和客户端都支持extended_master_secret
扩展。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
支持 ASN.1 对象标识符,其单个组件可以大于 31 位。使用此类型的新字段Policies
已添加到Certificate
结构体中,并且现在在解析时填充。任何不能使用asn1.ObjectIdentifier
表示的 OID 将出现在Policies
中,而不是旧的PolicyIdentifiers
字段中。调用CreateCertificate
时,会忽略Policies
字段,并从PolicyIdentifiers
字段获取策略。使用x509usepolicies=1
GODEBUG 设置可以反转此行为,从Policies
字段填充证书策略,并忽略PolicyIdentifiers
字段。我们可能会在 Go 1.23 中更改x509usepolicies
的默认值,使Policies
成为编码时的默认字段。 - database/sql
-
新的
Null[T]
类型提供了一种扫描任何列类型的可空列的方法。 - debug/elf
-
常量
R_MIPS_PC32
已定义,用于 MIPS64 系统。已为 LoongArch 系统定义了额外的
R_LARCH_*
常量。 - encoding
-
添加到
encoding/base32
、encoding/base64
和encoding/hex
包中每种Encoding
类型的新方法AppendEncode
和AppendDecode
通过处理字节切片缓冲区管理,简化了字节切片的编码和解码操作。方法
base32.Encoding.WithPadding
和base64.Encoding.WithPadding
现在在padding
参数是除NoPadding
以外的负值时会发生 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 是 map 类型,它可能是局部变量名;如果 T 是 struct 类型,它可能是字段名。新程序应使用 go/types 包来解析标识符;详情请参阅Object
、Info.Uses
和Info.Defs
。新的
ast.Unparen
函数从一个表达式中移除任何外层括号。 - go/types
-
新的
Alias
类型表示类型别名。以前,类型别名没有显式表示,因此对类型别名的引用等同于写出别名类型,并且别名的名称丢失了。新的表示保留了中间的Alias
。这使得错误报告得到改进(可以报告类型别名的名称),并允许更好地处理涉及类型别名的循环类型声明。在未来版本中,Alias
类型还将包含类型参数信息。新的函数Unalias
返回由Alias
类型(或任何其他Type
)表示的实际类型。由于
Alias
类型可能会破坏不知道检查它们的现有类型 switch,此功能由名为gotypesalias
的GODEBUG
字段控制。当gotypesalias=0
时,一切行为与之前相同,并且不会创建Alias
类型。当gotypesalias=1
时,会创建Alias
类型,客户端必须预期它们。默认值是gotypesalias=0
。在未来版本中,默认值将更改为gotypesalias=1
。强烈建议go/types
的客户端尽快调整其代码,以使用gotypesalias=1
工作,从而及早消除问题。的
Info
结构体现在导出了FileVersions
map,它提供按文件的 Go 版本信息。新的辅助方法
PkgNameOf
返回给定 import 声明的本地包名。的
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
实现。Go DNS 解析器(在使用 “-tags=netgo” 构建时使用)现在在进行 DNS 查询之前,会在 Windows hosts 文件(位于
%SystemRoot%\System32\drivers\etc\hosts
)中搜索匹配的名称。 - net/http
-
新的函数
ServeFileFS
、FileServerFS
和NewFileTransportFS
是现有ServeFile
、FileServer
和NewFileTransport
的版本,它们操作于一个fs.FS
。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
方法比较两个AddrPort
。 - os
-
在 Windows 上,
Stat
函数现在遵循所有链接到系统中另一个命名实体的重解析点。以前,它只遵循IO_REPARSE_TAG_SYMLINK
和IO_REPARSE_TAG_MOUNT_POINT
重解析点。在 Windows 上,将
O_SYNC
传递给OpenFile
现在会导致写入操作直接写入磁盘,相当于 Unix 平台上的O_SYNC
。在 Windows 上,
ReadDir
、File.ReadDir
、File.Readdir
和File.Readdirnames
函数现在批量读取目录项,以减少系统调用次数,性能提升高达 30%。当
io.Copy
从File
复制到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
与使用语言==
运算符将值与零比较的行为保持一致。新的函数
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
提供了关于 stop-the-world 暂停的额外细节。“stopping”指标报告从决定停止世界到所有 goroutine 停止所需的时间。“total”指标报告从决定停止世界到世界再次启动所需的时间。/gc/pauses:seconds
指标已弃用,因为它等同于新的/sched/pauses/total/gc:seconds
指标。/sync/mutex/wait/total:seconds
现在除了包含对sync.Mutex
和sync.RWMutex
的竞争之外,还包括对运行时内部锁的竞争。 - runtime/pprof
-
互斥锁 profiles 现在根据阻塞在该互斥锁上的 goroutines 数量来衡量竞争程度。这更准确地表示了互斥锁在 Go 程序中成为瓶颈的程度。例如,如果 100 个 goroutines 阻塞在互斥锁上 10 毫秒,互斥锁 profile 现在会记录 1 秒的延迟,而不是 10 毫秒的延迟。
互斥锁 profiles 现在除了包含对
sync.Mutex
和sync.RWMutex
的竞争之外,还包括对运行时内部锁的竞争。对运行时内部锁的竞争总是报告在runtime._LostContendedRuntimeLock
位置。未来版本将为这些情况添加完整的堆栈跟踪。在 Darwin 平台上的 CPU profiles 现在包含进程的内存映射,从而在 pprof 工具中启用反汇编视图。
- runtime/trace
-
执行跟踪器在此版本中已完全重写,解决了几个长期存在的问题,并为执行跟踪的新用例铺平了道路。
执行跟踪现在在大多数平台(Windows 除外)上使用操作系统时钟,因此可以将它们与低层组件生成的跟踪相关联。执行跟踪不再依赖于平台时钟的可靠性来生成正确的跟踪。执行跟踪现在会定期动态分区,因此可以以流式方式处理。执行跟踪现在包含所有系统调用的完整持续时间。执行跟踪现在包含关于 goroutines 在其上执行的操作系统线程的信息。启动和停止执行跟踪的延迟影响已大大降低。执行跟踪现在可以在垃圾回收标记阶段开始或结束。
为了让 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
函数使用子测试来运行测试用例,提供了更精细的控制。
移植
Darwin
在 64 位 x86 架构的 macOS 上(即 darwin/amd64
移植),Go 工具链现在默认生成位置无关可执行文件 (PIE)。通过指定 -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
移植现在支持使用寄存器传递函数参数和结果。
linux/loong64
移植现在支持地址 sanitizer、内存 sanitizer、新式 linker 重定位以及 plugin
构建模式。
OpenBSD
Go 1.22 增加了对大端序 64 位 PowerPC 上的 OpenBSD 的实验性移植(openbsd/ppc64
)。