Go 1.23 使(Go 1.22) “range-over-func”实验成为 该语言的一部分。 “for-range”循环中的“range”子句现在接受以下类型的迭代器函数
func(func() bool) func(func(K) bool) func(func(K, V) bool)
作为范围表达式。 调用迭代器参数函数会生成“for-range”循环的迭代值。 详细信息请参阅 iter 包文档和 语言规范 。 如需了解动机,请参阅 2022 年 “range-over-func”讨论 。
Go 1.23 包含对 泛型类型别名的 预览支持。 构建工具链 GOEXPERIMENT=aliastypeparams 在包中启用此功能。 (尚不支持跨包边界使用通用别名类型。)
从 Go 1.23 开始,Go 工具链可以收集使用情况和损坏情况 帮助 Go 团队了解 Go 工具链的统计数据 使用情况以及效果如何。我们将这些统计数据称为 进行遥测 。
Go 遥测是一个 选择加入系统 ,由 go telemetry 命令 。 默认情况下,工具链程序 收集可以在本地检查的计数器文件中的统计信息 但在其他方面未使用( go telemetry local)。
为了帮助我们保持 Go 良好运行并了解 Go 的用法, 请考虑通过运行选择加入 Go 遥测 go telemetry on。 在那种模式下, 匿名反驳报告上传至 telemetry.go.dev 周刊, 它们被聚合成图表并制作 任何 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 设置 适用于正在使用的工作模块或工作区。
这 go vet 子命令现在包括 标准版本 分析器,标记对版本来说太新的符号的引用 Go 在引用文件中生效。 (有效版本确定 由 go 文件附件中的指令 go.mod 文件,以及 由任何 //go:build 限制条件 在文件中。)
例如,它将报告诊断以供参考 reflect.TypeFor 函数(在 go1.22 中引入)来自 a 中的文件 go.mod 文件指定的模块 go 1.21。
cmd/cgo 支持新的 -ldflags flag 用于将标志传递给 C 链接器。 这 go 命令自动使用它,避免“参数列表太长” 错误非常大 CGO_LDFLAGS。
这 trace 工具现在可以通过尝试更好地容忍部分损坏的痕迹 恢复它可以恢复的跟踪数据。此功能在以下情况下特别有用: 查看程序崩溃期间收集的跟踪,因为跟踪数据 导致崩溃的原因现在可以 恢复 在大多数情况下 情况。
在未处理的恐慌或其他情况之后运行时打印的回溯 致命错误现在缩进错误的第二行和后续行 通过单个选项卡发送消息(例如,恐慌的参数),以便 它可以与堆栈跟踪明确区分开来 第一个协程。请参阅 #64590 进行讨论。
进行构建的构建时间开销 使用配置文件引导优化 已显着减少。 以前,启用 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。
第一的, Timer沙 Ticker程序不再引用的 s 立即有资格进行垃圾收集,即使他们 Stop 方法尚未被调用。 Go 的早期版本不会不间断地收集 Timer直到之后 他们开火了,却从未不间断地收集 Tickers。
其次,定时器通道关联 Timer 或者 Ticker 是 现在无缓冲,容量为 0。 这一变化的主要影响是 Go 现在保证 对于任何呼叫 Reset 或者 Stop 方法,没有陈旧的值 在该呼叫之前准备好将在呼叫之后发送或接收。 Go 的早期版本使用带有单元素缓冲区的通道, 使其难以使用 Reset 和 Stop 正确。 这一变化的一个明显效果是 len 和 cap 定时器通道数 现在返回 0 而不是 1,这可能会影响以下程序 轮询长度以决定定时器通道上是否接收 会成功的。 此类代码应使用非阻塞接收。
这些新行为仅在主 Go 程序运行时才会启用 位于一个带有 go.mod go 使用 Go 1.23.0 或更高版本。 当 Go 1.23 构建较旧的程序时,旧的行为仍然有效。 新的 GODEBUG设置 asynctimerchan=1 可用于恢复异步通道行为 即使程序在其名称中命名为 Go 1.23.0 或更高版本 go.mod 文件。
新的 unique 包提供设施 规范化值(例如“interning”或“hash-consing”)。
任何可比较类型的值都可以用新的规范化 Make[T] 函数,它生成对规范副本的引用 a 形式的值 Handle[T]。 二 Handle[T] 当且仅当用于产生的值相等 句柄相等,允许程序删除重复值并减少 他们的内存足迹。 比较两个 Handle[T] 值是有效的,简化为简单的 指针比较。
新的 iter 包提供了使用的基本定义 用户定义的迭代器。
这 slices 包添加了几个与迭代器一起使用的函数:
这 maps 包添加了几个与迭代器一起使用的函数:
新的 structs 套餐提供 修改属性的结构体字段的类型 包含的结构类型,例如内存布局。
在此版本中,唯一的此类类型是 HostLayout 这表明具有该字段的结构 type 具有符合主机平台的布局 期望。 HostLayout 应该用于以下类型 传递给、返回或访问 通过传入/传出主机 API 的指针。 如果没有这个标记,结构布局顺序就不会 由语言规范保证,但从 Go 1.23 开始 主机和语言布局恰好匹配。
如果参数为 FileInfoHeader 实施新的 FileInfoNames 接口,那么接口方法将用于设置Uname/Gname 文件头的。这允许应用程序覆盖依赖于系统的 Uname/Gname 查找。
TLS 客户端现在支持 Encrypted Client Hello 草案规范 。 可以通过设置来启用此功能 Config.EncryptedClientHelloConfigList 字段到正在连接的主机的编码 ECHConfigList。
这 QUICConn QUIC 实现使用的类型包括新事件 报告会话恢复的状态,并提供一种方法 QUIC 层将数据添加到会话票证和会话缓存条目。
3DES 密码套件已从以下情况下使用的默认列表中删除: Config.CipherSuites 为零。可以通过添加来恢复默认值 tls3des=1 到 GODEBUG 环境变量。
实验性后量子密钥交换机制X25519Kyber768Draft00 现在默认启用 Config.CurvePreferences 为零。 可以通过添加来恢复默认值 tlskyber=0 到 GODEBUG 环境变量。
Go 1.23 改变了行为 X509KeyPair 和 LoadX509KeyPair 来填充 Certificate.Leaf 返回的字段 Certificate。 新的 x509keypairleaf GODEBUG 设置。 为此行为添加了
CreateCertificateRequest 现在正确支持 RSA-PSS 签名算法。
CreateCertificateRequest 和 CreateRevocationList 现在使用签名者的公钥验证生成的签名。如果签名无效,则返回错误。这一直是 CreateCertificate 从 Go 1.16 开始。
这 x509sha1 GODEBUG设置 将 将在下一个 Go 主要版本 (Go 1.24) 中删除。这将意味着 crypto/x509 将不再支持验证使用基于 SHA-1 的证书上的签名 签名算法。
新的 ParseOID 函数解析点编码的 ASN.1 对象标识符字符串。 这 OID 类型现在实现了 encoding.BinaryMarshaler, encoding.BinaryUnmarshaler, encoding.TextMarshaler, encoding.TextUnmarshaler 接口。
返回的错误 driver.Valuer 现在包装了实现 改进了操作期间的错误处理,例如 DB.Query, DB.Exec, 和 DB.QueryRow。
这 debug/elf 包现在定义 PT_OPENBSD_NOBTCFI。这 ProgType 是 用于禁用分支跟踪控制流完整性 (BTCFI) 强制执行 在 OpenBSD 二进制文件上。
现在定义符号类型常量 STT_RELC, STT_SRELC, 和 STT_GNU_IFUNC。
新的 Encode 和 Decode 函数是字节片等价物 到 Read 和 Write。 Append 允许将多个数据编组到同一个字节片中。
新的 Preorder 函数返回一个方便的迭代器 语法树的节点。
这 Func type,代表函数或方法符号,现在 有一个 Func.Signature 返回函数类型的方法,其中 总是一个 Signature。
这 Alias 类型现在有一个 Rhs 返回类型的方法 其声明的右侧:给定 type A = B, 这 Rhs 的 A 是 B。( #66559 )
方法 Alias.Origin, Alias.SetTypeParams, Alias.TypeParams, 和 Alias.TypeArgs 已添加。通用别名类型需要它们。
默认情况下,go/types 现在生成 Alias 类型别名的类型节点。 此行为可以通过以下方式控制 GODEBUG gotypesalias 旗帜。 它的默认值已从 Go 1.22 中的 0 更改为 Go 1.23 中的 1。
这 Uint 功能和 Rand.Uint 方法已添加。 他们无意中被排除在 Go 1.22 之外。
新的 ChaCha8.Read 方法实现了 io.Reader 界面。
新类型 KeepAliveConfig 允许微调保持活动状态 TCP 连接的选项,通过一个新的 TCPConn.SetKeepAliveConfig 方法和新的 KeepAliveConfig 字段 Dialer 和 ListenConfig。
这 DNSError type 现在包含由超时或取消引起的错误。 例如, errors.Is(someDNSErr, context.DeadlineExceedeed) 现在将报告 DNS 错误是否是由超时引起的。
新的 GODEBUG 环境 netedns0=0 禁用发送 EDNS0 DNS 请求上的附加标头,因为据报道它们破坏了 DNS 某些调制解调器上的服务器。
Cookie 现在保留 cookie 值周围的双引号。 新的 Cookie.Quoted 字段指示是否 Cookie.Value 最初被引用。
新的 Request.CookiesNamed 方法检索与给定名称匹配的所有 cookie。
新的 Cookie.Partitioned 字段标识具有 Partitioned 属性的 cookie。
使用的模式 ServeMux 现在,方法名称后允许有一个或多个空格或制表符。 以前,只允许有一个空格。
新的 ParseCookie 函数解析 Cookie 标头值并 返回其中设置的所有 cookie。因为同一个cookie 名称可以出现多次返回值可以包含 给定键有多个值。
新的 ParseSetCookie 函数解析 Set-Cookie 标头值并 返回一个cookie。它返回语法错误的错误。
ServeContent, ServeFile, 和 ServeFileFS 现在删除 这 Cache-Control, Content-Encoding, Etag, 和 Last-Modified 提供错误时的标头。这些标头通常适用于 非错误内容,但不至于错误的文字。
中间件封装了一个 ResponseWriter 并即时应用 编码,例如 Content-Encoding: gzip,之后将无法运行 这个变化。之前的行为 ServeContent, ServeFile, 和 ServeFileFS 可以通过设置来恢复 GODEBUG=httpservecontentkeepheaders=1。
请注意,中间件会更改所提供内容的大小 (例如通过压缩)已经无法正常工作 ServeContent 处理范围请求。即时压缩 应该使用 Transfer-Encoding 标题而不是 Content-Encoding。
对于入站请求,新 Request.Pattern 字段包含 ServeMux 与请求匹配的模式(如果有)。当以下情况时不设置该字段 GODEBUG=httpmuxgo121=1 已设置。
新的 NewRequestWithContext 方法创建一个传入请求 一个 context.Context。
在 Go 1.22 及更早版本中,使用 reflect.DeepEqual 比较一个 Addr 持有一个 IPv4 地址 该地址的 IPv4 映射 IPv6 形式错误地返回 true, 尽管 Addr 与比较时的值不同 == 或者 Addr.Compare。 此错误现已修复,所有三种方法现在报告相同 结果。
这 Stat 函数现在设置 ModeSocket 有点为 Windows 上的 Unix 套接字文件。这些文件被识别 通过将重新解析标签设置为 IO_REPARSE_TAG_AF_UNIX。
在 Windows 上,模式位由 Lstat 和 Stat 为了 重新分析点已更改。挂载点不再有 ModeSymlink 放, 和不是符号链接、Unix 套接字或重复数据删除文件的重新分析点 现在总是有 ModeIrregular 放。 此行为由 winsymlink 环境。 对于 Go 1.23,默认为 winsymlink=1。 以前的版本默认为 winsymlink=0。
这 CopyFS 函数复制一个 io/fs.FS 到本地文件系统。
在 Windows 上, Readlink 不再尝试使交易量正常化 驱动字母,这并不总是可能的。 此行为由 winreadlinkvolume 环境。 对于 Go 1.23,默认为 winreadlinkvolume=1。 以前的版本默认为 winreadlinkvolume=0。
在支持 pidfd 的 Linux 上(通常是 Linux v5.4+), Process相关函数和方法使用pidfd(而不是 比 PID)在内部消除了重复使用 PID 时潜在的误定位 由操作系统。 Pidfd 支持对于用户来说是完全透明的,除了额外的 进程可能拥有的进程文件描述符。
新的 Localize 函数安全地转换斜杠分隔的 路径进入操作系统路径。
在 Windows 上, EvalSymlinks 不再评估安装点, 这是许多不一致和错误的根源。 此行为由 winsymlink 环境。 对于 Go 1.23,默认为 winsymlink=1。 以前的版本默认为 winsymlink=0。
在 Windows 上, EvalSymlinks 不再尝试正常化 卷驱动器字母,这并不总是可能的。 此行为由 winreadlinkvolume 环境。 对于 Go 1.23,默认为 winreadlinkvolume=1。 以前的版本默认为 winreadlinkvolume=0。
这 Value.Pointer 和 Value.UnsafePointer 方法现在支持 kind 的值 String。
新方法 Value.Seq 和 Value.Seq2 返回迭代该值的序列 就像在 for/range 循环中使用它一样。 新方法 Type.CanSeq 和 Type.CanSeq2 报告是否呼叫 Value.Seq 和 Value.Seq2,分别会成功而不会惊慌。
这 SetCrashOutput 函数允许用户指定一个替代的 运行时应将其致命崩溃报告写入其中的文件。 它可用于为所有人员构建自动报告机制 意外崩溃,不仅仅是那些明确使用的 goroutine 中的崩溃 recover。
最大堆栈深度为 alloc, mutex, block, threadcreate 和 goroutine 配置文件已从 32 帧增加到 128 帧。
现在,当程序由于以下原因崩溃时,运行时会显式刷新跟踪数据: 未受惊慌。这意味着更完整的跟踪数据将在 跟踪处于活动状态时程序是否崩溃。
这 Repeat 函数返回一个重复的新切片 提供给定次数的切片。
这 Map.Clear 方法删除所有条目,导致 一个空的 Map。它类似于 clear。
新的 And 和 Or 运算符按位应用 AND 或者 OR 到 给定的输入,返回旧值。
系统调用包现在定义 WSAENOPROTOOPT 在 Windows 上。
这 GetsockoptInt Windows 现已支持该功能。
TestFS 现在返回一个可以解包的结构化错误 (通过方法 Unwrap() []error)。这允许检查错误 使用 errors.Is 或者 errors.As。
模板现在支持新的“else with”操作,这降低了某些用例中的模板复杂性。
Parse 和 ParseInLocation 现在如果时区返回错误 偏移量超出范围。
这 RuneLen 函数返回 16 位字的数量 符文的 UTF-16 编码。如果符文返回-1 不是以 UTF-16 编码的有效值。
正如 宣布的 Go 1.22 发行说明中所 那样, Go 1.23 需要 macOS 11 Big Sur 或更高版本; 对以前版本的支持已停止。
Go 1.23 是最后一个需要 Linux 内核版本 2.6.32 或更高版本的版本。 Go 1.24 将需要 Linux 内核版本 3.17 或更高版本,但运行 3.10 或更高版本的系统将继续受支持,如果内核已修补以支持 getrandom 系统调用。
Go 1.23 在 64 位 RISC-V 上添加了对 OpenBSD 的实验性支持( GOOS=openbsd, GOARCH=riscv64)。
Go 1.23 引入了一个新的 GOARM64 环境变量,指定编译时ARM64架构的最低目标版本。允许的值为 v8.{0-9} 和 v9.{0-5}。其后可能是指定由目标硬件实现的扩展的选项。有效选项有 ,lse 和 ,crypto。
这 GOARM64 环境变量默认为 v8.0。
Go 1.23 引入了一个新的 GORISCV64 环境变量,它选择 RISC-V 用户模式应用程序配置文件 要编译的 。允许的值为 rva20u64 和 rva22u64。
这 GORISCV64 环境变量默认为 rva20u64。
这 go_wasip1_wasm_exec 脚本在 GOROOT/misc/wasm 已放弃支持 对于以下版本 wasmtime < 14.0.0。