第32节 go语言1.20发布

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

Go语言基础篇open in new window

Go语言100篇进阶open in new window


[TOC]

开始

image-20230202132639133

可以访问下载页面open in new window获取它

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

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

语言的变化

四个变化:

  1. Go 1.17 添加了从切片到数组指针的转换open in new window。Go 1.20 扩展了它以允许从切片到数组的转换:给定一个切片x,[4]byte(x)现在可以写成*(*[4]byte)(x).
  2. unsafeopen in new window定义了三个新函数SliceDataStringStringData。与 Go 1.17 一起Slice,这些函数现在提供了构建和解构切片和字符串值的完整能力,而不依赖于它们的确切表示。
  3. 该规范现在定义结构值一次比较一个字段,按照它们在结构类型定义中出现的顺序考虑字段,并在第一个不匹配时停止。之前可以阅读规范,就好像所有字段都需要比较第一个不匹配之外的字段。类似地,该规范现在定义数组值按递增索引顺序一次比较一个元素。在这两种情况下,差异会影响某些比较是否必须恐慌。现有程序没有改变:新的规范措辞描述了实现一直所做的事情。
  4. 可比较的类型open in new window(例如普通接口)现在可以满足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工具open in new window现在可以收集整个程序的覆盖率概况,而不仅仅是单元测试。
  • go工具open in new window不再依赖于$GOROOT/pkg目录中预编译的标准库包存档,并且它们不再随发行版一起提供,从而减少了下载量。相反,标准库中的包是根据需要构建的,并像其他包一样缓存在构建缓存中。
  • 的实施go test -json已得到改进,以使其在出现杂散写入时更加健壮stdout
  • go buildgo install其他与构建相关的命令现在接受一个-pgo启用配置文件引导优化的标志以及一个-cover用于整个程序覆盖率分析的标志。
  • go命令现在默认在没有 C 工具链的系统上禁用cgo。因此,当 Go 安装在没有 C 编译器的系统上时,它现在将对标准库中的包使用纯 Go 构建,这些包可以选择使用 cgo,而不是使用预分发的包存档(已被删除,如上所述) .
  • vet工具open in new window报告了在并行运行的测试中可能发生的更多循环变量引用错误。

标准库

其他的一些内容

链接器:

Go 1.20 对编译器生成的符号使用go:andtype:前缀,而不是go.and type.。这避免了名称以 . 开头的用户包的混淆go.。该debug/gosymopen in new window软件包理解使用 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官方博客(https://go.dev/blog/go1.20)和Go语言官方文档(https://tip.golang.org/doc/go1.20)了解更多关于Go语言1.20版本的详细信息。