Невозможно вернуть массив в функции go, который вызывается функцией js. panic: ValueOf: недопустимое значение - PullRequest
1 голос
/ 05 апреля 2019

Существует 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 голосов
/ 05 апреля 2019

Использование []interface{}

[]int отличается от []interface{}.Если []interface{} вам подходит, создайте и верните это:

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

Например, если вы вернете этот фрагмент:

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

Запуск PanicStation() в консоли JavaScript будет выводить:

> 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 можно вернуть значение, которое будет типизированным массивом.Для этого используйте js.TypedArray в Go (получено как 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})
}

На этот раз вызов PanicStation() из JavaScript, вывод будет:

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