Go 1.13がリリースされたので、syscall/js
に新しく追加されたjs.CopyBytesToGo
とjs.CopyBytesToJSS
を試してみました。
js.CopyBytesToGo
はUint8arrayをGoのバイトスライスにコピーします。js.CopyBytesToJSS
はGoのバイトスライスをUint8Arrayにコピーします。
元々は、TypedArrayOf()
を使っていたのが、1.13で、CopyBytesToGo
とCopyBytesToJS
に置き換わっています。
js.CopyBytesToGo
Go側の使用例
Javascriptのuint8arrayをGoのバイトスライスに変換する例です。js.CopyBytesToGo
は、第一引数がGoのバイトスライス、第二引数がJavascriptのUint8arrayです。
func PassUint8ArrayToGo(this js.Value, args []js.Value) interface{} {
received := make([]byte, args[0].Get("length").Int())
_ = js.CopyBytesToGo(received, args[0])
fmt.Println(received)
return nil
}
func registerCallbacks() {
js.Global().Set("PassUint8ArrayToGo", js.FuncOf(PassUint8ArrayToGo))
}
func main() {
c := make(chan struct{}, 0)
registerCallbacks()
<-c
}
javascript側の使用例
javascript側からは以下のようにGoの関数を呼び出します。
function passUint8ArrayToGo(){
array_to_pass = new Uint8Array([0, 9, 21, 32])
console.log(array_to_pass)
PassUint8ArrayToGo(array_to_pass)
}
出力は以下のようになります。
Uint8Array(4) [0, 9, 21, 32] # console.log()での出力
[0 9 21 32] # fmt.Println()での出力
js.CopyBytesToJS
Go側の使用例
js.CopyBytesToJSは、第一引数がUint8Array、第二引数がバイトスライスです。注意点は、srcの長さとdstの長さの短いほうの要素だけがコピーされる点です。なので、javascriptから渡したUint8Array
生成時に長さをちゃんと設定しておく必要があります。
func SetUint8ArrayInGo(this js.Value, args []js.Value) interface{} {
_ = js.CopyBytesToJS(args[0], []byte{0, 9, 21, 32})
return nil
}
func registerCallbacks() {
js.Global().Set("SetUint8ArrayInGo", js.FuncOf(SetUint8ArrayInGo))
}
func main() {
c := make(chan struct{}, 0)
registerCallbacks()
<-c
}
javascript側の使用例
javascript側からは以下のようにGoの関数を呼び出します。Uint8Arrayを生成したときに長さを与えていない例と与えている例を書いています。
function setUint8ArrayInGo(){
array_to_set = new Uint8Array()
SetUint8ArrayInGo(array_to_set)
console.log(array_to_set)
array_to_set = new Uint8Array(4)
SetUint8ArrayInGo(array_to_set)
console.log(array_to_set)
}
出力は以下のようになります。
Uint8Array []
Uint8Array(4) [0, 9, 21, 32]
ソース
githubに置いておきました。