在无法访问类型的情况下获取接口{}的值
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]
如何获得 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]