标签导航:

go wasm与javascript对象交互:遍历js.value

在使用go语言编写webassembly模块时,经常需要与javascript进行交互。本文将重点讨论如何在go的wasm模块中遍历javascript对象,并解决文中遇到的问题。

问题描述中,开发者尝试将javascript对象传递给go的wasm模块,但遇到了cannot range over obj (type js.value)的错误。这是因为js.value类型并非go语言中可以直接遍历的集合类型,它代表javascript中的一个值,需要使用go语言提供的syscall/js包中的方法进行访问。

代码中,obj变量的类型为js.value,直接使用for range循环尝试遍历是错误的。js.value代表javascript对象,需要通过get方法来获取对象的属性值。 正确的遍历方式应该利用js.value对象的length()方法(如果对象是数组)或者迭代其属性。由于问题描述中没有明确说明javascript对象的类型,这里提供两种方案:

方案一:如果javascript对象是数组

如果javascript对象是一个数组,可以使用length()方法获取数组长度,然后循环访问每个元素:

package main

import (
    "fmt"
    "syscall/js"
)

func main() {
    done := make(chan int, 0)
    js.Global().Set("hook", createHook())
    <-done
}

func createHook() js.Func {
    return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
        obj := args[0]
        if obj.Length() > 0 {
            for i := 0; i < obj.Length(); i++ {
                val := obj.Index(i)
                fmt.Println(val)
            }
        }
        return nil
    })
}

方案二:如果javascript对象是普通对象

如果javascript对象是普通对象,需要使用get方法获取对象的属性。 由于无法预知对象的属性名,需要先获取所有属性名,然后逐一访问: 这需要javascript端提供属性名的信息,或者在go端通过反射(这部分实现较为复杂,且效率可能较低)来获取属性名。 一个更简单的方法是在javascript端将对象转换为json字符串,然后在go端解析json字符串。

关于go语言能否传递struct或类似于js对象的结构到windows的问题,答案是可以的。 go语言的struct可以序列化为json或其他格式的数据,然后传递给windows程序。 这样可以避免在windows端使用过多的全局变量。 这需要设计好数据传输的协议和格式。