在 Go 1.18 的发布之后,Go 仍然在继续开发新的功能。目前,1.19 RC1已经发布,该版本将于2022年8月发布。让我们来看看Go 1.19的内容。
Atomic Types
Bool
、Int32
、Int64
、Uint32
、Uint64
、Uintptr
和 Pointer
是 sync/atomic
包下的新原子类型。如果你不熟悉,我们可以将原子包概括为 "提供对实现同步算法有用的低级原子内存原语”。
有了这些新类型,我们可以使用 Load、Store、Swap、CompareAndSwap 函数。Add 函数也可用于数字类型。这些函数简化了我们在Go 1.19之前编写的代码,你可以在Go Playground上查看这些新代码。
Soft Memory Limit
你可能知道,在 Go 上调整内存时,你只有一个选项,就是设置 GOGC(runtime/debug.SetGCPercent)
。尽管这种优化基本上在 CPU 和内存之间进行了权衡,但它并不尊重用户的内存限制。
如提案中所述,我们可以用 GOMEMLIMIT
环境变量或 runtime/debug.SetMemoryLimit
函数定义一个软内存限制。
有了这个新功能,我们可以减少内存限制,定义更好的内存利用率。现在可能是时候抛弃 twitch
团队给我们的内存镇流器的工作方法了。
New Functions
Go 1.19的核心库有几个变化。当我检查这些时,我选择了其中一些对我来说似乎很重要的变化。
fmt
有新的函数用于追加数据。Append
,Appendf
和Appendln
sort.Find
是一个新的函数,用于寻找具有比较器功能的最小索引。它提供了比sort.Search
更好的体验。- 排序算法切换到
Pattern-defeating Quicksort
,以便在几种情况下获得更快的结果。 - 新的
JoinPath
函数通过连接路径元素的列表创建一个新的URL。
path, err := url.JoinPath("services", "data", id)
Unix build constraint
unix
是一个新的构建约束,如果GOOS
是其中之一,则满足该约束。
Compiler
编译器现在使用跳转表来实现大型整数和字符串切换语句。切换语句的性能改进各不相同,但可以快20%左右。(仅 GOARCH=amd64
和 GOARCH=arm64
)
你可以查看这个基准的细节。
在1.19版本中,社区工作良好,并照顾到了一些性能优化。许多改进和修复也将在这个版本中出现。