【问题标题】:Cannot return an array in go function that is invoked by js function. panic: ValueOf: invalid value无法在 js 函数调用的 go 函数中返回数组。恐慌:ValueOf:无效值
【发布时间】:2019-08-27 10:02:55
【问题描述】:

有一个gocode,编译成wasm文件。我希望其中一个函数返回一个数组,但是当我这样做时,我看到了 panic: ValueOf: invalid value 错误。 js.ValueOf 函数似乎可以处理数组:

...
case []interface{}:
    a := arrayConstructor.New(len(x))
    for i, s := range x {
        a.SetIndex(i, s)
    }
    return a
...

但当我给它一个 []int 值时仍然会感到恐慌。

package main

import (
    "fmt"
    "syscall/js"
)

var signal = make(chan int)

func keepAlive() {
    for {
        <-signal
    }
}

func main() {
    js.Global().Set("PanicStation", js.FuncOf(PanicStation))
    keepAlive()
}

func PanicStation(this js.Value, args []js.Value) interface{} {
    arr := make([]int, 1)
    return arr
}

【问题讨论】:

    标签: arrays go slice webassembly


    【解决方案1】:

    使用[]interface{}

    []int[]interface{} 不同。如果[]interface{} 适合您,请创建并返回:

    arr := make([]interface{}, 1)
    

    例如,如果你返回这个切片:

    func PanicStation(this js.Value, args []js.Value) interface{} {
        return []interface{}{1, "two"}
    }
    

    在 JavaScript 控制台中运行 PanicStation() 会输出:

    > PanicStation()
    > (2) [1, "two"]
    

    返回一个类型化数组

    js.ValueOf() 的文档详细说明了支持哪些类型以及如何转换它们:

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

    请注意,可以返回一个值,该值将是 JavaScript 中的类型化数组。为此,请在 Go 中使用 js.TypedArray(由 js.TypedArrayOf() 获得)。支持的类型有:

    支持的类型有 []int8、[]int16、[]int32、[]uint8、[]uint16、[]uint32、[]float32 和 []float64。传递不受支持的值会导致恐慌。

    下面是一个例子:

    func PanicStation(this js.Value, args []js.Value) interface{} {
        return js.TypedArrayOf([]int32{1, 2})
    }
    

    这次从 JavaScript 调用 PanicStation(),输出将是:

    > PanicStation()
    > Int32Array(2) [1, 2]
    

    【讨论】:

    • 太好了,谢谢。我最初尝试返回二维数组,所以 js.TypedArrayOf() 并没有真正的帮助。
    猜你喜欢
    • 2016-01-15
    • 2018-05-23
    • 1970-01-01
    • 2021-09-15
    • 2018-02-20
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多