Go 1.23 发布笔记 AI 翻译

2024-08-15 14:27:24 浏览数 (2)

忽然发现 Go 1.23 发布了,试用了一下,字节的 Sonic 编译不通过。不过这不妨碍咱们跟进。先用 AI 快速翻译一下,后续有空再修订。官方原文: Go 1.23 Release Notes

Go 1.23简介

最新的Go版本1.23,在Go 1.22之后的六个月发布。它的大部分变化在于工具链、运行时和库的实现。与往常一样,此版本保持了Go 1的兼容性承诺。我们预计几乎所有Go程序都将像以前一样继续编译和运行。

语法变更

Go 1.23使(Go 1.22)的“range-over-func”实验成为语言的一部分。“for-range”循环中的“range”子句现在接受以下类型的迭代器函数

代码语言:go复制
func(func() bool)
func(func(K) bool)
func(func(K, V) bool) 

作为范围表达式。迭代器参数函数的调用为“for-range”循环生成迭代值。有关详细信息,请参阅iter包文档和语言规范。关于动机,请参阅2022年的“range-over-func”讨论。

Go 1.23包括对通用类型别名的预览支持。在包内使用GOEXPERIMENT=aliastypeparams构建工具链可以启用此功能。(尚不支持在包边界之间使用通用别名类型。)

工具

Telemetry

从Go 1.23开始,Go工具链可以收集使用情况和故障统计数据,以帮助Go团队了解Go工具链的使用情况以及其工作状况。我们将这些统计数据称为Go Telemetry。

Go遥测是一个选择加入的系统,由go telemetry命令控制。默认情况下,工具链程序在计数器文件中收集统计信息,这些文件可以在本地进行检查,但其他方面没有使用(go telemetry local)。

为了帮助我们保持Go的良好工作状态并了解Go的使用情况,请考虑通过运行go telemetry on加入Go遥测。在该模式下,每周将匿名计数器报告上传到telemetry.go.dev,然后将它们聚合成图表,并提供给希望分析数据的任何Go贡献者或用户。有关Go遥测系统的更多详细信息,请参阅“Go遥测”。

Go命令

