Go で WebAssembly 作るときに JavaScript の requestAnimationFrame を使う方法をメモしておきます。

wasm を呼び出す JavaScript 側は通常どおり。

const go = new Go();
WebAssembly.instantiateStreaming(fetch("./main.wasm"), go.importObject).then((result) => {
  go.run(result.instance);
});

Go では チャネルと無名関数を使います。

package main

import (
	"syscall/js"
)

func main() {
	c := make(chan struct{})
	var jsCall js.Func

	jsCall = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		// do something...
		js.Global().Call("requestAnimationFrame", jsCall)
		return nil
	})
	defer jsCall.Release()

	js.Global().Call("requestAnimationFrame", jsCall)
	<-c
}

これだけでできます。簡単ですね。