如何在golang中使用接口反射的类型断言?
How to use type assertion from interface reflection in golang?
我正在尝试在 golang 中使用类型断言。
直接断言是没有问题的。
a, ok := i.(MyStruct)
但是当我使用反射时
b, ok := i.(reflect.TypeOf(i))
我收到一个错误。这有什么问题?以及如何处理?
完整代码:
package main
import (
"fmt"
"reflect"
)
type MyStruct struct {
field string
}
func main() {
var i interface{} = MyStruct{field:"Thanks"}
a, ok := i.(MyStruct)
fmt.Println(a, ok)
t := reflect.TypeOf(i)
fmt.Println(t)
b, ok := i.(t)
fmt.Println(b, ok)
}
感谢您的回答。
很多东西,但基本上 "it doesn't work that way"。类型断言中括号内的东西需要是一个 type, that is a type name or a type literal. reflect.TypeOf(i)
isn't one of those, it's a method call expression. Therefore this is a syntax error. reflect.TypeOf doesn't "return a type" (which isn't really a thing you can do in Go), it returns a reflect.Type,这是一个普通的 go 结构,包含 关于 类型的信息(即某种元类型) .
但它不起作用的更根本原因是因为它不能... Go 需要知道变量在声明时的类型。它的类型要么在 var
声明中明确给出,要么从 var x = value
声明或 x := value
短赋值中的初始化值类型推断出来。在编译时类型未知是不可能。 Go 不允许您编写生成不确定类型的表达式。
类型断言的真正目的是获取接口类型的值(这是一种 "box",可以保存多种类型的值,或者对于 interface{}
,任何类型完全没有)并检索 specific 具体类型的值。断言产生的值将具有断言指定的类型,而不是其他类型。 (在 ,ok
赋值的情况下,如果断言失败,变量将保持 zero value 但仍然是正确的类型)。如果您可以将断言写入仅在运行时已知的类型,那么整个事情就会分崩离析,因此您无法编写它 — 这是一个错误。
简而言之,您不能使用反射来做到这一点。您可以使用反射来了解 i
的类型是什么,您可以了解该类型的名称,您可以了解其底层 Kind 是 Struct,您可以枚举结构的字段并从中获取值他们等等……所有这些都是反射的合法使用。但它不能返回 MyStruct
类型的变量——方法是 i.(MyStruct)
.
我正在尝试在 golang 中使用类型断言。 直接断言是没有问题的。
a, ok := i.(MyStruct)
但是当我使用反射时
b, ok := i.(reflect.TypeOf(i))
我收到一个错误。这有什么问题?以及如何处理?
完整代码:
package main
import (
"fmt"
"reflect"
)
type MyStruct struct {
field string
}
func main() {
var i interface{} = MyStruct{field:"Thanks"}
a, ok := i.(MyStruct)
fmt.Println(a, ok)
t := reflect.TypeOf(i)
fmt.Println(t)
b, ok := i.(t)
fmt.Println(b, ok)
}
感谢您的回答。
很多东西,但基本上 "it doesn't work that way"。类型断言中括号内的东西需要是一个 type, that is a type name or a type literal. reflect.TypeOf(i)
isn't one of those, it's a method call expression. Therefore this is a syntax error. reflect.TypeOf doesn't "return a type" (which isn't really a thing you can do in Go), it returns a reflect.Type,这是一个普通的 go 结构,包含 关于 类型的信息(即某种元类型) .
但它不起作用的更根本原因是因为它不能... Go 需要知道变量在声明时的类型。它的类型要么在 var
声明中明确给出,要么从 var x = value
声明或 x := value
短赋值中的初始化值类型推断出来。在编译时类型未知是不可能。 Go 不允许您编写生成不确定类型的表达式。
类型断言的真正目的是获取接口类型的值(这是一种 "box",可以保存多种类型的值,或者对于 interface{}
,任何类型完全没有)并检索 specific 具体类型的值。断言产生的值将具有断言指定的类型,而不是其他类型。 (在 ,ok
赋值的情况下,如果断言失败,变量将保持 zero value 但仍然是正确的类型)。如果您可以将断言写入仅在运行时已知的类型,那么整个事情就会分崩离析,因此您无法编写它 — 这是一个错误。
简而言之,您不能使用反射来做到这一点。您可以使用反射来了解 i
的类型是什么,您可以了解该类型的名称,您可以了解其底层 Kind 是 Struct,您可以枚举结构的字段并从中获取值他们等等……所有这些都是反射的合法使用。但它不能返回 MyStruct
类型的变量——方法是 i.(MyStruct)
.