Go1.11 已经正式发布, 最大的一个亮点是增加了对 webAssembly 的实验性支持. 这也再一次验证了 Ending 定律的预言: 所有可以编译到 WebAssembly 平台的软件终将会被编译到 WebAssembly 平台.
在上一周, qemu 的作者 bellard 大神将 Windows 2000 搬到浏览器到新闻彻底引爆了 WebAssembly 技术, 这也证明了 WebAssembly 的强大的性能优势.
感兴趣的同学可以查看 bellard 大神到网站, 网站提供了在浏览器 Linux 和 Windows 等多种系统等运行链接: https://bellard.org/jslinux/
不过本文我们将重点和大家分享如何在 Go 语言中使用 WebAssembly. 先安装好 Go1.11 + 版本的 Go 语言环境. 然后创建 hello.go 文件:
- package main
- import "fmt"
- func main() {
- fmt.Println( "你好, WebAssembly!" )
- }
为了不了解 Go 语言的同学便于理解, 让我们简单介绍一下程序. 第一句表示当前的包名字为 main, 同时包中有一个 main 函数, 而 main 包的 main 函数就是 Go 语言程序的入口. 在 main 函数中通过导入的 fmt 包内的 Println 方法输出了一个字符串. 然后在命令行中直接输入 go run hello.go 来运行程序. 如果一切正常的话. 应该可以在命令行看到输出 "你好, WebAssembly!" 的结果.
Go1.11 开始支持 WebAssembly, 对应的操作系统名为 js, 对应的 CPU 类型为 wasm. 目前还无法通过 go run 的方式直接运行输出的 wasm 文件, 因此我们需要通过 go build 的方式生成 wasm 目标文件, 然后通过 Node 环境执行. 需要注意的是更新的 Node 版本对 wasm 的支持会更好, 作者推进使用 v10 以上的版本.
通过以下命令将 hello.go 编译为 a.out.wasm:
$ GOARCH=wasm GOOS=js go build -o a.out.wasm hello.go
生成的 a.out.wasm 文件体积可能超过 2MB 大小. 而且生成等 a.out.wasm 还无法直接运行, 需要初始化 Go 语言必须的运行时环境.
对运行时初始化是一个相对复杂的工作, 因此 Go 语言提供了一个 $(GOROOT)/misc/wasm/wasm_exec.js 文件用于初始化和运行的工作. 同时提供了一个基于 node 包装的 $(GOROOT)/misc/wasm/go_js_wasm_exec 脚本文件, 用于执行 Go 语言生成的 wasm 文件.
参考 go_js_wasm_exec 脚本的实现, 我们可以直接使用 wasm_exec.js 来运行 wasm 模块. 我们可以先将 wasm_exec.js 文件复制到当前目录, 然后通过以下命令运行 wasm 模块:
$ node wasm_exec.js a.out.wasm
你好, WebAssembly
现在终于可以正常运行 Go 语言生成 wasm 程序了. 因此以后可以使用 Go 语言来开发 Web 应用了.
来源: http://www.tuicool.com/articles/jEviAnV