如何在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).