设置GOROOT_FINAL环境变量不再起作用(#62047)。将go命令安装到$GOROOT/bin/go以外的位置的发行版应安装符号链接,而不是重新定位或复制go二进制文件。

新的go env -changed标志使命令仅打印与默认值不同的设置,即在空环境中没有先前使用-w标志的情况下获得的默认值。

新的go mod tidy -diff标志使命令不修改文件,而是将必要的更改打印为统一的差异。如果需要更新,它将退出并返回非零代码。

go list -m -json命令现在包括新的Sum和GoModSum字段。这类似于现有的go mod download -json命令的行为。

新的godebug指令在go.mod和go.work中声明一个GODEBUG设置,以便在使用工作模块或工作区时应用。

Vet

go vet子命令现在包括stdversion分析器,该分析器会标记对于引用文件中生效的Go版本过新的符号引用。(生效版本由文件所在的go.mod文件中的go指令以及文件中的//go:build约束确定。)

例如,它会报告在其go.mod文件中指定go 1.21的模块中的文件对reflect.TypeFor函数(在go1.22中引入)的引用。

Cgo

cmd/cgo支持新的-ldflags标志,用于将标志传递给C链接器。go命令会自动使用它,避免在具有非常大的CGO_LDFLAGS的情况下出现“参数列表过长”的错误。

Trace

trace工具现在通过尝试恢复它可以获取的跟踪数据,更好地容忍部分损坏的跟踪。在程序崩溃时查看跟踪时,这个功能尤其有用,因为在大多数情况下,崩溃前的跟踪数据现在可以恢复。

运行时

在未处理的恐慌或其他致命错误之后,运行时打印的回溯现在将错误消息的第二行和后续行缩进一个制表符,以便可以清楚地区分第一个goroutine的堆栈跟踪。参见#64590以进行讨论。

编译器

构建使用Profile Guided Optimization的构建时间开销已大幅降低。以前,大型构建可能会因启用PGO而导致100% 的构建时间增加。在Go 1.23中,开销应该在个位数百分比。

Go 1.23的编译器现在可以重叠在函数的不相交区域中访问的局部变量的堆栈帧槽,从而减少Go应用程序的堆栈使用。

对于386和amd64,编译器将使用PGO的信息对循环中的某些热块进行对齐。这提高了额外的1-1.5%的性能,以及额外的0.1%的文本和二进制大小。这目前仅在386和amd64上实现,因为在其他平台上尚未显示出改进。可以使用-gcflags=<packages>=-d=alignhot=0禁用热块对齐。

链接器

链接器现在不允许使用//go:linkname指令引用标准库(包括运行时)中未在其定义上标记//go:linkname的内部符号。类似地,链接器不允许从汇编代码中引用这些符号。为了向后兼容,在大型开源代码语料库中发现的现有//go:linkname用法仍受支持。任何新的对标准库内部符号的引用将被禁止。

可以使用链接器命令行标志-checklinkname=0禁用此检查,以便进行调试和实验。

在构建动态链接的ELF二进制文件(包括PIE二进制文件)时,新的-bindnow标志启用立即函数绑定。

标准库

计时器变更

Go 1.23对time.Timer和time.Ticker的实现进行了两个重要更改。

首先,不再被程序引用的计时器和计时器在即使未调用其Stop方法的情况下也立即有资格进行垃圾回收。早期版本的Go在计时器触发后才回收未停止的计时器,并且从不回收未停止的计时器。

第二,与计时器或计时器相关联的计时器通道现在是无缓冲的,容量为0。这个更改的主要影响是,Go现在保证对于Reset或Stop方法的任何调用,在调用之后不会发送或接收准备好的过时值。早期版本的Go使用单元素缓冲通道,这使得正确使用Reset和Stop变得困难。此更改的一个可见效果是,计时器通道的len和cap现在返回0而不是1,这可能会影响轮询长度以决定计时器通道上的接收是否成功的程序。这样的代码应该使用非阻塞接收。

只有当主Go程序位于一个使用Go 1.23.0或更高版本的go.mod go行的模块中时,才启用这些新行为。当Go 1.23构建旧程序时,旧行为仍然有效。新的GODEBUG设置asynctimerchan=1可用于在程序的go.mod文件中指定Go 1.23.0或更高版本时,恢复到异步通道行为。

新的 unique 包

新的unique包提供了规范化值(如“interning”或“hash-consing”)的功能。

可以使用新的MakeT函数规范化任何可比较类型的值,该函数生成一个以HandleT形式的规范值的引用。当且仅当用于生成句柄的值相等时,两个HandleT才相等,这允许程序去重值并减少内存占用。比较两个HandleT值是高效的,可以简化为简单的指针比较。

迭代器

新的iter包提供了与用户定义的迭代器一起使用的基本定义。

slices包添加了几个与迭代器一起使用的函数:

All返回切片索引和值的迭代器。 Values返回切片元素的迭代器。 Backward返回一个反向遍历切片的迭代器。 Collect从迭代器中收集值到一个新的切片。 AppendSeq将迭代器中的值追加到现有切片。 Sorted从迭代器中收集值到一个新的切片,然后对切片进行排序。 SortedFunc类似于Sorted,但带有比较函数。 SortedStableFunc类似于SortFunc,但使用稳定排序算法。 Chunk返回一个迭代器,该迭代器在切片的连续子切片上循环,最多包含n个元素。 maps包添加了几个与迭代器一起使用的函数:

All从映射中返回键值对的迭代器。 Keys返回映射中键的迭代器。 Values返回映射中值的迭代器。 Insert将迭代器中的键值对添加到现有映射。 Collect从迭代器中收集键值对到一个新的映射并返回。

新的结构包

新的structs包提供了修改包含结构类型的属性(如内存布局)的结构字段类型。

在此版本中,唯一这样的类型是HostLayout,它表示具有该类型字段的结构具有符合主机平台期望的布局。在传递给主机API、从主机API返回或通过指针传递给/从主机API访问的类型中使用HostLayout。没有此标记,结构布局顺序不受语言规范保证,尽管截至Go 1.23,主机和语言布局恰好匹配。

库的细微更改

archive/tar

如果FileInfoHeader的参数实现了新的FileInfoNames接口,那么将使用接口方法设置文件头的Uname/Gname。这允许应用程序覆盖系统相关的Uname/Gname查找。

crypto/tls

TLS客户端现在支持加密客户端Hello草案规范。这个功能可以通过将Config.EncryptedClientHelloConfigList字段设置为正在连接的主机的编码ECHConfigList来启用。

QUIC实现使用的QUICConn类型包括新的事件报告会话恢复的状态,并为QUIC层提供了一种将数据添加到会话票据和会话缓存条目的方法。

3DES密码套件已从Config.CipherSuites为nil时使用的默认列表中删除。可以通过在GODEBUG环境变量中添加tls3des=1来恢复默认设置。

实验性的后量子密钥交换机制X25519Kyber768Draft00在Config.CurvePreferences为nil时默认启用。可以通过在GODEBUG环境变量中添加tlskyber=0来恢复默认设置。

Go 1.23改变了X509KeyPair和LoadX509KeyPair的行为,以填充返回的Certificate的Certificate.Leaf字段。为此行为添加了新的x509keypairleaf GODEBUG设置。

crypto/x509

CreateCertificateRequest现在正确支持RSA-PSS签名算法。

CreateCertificateRequest和CreateRevocationList现在使用签名者的公钥验证生成的签名。如果签名无效,将返回错误。这一直是自Go 1.16以来CreateCertificate的行为。

x509sha1 GODEBUG设置将在下一个Go主要版本(Go 1.24)中被移除。这将意味着crypto/x509将不再支持验证使用基于SHA-1的签名算法的证书上的签名。

新的ParseOID函数解析点编码的ASN.1对象标识符字符串。OID类型现在实现了encoding.BinaryMarshaler,encoding.BinaryUnmarshaler,encoding.TextMarshaler,encoding.TextUnmarshaler接口。

database/sql

新的DBStats.MaxIdleClosed字段报告了由于空闲连接超过MaxIdleTime而被关闭的连接数。

debug/dwarf

dwarf.New函数现在接受一个新的选项WithDWARFv5,该选项允许读取DWARFv5格式的调试信息。默认情况下,DWARFv5格式仍然不受支持。

encoding/csv

csv.Reader现在支持将字段解析为字符串,而不仅仅是字节切片。新的Fields方法返回[]string,而不是[]byte。Read方法仍然返回[]byte,但现在可以通过新的ReadStrings方法更改为返回[]string。

encoding/json

json.Decoder现在支持将值解码为字符串,而不仅仅是字节切片。新的DecodeString方法解码JSON字符串为Go字符串。

html/template

html/template包现在支持自定义函数,可以在模板中使用。新的FuncMap类型定义了一个函数映射,可以在解析模板时传递给Parse和ParseFiles。这些函数可以在模板动作中使用,就像text/template包一样。

net/http

http.Transport现在支持新的DialTLSContext选项,它允许在连接到HTTPS服务器时自定义TLS握手。这与DialContext选项类似,但适用于TLS连接。

os

新的os.FileInfo接口方法ModeType返回文件的类型。这使得在不使用os.FileMode的情况下检查文件类型成为可能。

runtime

runtime包的新函数CallersFramesWithOpts允许在获取调用者帧时指定选项。目前支持的唯一选项是Skip,它允许跳过指定数量的帧。

sync

sync.Pool现在支持清除池中的所有对象。新的Purge方法删除池中的所有对象,这些对象将不再可用。这对于在长时间运行的程序中释放内存可能很有用。

Ports

Darwin

正如在 Go 1.22 版本说明中宣布的那样,Go 1.23 需要 macOS 11 Big Sur 或更高版本;对之前版本的支持已被终止。

Linux

Go 1.23 是最后一个需要 Linux 内核版本 2.6.32 或更高版本的发布版本。Go 1.24 将需要 Linux 内核版本 3.17 或更高版本,但对于运行 3.10 或更高版本的系统,如果内核已被修补以支持 getrandom 系统调用,则将继续支持。

OpenBSD

Go 1.23 增加了对 64 位 RISC-V 上的 OpenBSD(GOOS=openbsd,GOARCH=riscv64)的实验性支持。

ARM64

Go 1.23 引入了一个新的 GOARM64 环境变量,该变量在编译时指定 ARM64 架构的最低目标版本。允许的值为 v8.{0-9} 和 v9.{0-5}。这之后可以跟随一个选项,指定目标硬件实现的扩展。有效选项为 ,lse 和 ,crypto。

GOARM64 环境变量默认为 v8.0。

RISC-V

Go 1.23 引入了一个新的 GORISCV64 环境变量,该变量选择要编译的 RISC-V 用户模式应用程序配置文件。允许的值为 rva20u64 和 rva22u64。

GORISCV64 环境变量默认为 rva20u64。

Wasm

GOROOT/misc/wasm 中的 go_wasip1_wasm_exec 脚本已不再支持版本低于 14.0.0 的 wasmtime。


本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

原作者: amc,欢迎转载,但请注明出处。

原文标题:《Go 1.23 发布笔记 AI 翻译》

发布日期:2024-08-15

原文链接:https://cloud.tencent.com/developer/article/2444771。

CC BY-NC-SA 4.0 DEED.pngCC BY-NC-SA 4.0 DEED.png
go

0 人点赞