由于Go 1.18推迟一个月发布,这导致Go 1.19版本的开发周期缩短,Go 1.19的新特性冻结(freeze)时间定在了美国时间5月7日。尽管开发周期短,但Go 1.19版本中依然有一些新特性值得我们关注,下面我们就来看第一部分。
Go 1.19的里程碑在这里,所有feature大家可以在该里程碑中看到。
尽管Go核心团队在Go 1.18泛型上投入了很多精力,但Go 1.18发布后泛型这块依然有已知的天生局限,以及后续逐渐发现的一些问题,而Go 1.19版本将继续打磨Go泛型,并重点fix Go 1.18中发现的泛型问题。目前Go 1.19开发版本中大约有10多个泛型问题待解决。之前谈到的可能放开一些泛型约束,在Go 1.19估计不会如期兑现了。
在Go 1.19中,一个新的runtime.SetMemoryLimit函数以及一个GOMEMLIMIT环境变量被引入。有了这个memory软限制,Go运行时将通过限制堆的大小,以及更积极地将内存返回给底层os,来试图维持这个内存限制,以尽量避免Go分配heap过多,超出系统内存资源限制而被killed。
默认memory limit是math.MaxInt64。一旦通过SetMemoryLimit自行设定limit,那么Go运行时将尊重这个memory limit,通过调整GC回收频率以及及时将内存返还给os来保证go运行时掌控的内存总size在limit之下。
注意:limit限制的是go runtime掌控的内存总量,对于开发者自行从os申请的内存(比如通过mmap)则不予考虑。limit的具体措施细节可以参考该proposal design文档。
另外要注意的是:该limit不能100%消除out-of-memory的情况。
经调查,一些系统对打开的文件数量设置了一个人为的soft限制, 主要是为了与使用select和其硬编码的最大文件描述符(由 fd_set 的大小限制)的代码兼容。通常限制为1024,有的更小,比如256。这样即便是gofmt这样的简单程序,当它们并行地遍历一个文件树时,也很容易遇到打开文件描述符超量的错误。
Go不使用select,所以它不应该受这些限制的影响。于是Go将在1.19中默认提高这些限制值。
新版的race detector的性能将提升2-10倍。
在Go 1.19中,net软件包将使用EDNS来增加DNS数据包的大小,以遵守现代DNS标准和实现。这应该有助于解决一些DNS服务器的问题。
Go 1.19将增加"unix"构建标签:
//go:build unix
等价于
//go:build aix || linux || darwin || dragonfly || freebsd || openbsd || netbsd || solaris
不过要注意,"*_unix.go"还保留原语义,不能被识别,以便向后兼容现有文件,尤其是go标准库之外的使用。
Go flag包增加TextVar函数,这样flag包便可以与任何实现了encoding.Text{Marshaler,Unmarshaler}的Go类型集成。比如:
flag.TextVar(&ipaddr, "ipaddr", net.IPv4(192, 168, 0, 1), "what server to connect to?") // 与net.IPv4类型 flag.TextVar(&start, "start", time.Now(), "when should we start processing?") // 与time.Time类型
讲师主页:tonybai_cn
讲师博客: Tony Bai
专栏:《改善Go语言编程质量的50个有效实践》
实战课:《Kubernetes实战:高可用集群搭建,配置,运维与应用》
免费课:《Kubernetes基础:开启云原生之门》