🐁

GoでWebAssembly

2021/06/24に公開

Goで簡単にwasmのコンパイルができるとのことで、とりあえずやってみます。

Hello World

Goで文字列を出力するだけのコードを書きます。

// main.go

package main

import "fmt"

func main() {
  fmt.Println("Hello, WebAssembly!")
}

wasmファイルのビルド。

# Windowsの場合
$ GOOS=windows GOARCH=386

# MacOSの場合
$ GOOS=linux GOARCH=amd64

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

GOROOTからwasm_exec.jsをコピーしてきて、

$ cp `go env GOROOT`/misc/wasm/wasm_exec.js .

wasmファイルを読み込むindex.htmlを用意。

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <script src="wasm_exec.js"></script>
  <script>
    const go = new Go();
    WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
      go.run(result.instance);
    });
  </script>
</body>
</html>

httpサーバーを立てるコードを書いて、

// server.go

package main

import (
	"log"
	"net/http"
)

func main() {
	const addr = "localhost:8080"
	log.Fatal(http.ListenAndServe(addr, http.FileServer(http.Dir("."))))
}

実行。

$ go run server.go

localhost:8080を開いて、コンソール画面に文字列が出力されれば成功です。
簡単!

Discussion