GoのWebAssemblyがこんなに簡単なわけがない

以前後輩と話ていてWeb Assemblyに興味を持ちました.
JavaScriptより自分の好きな言語でフロントエンドを書けたらいいなと思い調べてみることにしました.
そんな中,こちらの記事(サクッと Go → WebAssembly を試す)を見つけたのでやってみました.

まず,Macでgoのバージョンをあげます.

1
2
3
brew upgrade go
go version
> go version go1.13 darwin/amd64

goでWebアセンブリにコンパイルするコードを書いた.

1
2
3
4
5
6
package main
import "fmt"

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

コンパイルしました.

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

そして,htmlとJavascriptを用意します.

ただし記事を参考して用意すると,以下のように実行時にエラーを引き起こしました.

1
> wasm_exec.html:36 LinkError: WebAssembly.instantiate(): Import #3 module="go" function="runtime.nanotime" error: function import requires a callable

調べてみるとこちらのIssue(can’t run wasm module in browser: LinkError: WebAssembly Instantiation #29827)を発見しました.
masterブランチにあるwasm_exec.jsを取ってくると起こる現象なので,自分のgolangのバージョンのものを取ってくるといいらしい.
なので,以下のようにして用意しました.

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

go getでgoexecを取ってきて,goexecでサーバーをたてます.

1
2
go get -u github.com/shurcooL/goexec
goexec 'http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))'

以下のリンクにアクセスして,コンソールを広げつつRUNボタンをおすと.
http://localhost:8080/wasm_exec.html

Hello, wasm!

と表示されれば成功です.

所感としては,CやC++に比べるとGoをWeb Assemblyで扱うのはめちゃめちゃ簡単.
ただ一方で近年人気急上昇中のRustの方がWasmは盛り上がってきているように見えるので,Rustも試してみてみたい.

さて続きは次回にするのですが,Go WebAssemblyで調べてみると,以下の記事が参考になりそうです.
色々試してみたいと思っています.

ちなみに,こちらのトップページの絵は創作したものです.
グリザイア手法という描き方を知り,試しに描いてみました.
Gopherちゃんと言います.
ロゴタイトルはこちらを使わせてもらいました.

Author: Gusugusu
Link: https://gusugusu1018.github.io/2019/09/17/GoのWebAssemblyがこんなに簡単なわけがない/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment
Catalog