Open5

GoでWebAssembly

yomekyomek
yomekyomek

wasm用にコンパイルする

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

ブラウザでGoのwasmファイルを実行するのに必要なJSファイルwasm_exec.jsをコピー

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

Goが生成するwasmファイルはかなり大きくなるが、TinyGoを使うとかなり小さくできる

TinyGo is a Go compiler intended for use in small places such as microcontrollers, WebAssembly (wasm/wasi), and command-line tools.

main.go
package main

func main() {
	println("Hello, World!")
}

buildする。かなり違う。

$ GOOS=js GOARCH=wasm go build -o main.wasm main.go
$ tinygo build -o wasm.wasm -target wasm main.go  
$ ls -lh
~
 1.3M 10 27 07:48 main.wasm.   (Go)
 83K 10 27 07:48 wasm.wasm.   (TinyGo)
yomekyomek

Goのsyscall/jsパッケージについて
https://pkg.go.dev/syscall/js@go1.21.3

func ValueOf

サポートされている型と、その変換

Go JavaScript
js.Value [its value]
js.Func function
nil null
bool boolean
integers and floats number
string string
[]interface{} new array
map[string]interface{} new object

ブラウザ上でValueOf: invalid valueのエラーが出る場合は、型の変換が上手くいってないのでここを参照
記事によってはここの情報が古くなっている場合がよくある。