8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go1.13で導入されたsyscall/jsのjs.CopyBytesToGoとjs.CopyBytesToJSを試してみた

Posted at

Go 1.13がリリースされたので、syscall/js に新しく追加されたjs.CopyBytesToGojs.CopyBytesToJSSを試してみました。

js.CopyBytesToGoはUint8arrayをGoのバイトスライスにコピーします。js.CopyBytesToJSSはGoのバイトスライスをUint8Arrayにコピーします。

元々は、TypedArrayOf() を使っていたのが、1.13で、CopyBytesToGoCopyBytesToJSに置き換わっています。

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に置いておきました。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?