[这是我参与第五届青训营 」伴学笔记创作活动的第 16 天
第32节 go语言1.20发布
❤️💕💕Go语言高级篇章,在此之前建议您先了解基础和进阶篇。Myblog:nsddd.top
Go语言基础篇
Go语言100篇进阶
开始
可以访问下载页面获取它
向下兼容,无脑升就好了!Go 1.20 amd64 版本 95MB,相比 Go 1.19 144MB,以及 Go 1.18.10 138MB 来说,降幅达到了 49MB。
最新的 Go 版本 1.20 在Go 1.19 发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了 Go 1的兼容性承诺。我们期望几乎所有的 Go 程序都能像以前一样继续编译和运行。
语言的变化
四个变化:
- 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.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 build
和go 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
字段Cancel
并WaitDelay
指定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…