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

时间:2019-04-05 13:23:41

标签: 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
...

但是当我给它一个[]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
}

1 个答案:

答案 0 :(得分:0)

使用[]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]