无法在 js 函数调用的 go 函数中返回数组。恐慌:ValueOf:无效值

Don*_*ton 5 arrays go slice webassembly

有一个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
...
Run Code Online (Sandbox Code Playgroud)

但当我给它一个值时仍然会恐慌[]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
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 6

使用[]interface{}

\n\n

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

\n\n
arr := make([]interface{}, 1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

例如,如果您返回此切片:

\n\n
func PanicStation(this js.Value, args []js.Value) interface{} {\n    return []interface{}{1, "two"}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

跑步PanicStation()在 JavaScript 控制台中

\n\n
> PanicStation()\n> (2)\xc2\xa0[1, "two"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回类型化数组

\n\n

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

\n\n
| Go                     | JavaScript             |\n| ---------------------- | ---------------------- |\n| js.Value               | [its value]            |\n| js.TypedArray          | typed array            |\n| js.Func                | function               |\n| nil                    | null                   |\n| bool                   | boolean                |\n| integers and floats    | number                 |\n| string                 | string                 |\n| []interface{}          | new array              |\n| map[string]interface{} | new object             |\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

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

\n
\n\n

这是如何执行此操作的示例:

\n\n
func PanicStation(this js.Value, args []js.Value) interface{} {\n    return js.TypedArrayOf([]int32{1, 2})\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
> PanicStation()\n> Int32Array(2)\xc2\xa0[1, 2]\n
Run Code Online (Sandbox Code Playgroud)\n