第32节 go语言1.20发布
❤️💕💕Go语言高级篇章,在此之前建议您先了解基础和进阶篇。Myblog:http://nsddd.top
Go语言基础篇
Go语言100篇进阶
[TOC]
开始
可以访问下载页面获取它
向下兼容,无脑升就好了!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官方博客(https://go.dev/blog/go1.20)和Go语言官方文档(https://tip.golang.org/doc/go1.20)了解更多关于Go语言1.20版本的详细信息。