有一个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
}
答案 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]