go1.20新特性 | 青训营创作

325 阅读4分钟

[这是我参与第五届青训营 」伴学笔记创作活动的第 16 天

第32节 go语言1.20发布

❤️💕💕Go语言高级篇章,在此之前建议您先了解基础和进阶篇。Myblog:nsddd.top

Go语言基础篇

Go语言100篇进阶


开始

image-20230202132639133

可以访问下载页面获取它

向下兼容,无脑升就好了!Go 1.20 amd64 版本 95MB,相比 Go 1.19 144MB,以及 Go 1.18.10 138MB 来说,降幅达到了 49MB

最新的 Go 版本 1.20 在Go 1.19 发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了 Go 1的兼容性承诺。我们期望几乎所有的 Go 程序都能像以前一样继续编译和运行。

语言的变化

四个变化:

  1. Go 1.17 添加了从切片到数组指针的转换。Go 1.20 扩展了它以允许从切片到数组的转换:给定一个切片x,[4]byte(x)现在可以写成*(*[4]byte)(x).
  2. unsafe定义了三个新函数SliceDataStringStringData。与 Go 1.17 一起Slice,这些函数现在提供了构建和解构切片和字符串值的完整能力,而不依赖于它们的确切表示。
  3. 该规范现在定义结构值一次比较一个字段,按照它们在结构类型定义中出现的顺序考虑字段,并在第一个不匹配时停止。之前可以阅读规范,就好像所有字段都需要比较第一个不匹配之外的字段。类似地,该规范现在定义数组值按递增索引顺序一次比较一个元素。在这两种情况下,差异会影响某些比较是否必须恐慌。现有程序没有改变:新的规范措辞描述了实现一直所做的事情。
  4. 可比较的类型(例如普通接口)现在可以满足comparable约束,即使类型参数不是严格可比较的(比较可能会在运行时崩溃)。这使得实例化受约束的类型参数comparable (例如,用户定义的通用映射键的类型参数)与非严格可比较的类型参数(例如接口类型或包含接口类型的复合类型)成为可能。

性能提升

从 Go 1.21 开始,一些较旧的操作系统将不再受支持:这包括 Windows 7、8、Server 2008 和 Server 2012、macOS 10.13 High Sierra 和 10.14 Mojave。另一方面,Go 1.20 添加了对 RISC-V 上的 FreeBSD 的实验性支持。

  • 编译器和垃圾收集器的改进减少了内存开销,并将整体 CPU 性能提高了 2%。
  • 专门针对编译时间的工作导致构建改进高达 10%。这使构建速度与 Go 1.17 保持一致。

OS 兼容版本

很多还是 Windows7、8 的用户,赶紧升 Go 1.20 吧,这将是最后一个版本。

  • 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 或更高版本。

Tool

  • cover工具现在可以收集整个程序的覆盖率概况,而不仅仅是单元测试。
  • go工具不再依赖于$GOROOT/pkg目录中预编译的标准库包存档,并且它们不再随发行版一起提供,从而减少了下载量。相反,标准库中的包是根据需要构建的,并像其他包一样缓存在构建缓存中。
  • 的实施go test -json已得到改进,以使其在出现杂散写入时更加健壮stdout
  • go buildgo install其他与构建相关的命令现在接受一个-pgo启用配置文件引导优化的标志以及一个-cover用于整个程序覆盖率分析的标志。
  • go命令现在默认在没有 C 工具链的系统上禁用cgo。因此,当 Go 安装在没有 C 编译器的系统上时,它现在将对标准库中的包使用纯 Go 构建,这些包可以选择使用 cgo,而不是使用预分发的包存档(已被删除,如上所述) .
  • vet工具报告了在并行运行的测试中可能发生的更多循环变量引用错误。

标准库

  • crypto/ecdh包明确支持 NIST 曲线和 Curve25519 上的椭圆曲线 Diffie-Hellman 密钥交换。
  • 新函数返回一个包含错误列表的错误,如果错误类型实现了该方法errors.Join,则可以再次获取错误列表。Unwrap() []error
  • http.ResponseController类型提供对接口未处理的扩展的按请求功能的 http.ResponseWriter访问。
  • httputil.ReverseProxy 转发代理包括一个新的钩子Rewrite函数,取代了以前的Director钩子。
  • context.WithCancelCause函数提供了一种方法来取消具有给定错误的上下文。可以通过调用新 context.Cause函数来检索该错误。
  • os/exec.Cmd字段CancelWaitDelay指定 Cmd其关联Context被取消或进程退出时的行为。

其他的一些内容

链接器:

Go 1.20 对编译器生成的符号使用go:andtype:前缀,而不是go.and type.。这避免了名称以 . 开头的用户包的混淆go.。该debug/gosym软件包理解使用 Go 1.20 及更新版本构建的二进制文件的新命名约定。

  • $GOROOT/pkg 目录不再存储标准存档的预编译包存档,以减少 Go 发行版的大小。
  • go 命令现在定义架构功能 build flags,如 amd64.V2,以允许根据特定 CPU 架构功能的存在或不存在来选择包实现文件。这对于 x86_64 微架构特性级别的工作来说是个好消息。
  • go build 和 go install 以及其他与构建相关的命令现在支持 “-cover” flag,用于启用带有 code coverage instrumentation 的构建。
  • 由于在垃圾收集器上的工作,内存开销减少和 CPU 性能提高高达 2%。
  • 对 Profile Guided Optimizations (PGO) 的预览支持。
  • 在 Linux 上,linker 现在在链接时为 glibc 或 musl 选择动态解释器。
  • 一个新的 crypto/ecdh 包,为 NIST curves 和 Curve25519 上的 Elliptic Curve Diffie-Hellman 密钥交换提供明确支持。

END 链接

请参考Go官方博客(go.dev/blog/go1.20…