在无法访问类型的情况下获取接口{}的值

Get value of interface{ } without having access to type

如何获得 x 的值作为 []interface{}

func main() {

    var x interface{} = SomeFunc()
    
    fmt.Println(x) // this prints [1 2].

    val := x.([]interface{}) // this will not work because '[]interface{}' is different type than 'a'

}

func SomeFunc() interface{} {
    // some type I dont have access to
    type a []interface{}

    var someArray a = make([]interface{}, 0)
    someArray = append(someArray, 1)
    someArray = append(someArray, 2)
    return someArray
}

Type asserting a concrete type works only for the exact (identical) 存储在接口值中的具体类型,你不能键入断言“相似”类型(例如具有相同底层类型的类型)。

在您的情况下,您想要的是获得一个可转换为已知类型的值(例如,类型 a 的值可转换为类型 []interface{} 的值)。如上所述,类型断言是不可能的。

最简单的方法是导入包含具体类型定义的包(并声明该类型的值)。如果它未导出或不可访问,您唯一的选择是使用反射。您可以使用 Value.Convert() to convert a value to a value of another type, a value of a type you can type assert. To check if the value is actually convertible, you may use Value.CanConvert().

y := reflect.ValueOf(x).Convert(reflect.TypeOf([]interface{}{})).Interface()

val := y.([]interface{})
fmt.Printf("%T %v\n", val, val)

这将输出(在 Go Playground 上尝试):

[1 2]
[]interface {} [1 2]