谷歌官方正式发布了Go1.20稳定版「八千字详解」

Go1.20 变化不少,该版本依然保持 Go1 兼容性,我们可以升级到 Go1.20,而不需要做任何代码改动。​,图片,可以使用你任何喜欢的方式升级:,比如:go install golang.org/dl/go1.20@latest,具体的可以参考官网教程:https://go.dev/doc/go1.20,最新的 Go 版本 1.20 在Go 1.19 发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。,一如既往,该版本保持了 Go 1的兼容性承诺。我们期望几乎所有的 Go 程序都能像以前一样继续编译和运行。,Go 1.20 包括对语言的四个更改。,Go 1.17 添加了从切片到数组指针的转换。Go 1.20 扩展了它以允许从切片到数组的转换:给定一个切片x,[4]byte(x)​现在可以写成*(*[4]byte)(x).,该unsafe​包定义了三个新函数SliceData、String和StringData​。与 Go 1.17 一起Slice,这些函数现在提供了构建和解构切片和字符串值的完整能力,而不依赖于它们的确切表示。,该规范现在定义结构值一次比较一个字段,按照它们在结构类型定义中出现的顺序考虑字段,并在第一个不匹配时停止。之前可以阅读规范,就好像所有字段都需要比较第一个不匹配之外的字段。类似地,该规范现在定义数组值按递增索引顺序一次比较一个元素。在这两种情况下,差异会影响某些比较是否必须恐慌。现有程序没有改变:新的规范措辞描述了实现一直所做的事情。,可比较的类型(例如普通接口)现在可以满足comparable​约束,即使类型参数不是严格可比较的(比较可能会在运行时崩溃)。这使得实例化受约束的类型参数comparable (例如,用户定义的通用映射键的类型参数)与非严格可比较的类型参数(例如接口类型或包含接口类型的复合类型)成为可能。,Go 1.20 是将在 Windows 7、8、Server 2008 和 Server 2012 的任何版本上运行的最后一个版本。Go 1.21 将至少需要 Windows 10 或 Server 2016。,Go 1.20 是将在 macOS 10.13 High Sierra 或 10.14 Mojave 上运行的最后一个版本。Go 1.21 将需要 macOS 10.15 Catalina 或更高版本。,GOOS=freebsd​Go 1.20 在 RISC-V ( , GOARCH=riscv64) 上添加了对 FreeBSD 的实验性支持。,该目录$GOROOT/pkg​不再存储标准库的预编译包存档: go install​不再写入它们,go​构建不再检查它们,Go 发行版不再运送它们。相反,标准库中的包是根据需要构建的,并缓存在构建缓存中,就像外部的包一样GOROOT。此更改减少了 Go 发行版的大小,还避免了使用 cgo 的包的 C 工具链倾斜。,实施go test -json​ 已得到改进,使其更加健壮。运行的程序go test -json​ 不需要任何更新。直接调用的程序现在应该使用 (例如, 或)而不是普通的来go tool test2json​ 运行测试二进制文件。 -v=test2json“go test -v=test2json“./pkg.test -test.v=test2json“-v,一个相关的变化是 在每个测试程序开始执行时go test -json​ 添加了一个Action​设置为的事件。start​当使用命令运行多个测试时go,这些启动事件保证以与命令行中指定的包相同的顺序发出。,该go​命令现在定义了体系结构功能构建标签,例如amd64.v2​,以允许根据特定体系结构功能的存在或不存在来选择包实现文件。详情请见go help buildconstraint。,go​子命令现在接受 在执行命令之前 将-C <dir>​目录更改为 <dir>,这对于需要在多个不同模块中执行命令的脚本可能很有用。,go build​andgo test​ 命令不再接受-i标志,该标志自 Go 1.16 以来已 被弃用。,该go generate​命令现在接受 -skip <pattern>​跳过//go:generate​匹配的指令<pattern>。,该go test​命令现在接受 -skip <pattern>​跳过测试、子测试或匹配的示例<pattern>。,当主模块位于 中GOPATH/src​时, go install​不再为非main​包安装库GOPATH/pkg​,并且go list​不再报告Target​ 此类包的字段。(在模块模式下,已编译的包仅存储在 构建缓存中 ,但一个错误导致GOPATH安装目标意外地保持有效。),go build和go install​其他与构建相关的命令现在支持-pgo​启用配置文件引导优化的标志,这在下面的 编译器部分中有更详细的描述。该-pgo​标志指定配置文件的文件路径。指定-pgo=auto​会导致go​命令搜索default.pgo​在主包目录中命名的文件,如果存在则使用它。此模式目前需要在命令行上指定一个主包,但我们计划在未来的版本中取消此限制。指定-pgo=off关闭配置文件引导的优化。,go build和go install​其他与构建相关的命令现在支持-cover 使用代码覆盖检测构建指定目标的标志。这在下面的封面部分 中有更详细的描述 。,该go version -m​命令现在支持读取更多类型的 Go 二进制文件,最值得注意的是,使用构建的 Windows DLLgo build -buildmode=c-shared 和没有执行权限的 Linux 二进制文件。,该go​命令现在默认在没有 C 工具链的系统上禁用cgo​。更具体地说,当CGO_ENABLED​环境变量未设置时,环境变量未设置,并且在路径中找不到 CC​默认的 C 编译器(通常是clang​或),默认为. 与往常一样,您可以通过显式设置来覆盖默认值。 gcc“CGO_ENABLED“0“CGO_ENABLED,默认更改最重要的影响是,当 Go 安装在没有 C 编译器的系统上时,它现在将使用纯 Go 构建标准库中使用 cgo 的包,而不是使用预分发的包存档(有已被删除,如上所述)或尝试使用 cgo 并失败。这使得 Go 在一些最小的容器环境以及 macOS 上工作得更好,在 macOS 上,自 Go 1.16 以来,预分发的包存档还没有用于基于 cgo 的包。,标准库中使用 cgo 的包有net​、 os/user​和 plugin​。在 macOS 上,net和os/user​包已被重写为不使用 cgo:相同的代码现在用于 cgo 和非 cgo 构建以及交叉编译的构建。在 Windows 上,net和os/user包从未使用过 cgo。在其他系统上,禁用 cgo 的构建将使用这些包的纯 Go 版本。,在 macOS 上,竞态检测器已被重写为不使用 cgo:启用竞态检测器的程序可以在没有 Xcode 的情况下构建和运行。在 Linux 和其他 Unix 系统以及 Windows 上,需要主机 C 工具链才能使用竞争检测器。,Go 1.20 支持收集程序(应用程序和集成测试)的代码覆盖率配置文件,而不仅仅是单元测试。,要收集程序的覆盖率数据,请使用go build的-cover​标志构建它,然后运行生成的二进制文件,并将环境变量GOCOVERDIR设置为覆盖率配置文件的输出目录。有关如何开始的更多信息,请参阅 “集成测试覆盖率”登录页面。详细设计和实现见 提案。,该工具现在报告 在子测试函数体内vet​调用后对循环变量的引用。T.Parallel()此类引用可能会观察来自不同迭代的变量值(通常会导致测试用例被跳过)或由于不同步的并发访问而导致的无效状态。,该工具还在更多地方检测引用错误。以前它只会考虑循环体的最后一条语句,但现在它递归地检查 if、switch 和 select 语句中的最后一条语句。,vet 工具现在报告使用时间格式 2006-02-01 (yyyy-dd-mm)Time.Format​和 time.Parse。此格式未出现在通用日期标准中,但在尝试使用 ISO 8601 日期格式 (yyyy-mm-dd) 时经常被错误使用。,一些垃圾收集器的内部数据结构被重新组织,以提高空间和 CPU 效率。此更改减少了内存开销并将整体 CPU 性能提高了 2%。,在某些情况下,垃圾收集器在 goroutine 协助方面表现得不太不稳定。,Go 1.20 添加了一个runtime/coverage​包含 API 的新包,用于在运行时从长时间运行和/或不通过os.Exit().,Go 1.20 添加了对配置文件引导优化 (PGO) 的预览支持。PGO 使工具链能够根据运行时配置文件信息执行特定于应用程序和工作负载的优化。目前,编译器支持 pprof CPU 配置文件,可以通过常规方式收集,例如runtime/pprof​或 net/http/pprof​包。要启用 PGO,请通过 -pgo​标志将 pprof 配置文件的路径传递给go build,如上所述。Go 1.20 使用 PGO 更积极地在热调用站点内联函数。一组具有代表性的 Go 程序的基准显示启用配置文件引导的内联优化可将性能提高约 3–4%。请参阅PGO 用户指南获取详细文档。我们计划在未来的版本中添加更多配置文件引导的优化。请注意,配置文件引导的优化是一个预览,因此请谨慎使用。,Go 1.20 编译器升级了它的前端以使用一种新的方式来处理编译器的内部数据,它修复了几个泛型类型问题并在泛型函数和方法中启用了类型声明。,编译器现在 默认拒绝带有编译器错误的匿名接口循环。这些源于嵌入式接口的巧妙使用, 并且一直存在细微的正确性问题,但我们没有证据表明它们确实在实践中使用过。假设没有用户报告受到此更改的不利影响,我们计划更新 Go 1.22 的语言规范以正式禁止它们,以便工具作者也可以停止支持它们。,Go 1.18 和 1.19 的构建速度有所下降,这主要是由于增加了对泛型的支持和后续工作。Go 1.20 将构建速度提高了 10%,使其与 Go 1.17 保持一致。相对于 Go 1.19,生成的代码性能也普遍略有提升。,glibc​ 在 Linux 上,链接器现在为链接时或musl在链接时 选择动态解释器。,在 Windows 上,Go 链接器现在支持现代的基于 LLVM 的 C 工具链。,Go 1.20 对编译器生成的符号使用go:​andtype:​前缀,而不是go.​and type.​。这避免了名称以 . 开头的用户包的混淆go.​。该debug/gosym软件包理解使用 Go 1.20 及更新版本构建的二进制文件的新命名约定。,当从源代码构建 Go 版本GOROOT_BOOTSTRAP​且未设置时,以前版本的 Go 在目录中查找 Go 1.4 或更高版本的引导工具链 $HOME/go1.4(%HOMEDRIVE%%HOMEPATH%go1.4​在 Windows 上)。Go 1.18 和 Go 1.19在回退到 之前首先寻找$HOME/go1.17​或,以预期在引导 Go 1.20 时需要使用 Go 1.17。Go 1.20 确实需要 Go 1.17 版本来进行引导,但我们意识到我们应该采用引导工具链的最新点版本,因此它需要 Go 1.17.13。Go 1.20 寻找或 回退到之前$HOME/sdk/go1.17“$HOME/go1.4“$HOME/go1.17.13“$HOME/sdk/go1.17.13“$HOME/go1.4 (以支持硬编码路径 $HOME/go1.4 但在那里安装了更新的 Go 工具链的系统)。未来,我们计划大约每年将引导工具链向前移动一次,特别是我们预计 Go 1.22 将需要 Go 1.20 的最终版本来进行引导。,Go 1.20 添加了一个新crypto/ecdh包,以明确支持 NIST 曲线和 Curve25519 上的椭圆曲线 Diffie-Hellman 密钥交换。,程序应该为 ECDH 使用crypto/ecdh​而不是低级功能 crypto/elliptic,而为更高级的用例使用第三方模块。,Go 1.20 扩展了对错误包装的支持,允许一个错误包装多个其他错误。,一个错误e​可以通过提供一个Unwrap​返回[]error.,和函数已更新以检查多重包装错误 errors.Is​。 errors.As,该fmt.Errorf​函数现在支持多次出现%w格式动词,这将导致它返回一个包含所有这些错误操作数的错误。,新函数errors.Join 返回一个包含错误列表的错误。,新 “net/http”.ResponseController​ 类型提供对接口未处理的扩展的按请求功能的 “net/http”.ResponseWriter访问。,以前,我们通过定义ResponseWriter​可以实现的可选接口(例如 Flusher. 这些接口不可发现且使用起来很笨拙。,该ResponseController​类型提供了一种更清晰、更易于发现的方式来添加每个处理程序的控件。Go 1.20 中还添加了两个这样的控件是 SetReadDeadline和SetWriteDeadline,它们允许设置每个请求的读写截止日期。例如:,httputil.ReverseProxy​ 转发代理包括一个新的 钩子Rewrite​ 函数,取代了以前的Director钩子。,该Rewrite​挂钩接受一个 ProxyRequest​参数,该参数包括代理接收的入站请求和它将发送的出站请求。与Director​仅对出站请求进行操作的挂钩不同,这允许Rewrite挂钩避免某些情况,在这些情况下,恶意入站请求可能导致挂钩添加的标头在转发之前被删除。请参阅问题 #50580。,该ProxyRequest.SetURL​ 方法将出站请求路由到提供的目的地并取代该NewSingleHostReverseProxy​功能。与 不同的NewSingleHostReverseProxy​是,SetURL​ 还设置了Host出站请求的标头。,该 ProxyRequest.SetXForwarded​ 方法设置出站请求的X-Forwarded-For、X-Forwarded-Host和X-Forwarded-Proto​标头。使用 aRewrite时,默认情况下不会添加这些标头。,Rewrite使用这些功能的挂钩 示例是:,ReverseProxyUser-Agent当传入请求没有时, 不再向转发的请求添加标头。,与往常一样,库有各种小的变化和更新,考虑到 Go 1的兼容性承诺 。还有各种性能提升,这里就不一一列举了。,本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。,谷歌官方正式发布了Go1.20稳定版「八千字详解」,转载本文请联系「 程序员升级打怪之旅」公众号。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/22824.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34