(原) Go与WebAssembly之一

原创文章,请后转载,并注明出处。

注:不是所有内容均原创,而是网文加上自己的学习和理解。

WebAssembly:简称wasm,加强JavaScript,下载后运行于本地设备上,不象JavaScript那样原代码解释运行,而是编译为二进制机器码。据说它是一种小体积(暂时看起来Go编译后的还不够小),高加载速度的二进制编码格式。

webassembly.org 将其定义为“基于堆栈的虚拟机的二进制指令格式”。从本质上讲,wasm是一种二进制格式; 就像ELF,Mach和PE一样。唯一的区别是它适用于虚拟编译目标,而不是实际的物理机器。

还是看网上专业点的解释:

WebAssembly完全入门——了解wasm的前世今身

几张图让你看懂WebAssembly

我感觉就是利用它的跨平台性,高速,本地化运行,可以将更多需要本地资源的应用搞起来。

从多方面的信息来说,它似乎将成为一个趋势。学习也就成为必须。

go关于WebAssembly: https://github.com/golang/go/wiki/WebAssembly

syscall/js: https://tip.golang.org/pkg/syscall/js/

这两个资源需要认真学习一下。


Hello wasm World

  1. 首先直接复制一个Go和JS的“桥接器”,它本存在于Go中

cp “$(go env GOROOT)/misc/wasm/wasm_exec.js” .

JS代码有点多,我并没有细看。希望有地方可以看它对它的拆解。

  1. 在html中引入
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Go + WebAssembly</title>
    <script src="wasm_exec.js"></script>
</head>
<body>
    <canvas id='canvas'></canvas>
</body>

<script>

// 加载 wasm
const go = new Go();
WebAssembly.instantiateStreaming(fetch("lib.wasm"), go.importObject)
    .then((result) => {
        go.run(result.instance);
    });

</script>
</html>

这也就是加载了此js,并添加了一个画板,引用将添加的lib.wasm文件。lib.wasm就是靠go代码编译的。

  1. Go文件
package main

func main() {
      println("wasm app works")
}

代码很简单,然后编译:GOARCH=wasm GOOS=js go build -o lib.wasm main.go

操作系统为js,机器为wasm,输出为lib.wasm文件。其实我们平时使用GOOS=linux GOARCH=arm等。

  1. 访问

通过浏览器访问,我们将在调试控制台看到打印输出 wasm app works

为了访问html文件,我们一般建立一个web服务

package main

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

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.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
        if strings.HasSuffix(req.URL.Path, ".wasm") {
            resp.Header().Set("content-type", "application/wasm")
        }

        http.FileServer(http.Dir(*dir)).ServeHTTP(resp, req)
    })))
}

对于wasm文件,有指定的文件类型。

相关文章