为了账号安全,请及时绑定邮箱和手机立即绑定

如何将接口转换为接口切片?

如何将接口转换为接口切片?

Go
慕桂英4014372 2023-04-10 10:36:49
我的输入是一个interface{},我知道它可以是任何类型的数组。我想读取我输入的一个元素,所以我尝试将 my 转换interface{}为[]interface{},但是 go 会给我以下错误:恐慌:接口转换:interface {} 是 []map[string]int,而不是 []interface {}我该如何进行转换?(如果可能,不反映)。游乐场测试谢谢
查看完整描述

6 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

reflect 涉及包的解决方案。

package main


import (

    "fmt"

    "reflect"

)


func main() {

    var v interface{} = []string{"a", "b", "c"}


    var out []interface{}

    rv := reflect.ValueOf(v)

    if rv.Kind() == reflect.Slice {

        for i := 0; i < rv.Len(); i++ {

            out = append(out, rv.Index(i).Interface())

        }

    }

    fmt.Println(out)

}

// Output:

// [a b c]


查看完整回答
反对 回复 2023-04-10
?
Qyouu

TA贡献1786条经验 获得超11个赞

我现在实际上正在处理这个问题,因为我的问题涉及从 json 对象 (map[string]interface{}) 中获取一些东西,它可能包含也可能不包含特定的键 ({"someKey": [a, b, c, ...]),如果它确实包含那个键,那么我们想要获取那个(它必然是 interface{} 类型)并将其转换为 []interface{}。到目前为止我找到的方法是使用 json marshall/unmarshall。

查看完整回答
反对 回复 2023-04-10
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

type a map[string]interface{}

type b []string


func main() {

    obj := a{

        "someKey": b{"a", "b", "c"},

    }

    if obj["someKey"] != nil { // check the value exists

        var someArr []interface{}


        //marshal interface to byte and then unmarshal to []interface{}

        somebytes, _ := json.Marshal(obj["someKey"])

        err := json.Unmarshal(somebytes, &someArr)

        if err != nil {

            fmt.Println("Error in unmarshal")

        }

        fmt.Println(someArr)

    }

}


查看完整回答
反对 回复 2023-04-10
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

我该如何进行转换?(如果可能,不反映)。


请考虑类型开关。


反射是昂贵的。


func toSlice(i interface{}) []interface{} {

    var out []interface{}


    switch v := i.(type) {

    case []interface{}:

        for x := 0; x < len(v); x++ {

            out = append(out, v[x])

        }

    default:

        fmt.Printf("invalid type: %T\n", v)

    }


    return out

}


查看完整回答
反对 回复 2023-04-10
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

接口的重点是定义你想要使用的行为,如果你使用一个空接口,你对那个切片中的类型一无所知。


如果你想打印它,你可以使用 println 或 printf 没有转换。


如果你想访问它,并且必须允许任何类型,你可以使用反射(使用起来缓慢且复杂)。


如果您想访问它,并使用可以为其定义函数的常见行为/数据,请定义一个接口,例如:


type Doer interface {

 Do() error

}

parentStruct := []Doer{...}

testStruct.Do()

如果这些都不起作用,请等待 Go 2 和泛型。


查看完整回答
反对 回复 2023-04-10
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

对于任何在 2022 年发现这一点的人,现在我们有了仿制药,您可以这样做:


func convertSlice[T any](data []T) []interface{} {

    output := make([]interface{}, len(data))

    for idx, item := range data {

        output[idx] = item

    }

    return output

}


查看完整回答
反对 回复 2023-04-10
  • 6 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信