最新的Go语言release版本带来了全面的改进,包括对runtime的改善和对WebAssembly的支持。

 

Go 1.14是Google开发的用于创建 Docker,Kubernetes,Istio和其他云原生计算项目的开源编程语言的最新版本,现已作为release版本提供。

2月25日发布的Go升级改进了运行时和编译器。根据发行说明,1.14版还将是最后一个支持32位Apple平台的版本。

与Go运行时的改进相比,defer大多数用例的性能得到了提高,几乎不产生任何开销。因此,defer现在可以在对性能至关重要的代码中使用,而无需担心开销。

改进的Go运行时也使goroutines异步抢占。这意味着没有函数调用的循环不再可能使调度程序死锁或明显延迟垃圾回收。此功能支持除了Windows/arm,darwin/arm,js/wasm,和plan9/*之外的所有平台。

抢占式实现的结果之一是Linux和MacOS上的Go 1.14程序将比早期版本接收更多的信号。使用诸如syscall或golang.org/x/sys/unix软件包的程序失败时将看到较慢的系统调用,并显示EINTR错误。这些程序将必须以某种方式处理这些错误,最有可能的方法是循环尝试再次调用系统。

此外,页面分配器更有效,并且在的高值时导致较少的锁争用GOMAXPROCS。较低的延迟和较高的吞吐量对于并行且高速率完成的大型分配而言,这将是最显着的。

同时,Go编译器添加了一个-d=checkptr编译时选项,用于检查Go代码是否动态遵守unsafe.Pointer安全规则。而且,编译器现在可以使用该-json标志发出机器可读的关键优化日志,包括内联和消除边界检查。现在,详细的逃逸分析诊断程序将再次起作用,并且为编译器插入的模糊测试提供了实验支持。

Go 1.14中的其他更改和改进

为了改进Go对WebAssembly的支持,js.Value现在可以对通过对象从Go引用的Javascript值进行垃圾收集。但是,js.Value无法再使用==运算符比较对象。而是必须使用Equal方法比较它们。另外,js.Value现在有IsUndefined,IsNull和IsNaN方法。

与Rust语言类似,Go 1.14版本将是最后一个在MacOS上支持32位二进制文​​件的版本。它还可能是最后一个在其他Apple平台(包括iOS,iPadOS,WatchOS和tvOS)上支持32位二进制文​​件的软件。

在语言更改中,现在允许嵌入重叠的接口。

不再支持Google Native Client平台

现在支持FreeBSD的64位体系结构。

go命令现在在module模式下支持Subversion仓库。现在,该命令还包含来自模块代理和其他HTTP服务器的纯文本错误消息的摘要。仅当它是有效的UTF-8且仅包含图形字符和空格时,才会显示错误消息。

Windows上的二进制文件启用了数据执行保护(DEP)以进行系统级内存保护。

一个新的标志,-modfile=file指示go命令读取并写入一个替代的go.mod文件,而不是module根目录中的文件。

go get命令不再接受该-mod标志。

一个新的标志-modcacherw指示go命令以默认权限而不是只读的方式将新创建的目录保留在模块高速缓存中。此标志使测试或其他工具更有可能意外添加不在模块checksum校验中的文件。但是它允许使用rm -rf删除模块缓存。

hash/maphash包在字节序列上提供哈希函数。

GOINSECURE是一个新的环境变量,它指示go命令直接从某些模块的源中获取某些模块时允许HTTPS连接跳过证书验证。

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。