登录
首页 >  Golang >  Go问答

在JavaScript函数调用的“go”函数中无法返回数组:恐慌中的无效值“valueOf”

来源:stackoverflow

时间:2024-03-01 08:09:23 245浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《在JavaScript函数调用的“go”函数中无法返回数组:恐慌中的无效值“valueOf”》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

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

解决方案


使用 []接口{}

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在JavaScript函数调用的“go”函数中无法返回数组:恐慌中的无效值“valueOf”》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>