Go 1.11发布,可将代码编译为WebAssembly

Go 1.11开始了取代Javascript的第一步,现在支持Go程序代码编译成WebAssembly,另外,还引入了模块概念,作为版本控制以及套件发布的GOPATH替代方案。

在今年4月,Go官方就预告即将支持编译成WebAssembly,要取代Javascript的野心,而这个功能在近期发布的最新版本中实现了,虽然1.11是个小更新,但除了WebAssembly的支持外,也加入了模块概念,另外还更新了工具链、Runtime和函数库。

Go 1.11发布,可将代码编译为WebAssembly

Go 1.11新加入了模块的概念,这是整合了版本控制以及套件发布的GOPATH替代方案。使用模块,开发者不再受限于GOPATH中工作,更加轻量,程序建立也将更可靠,并且具可重复性。目前模块支持仍在实验阶段,存在一些已知的问题正待解决,也会根据使用者的反馈进行改进,因此细节可能发生变化,虽然如此,但官方承诺,在Go 1.11转换使用模块的项目,将能在Go 1.12或更高版本中继续运行。

因为Go模块的支持,在命令列中@符号被指派了特殊意义,因此Go命令现在不允许使用包含@符号的导入路径,由于Go Get本来就无法使用这样的导入路径,所以这样的限制只会影响由其他方法建立定制化GOPATH树的项目。

在WebAssembly编译功能方面,现在Go 1.11增加了一个WebAssembly实验性接口,Go现在可以编译成一个WebAssembly模块,该模块包含goroutine调度、垃圾回收与Maps等功能的Go Runtime,整体大小约在2MB左右,压缩后可下降到500KB。Go现在可使用新的实验性syscall/js套件呼叫JavaScript。由于新增了GOOS值js以及GOARCH值wasm,除了那些正在被使用GOOS/GOARCH值外,Go工具现在会忽略名为*_js.go或*_wasm.go的Go文档。使用者需要重新命名不符合规则的文件名称。

Go 1.11的编译器现在会为最佳化的二进制档案提供更为精准的除错信息,包含变量位置信息、行数以及断点位置,这将能在不使用-N -l的情况下,为编译的二进制排错,不过这些排错信息仍有其限制,有些是根本上的限制,官方提到,将会在未来继续修正排错功能。

Runtime更新的部分,现在使用Sparse Heap Layout,因此堆积将解除之前512 GB的大小限制,而这也解决了Go/C二进制或以-race编译的二进制,在少数情况会出现的位置空间冲突错误。官方提到,更新到Go 1.11,绝大多数的应用程序效能都会提升,但是很难直接说是哪一个改进造成的,因为Go新版本在程序代码生成以及核心函数库的最佳化,都是性能提升的推手。

而官方在Go 1.10发布时,就曾通告支持的操作系统版本将提升,因此Go 1.11现在需要OpenBSD 6.2或更高版本,macOS 10.10 Yosemite或更高版本,以及Windows 7或更高版本,对较旧版本的操作系统将不再支持。

相关推荐