golangでwasmの hello world

ここ「golang WebAssembly」を参考にやっていきます。

環境をDockerで

そのまま、Go オフィシャルイメージ でもOK。参考サイトがgoexec使っていたので、ついでに入れておく

DockerFile

from golang:1.12rc1-alpine3.9
RUN apk add git
RUN go get -u github.com/shurcooL/goexec

ビルド

適当なタグ名つけてビルド

docker build -t eg-golang .

コンテナ起動

docker run --rm -it -p 8080:8080 -v "$PWD":/usr/src/myapp -w /usr/src/myapp eg-golang ash

実装

今回は、main.go と index.htmlの2ファイル 。dockerの中の /usr/src/myappフォルダに作る。

main.go

package main

import "fmt"

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

index.html

<html>
<head>
    <meta charset="utf-8">
    <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>
	</head>
	<body></body>
</html>

wasm_exec.jsをコピー

wasm_exec.jsが必要なので、GOROOTから同じディレクトリにCopyする。

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

ビルド

main.go を main.wasmにビルドする

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

動作確認

goexec 'http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))'

これで、ブラウザからアクセスして、コンソールに Hello が出ればOK