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

时间:2018-09-24 12:44:34

标签: go

我的输入是interface{},我知道它可以是任何类型的数组。

我想阅读输入中的元素之一,因此我尝试将interface{}转换为[]interface{},但是go会给我以下错误:

  

panic:接口转换:interface {}是[] map [string] int,而不是[] interface {}

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

Playground test

谢谢

4 个答案:

答案 0 :(得分:1)

我现在实际上正在处理这个问题,因为我的问题涉及从 json 对象 (map[string]interface{}) 中获取某些内容,该对象可能包含也可能不包含特定键 ({"someKey": [a, b , c, ...]) 并且如果它确实包含该键,那么我们想要获取它(必然是 interface{} 类型)并将其转换为 []interface{}。到目前为止我发现的方法是使用 json marshall/unmarshall。这对我来说似乎有点hacky,如果我找到更优雅的解决方案会更新。到那时,您可以使用我的方法: https://play.golang.org/p/4VAwQQE4O0b

FutureBuilder<bool>(
    future: myFuture,
    builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
         if (snapshot.data) {
            // Your stuff if you're logged
         } else {
               return CircularProgressIndicator(),
         }
   }
)

答案 1 :(得分:1)

涉及 reflect package 的解决方案。

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]

答案 2 :(得分:0)

接口的要点是定义要使用的行为,如果使用空接口,则对该片中的类型一无所知。

如果要打印它,则可以不经转换而使用println或printf。

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

如果要访问它,并使用可以定义功能的常用行为/数据,请定义一个接口,例如:

type Doer interface {
 Do() error
}
parentStruct := []Doer{...}
testStruct.Do()

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

答案 3 :(得分:-1)

我认为您正在寻找的是类型断言

package main

import (
    "fmt"
)

func main() {

    parentStruct := map[string]interface{}{
         "test": []map[string]int{
          {"a": 1, "b": 2},
          {"c": 3},
        },
   }

   testStruct := parentStruct["test"].([]map[string]int)

   fmt.Println(testStruct)
}

阅读此链接:https://golang.org/ref/spec#Type_assertions

https://play.golang.org/p/81uL2hgrN3l