学习 Golang + WebAssembly

什么是 WebAssemly

推荐阅读:

Golang 实践

确定安装了最新的 golang 1.11 版本

$ go version
go version go1.11 linux/amd64

编译基础的 Go 程序

package main

func main() {
    println("Hello, WebAssembly!")
}

编译命令

$ GOARCH=wasm GOOS=js go build -o test.wasm main.go

把需要的其他文件复制到当前目录

$ cp $(go env GOROOT)/misc/wasm/wasm_exec.{html,js} .

当前目录下会存在 3 个文件,分别是:wasm_exec.html, wasm_exec.js, test.wasm

运行基础的 HTTP 服务

package main

import (
    "flag"
    "log"
    "net/http"
)

var (
    listen = flag.String("listen", ":8080", "listen address")
    dir    = flag.String("dir", ".", "directory to serve")
)

func main() {
    flag.Parse()
    log.Printf("listening on %q...", *listen)
    log.Fatal(http.ListenAndServe(*listen, http.FileServer(http.Dir(*dir))))
}

用浏览器打开 http://127.0.0.1:8080/wasm_exec.html 点击 Run 之后则可以在 Javascript 的 console 中看到输出

运行更复杂的 Go 程序

把一开始基本的 Go 程序更换为复杂斐波纳契,其中包括了 Go 的闭包。

package main

import "fmt"

func fibonacci() func() int {
    a, b := -1, 1
    return func() int {
        a, b = b, a+b
        return b
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

重新编译 main.go ,然后刷新浏览器,点击 Run 观察输出结果,符合预期。

Go + wasm 有点意思

参考链接