【GO】wasm作成で使うsyscall/jsの型変換


GoでWebAssemblyを作るときに必要になるsyscall/jsパッケージの型変換メモ。

使うのはGo1.12です。

Go1.11から破壊的な変更があるため注意。

wasm化の基本部分

まずベースとなるソース。

wasmコンパイルは以下のように行います。

実行のHTMLは %GOROOT%/misc/wasm/wasm_exec.html をコピーして書き換えます。

一部環境でOut of Memoryになる問題がありますが対策をこちらで書きました。

syscall/js型変換 : js => go

javascriptからgo-wasmの関数を呼び出すと引数がjs.Value配列に格納されます。

reflectパッケージを使って型がどうなっているか見てみます。

またfmt.Println()の内容はブラウザのコンソールに表示されます。

引数”15″を渡した場合の変換はString()で行います。

ここで違う型(Int)にしようとするとエラーで停止するので注意。

 

こんな感じでGOの関数を呼び出すことができます。

 

配列を渡すのは少し面倒です。

 

マップ(オブジェクト)を渡すには多分JSの関数を呼ばないと無理そう。

js.Global().Get("Object").Call("keys",vs[0]).Call("forEach",js.FuncOf(...)) のような感じで試行錯誤してみましたが今のところ出来てないです。

syscall/js型変換 : go => js

こちらはgoの型のままreturnするだけでいいです。

返値がinterface{}なので何でも行けそうですが、javascriptの型に合わないものはエラーになります。

引数でうまくいかなかったmapも簡単に返せます。

TypedArrayが返せるためバイナリデータを作って返すことも可能です。

返せる型は以下のものです。

Uint8Arrayでバイト列が返せますね。

 

色々と試行錯誤でやっていますが、この内容は今後のアップデートで変更される可能性も高いのでコピペじゃなく理屈で覚えていきたいです。


コメントを残す

メールアドレスが公開されることはありません。