Go 1.19发布已经将近6个月了,社区已经发布了Go 1.20的rc3版本。如果你想知道早期版本有哪些功能,可以查看快速指南:Go 1.19功能。
Go 1.20将于2023年2月发布。你可以查看发布状态。现在让我们看看Go 1.20有哪些新功能。
目录
多个错误的包装
使用这个功能,我们可以将多个错误快速包装成一个错误。
func Join(errs ...error) error
fmt.Errorf
和 errors
包的函数现在支持多个错误。下面是这些函数的一个示例用法。
这段代码将返回“one for all, all for one
”和“err2
”。
跳过模式
Go CLI具有一种新功能,可以使用模式来跳过。下面是一个简单的使用示例。
你可以跳过集成测试。
这个跳过模式也可以用于基准测试和代码生成。
go test -bench=. -v -skip=<pattern>
go generate -skip=<pattern>
带取消的上下文
在Go 1.20版本之后,我们可以通过原因来取消上下文。
func WithCancelCause(parent Context) (ctx Context, cancel CancelCauseFunc)
//
ctx, cancel := context.WithCancelCause(parent)
cancel(myError)
ctx.Err() // returns context.Canceled
context.Cause(ctx) // returns myError
不安全包
你可能不知道,unsafe
包提供了底层编程的功能,包括违反类型系统的操作*。即使这个包的名称是为了保持距离,但它在优化底层性能方面变得越来越重要。
该包的能力已经扩展到了SliceData
、String
和StringData
函数。这些函数可以构造和解构切片和字符串值,而不依赖于它们的确切表示。
可比较接口
可比较类型通过comparable
接口进行定义,该接口可用于约束类型参数函数。例如,你可以为所有可比较类型编写相等函数。
理解哪些类型是可比较的有点棘手。在Go文档中描述如下:
- 布尔、数值、字符串、指针和通道类型是严格可比的。
- 如果所有字段类型都是严格可比的,则结构类型是严格可比的。
- 如果它们的数组元素类型是严格可比的,则数组类型是严格可比的。
- 如果它们类型集中的所有类型都是严格可比的,则类型参数是严格可比的。
基于性能剖析的优化
Go 1.20为可执行代码块提供了一种新的基于性能剖析的优化。默认情况下,如果内联的成本大于80,就不会内联。使用PGO,Go更积极地调用内联函数。这种内联优化可以将基准测试的性能提高约3-4%。这个功能是预览版,将在未来的版本中得到改进。
不包含内存区域
谷歌声称,他们通过这个功能将CPU使用率降低了多达15%。即使这个提案在Go 1.20计划中有一段时间。**它已经从发布计划中删除。**如果你仍然对它感兴趣,可以查看这篇文章。
其他变化
go
命令现在默认禁用cgo
。这使得Go在某些最小的容器环境和macOS上的工作更加顺畅,因为自Go 1.16以来,基于cgo
的软件包没有使用预分发的包归档。- 垃圾收集器的优化可提高CPU性能达到2%。
- 从此版本开始,Go具有内置的集成测试覆盖率功能。
go build
和go test
不再使用-i
命令。- Go 1.20是以下操作系统的最后一个版本:- Windows 7、8、Server 2008和2012- MacOS 10.13 High Sierra和10.14 Mojave。
参考资料:
- *https://tip.golang.org/ref/spec#Package_unsafe
- https://tip.golang.org/doc/go1.20#compiler
- https://tip.golang.org/doc/go1.20
译自:https://medium.com/@emreodabas_20110/quick-guide-go-1-20-features-cda28b4a31d3
评论(0)