如何获取 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 具体类型仅适用于存储在接口(interface)值中的精确( identical )具体类型,您不能键入断言“相似”类型(例如具有相同基础类型的类型)。 p>
在您的情况下,您想要的是获取可转换为已知类型的值(例如,a
类型的值可转换为 []interface{} 类型的值
)。如上所述,这对于类型断言是不可能的。
最简单的方法是导入包含具体类型定义的包(并类型断言该类型的值)。如果它未导出或不可访问,您唯一的选择是使用反射。您可以使用Value.Convert()
将值转换为另一种类型的值,您可以键入断言的类型的值。要检查该值是否实际上可转换,您可以使用 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]
关于go - 获取 interface{ } 的值,而无需访问类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71900027/