猿问

golang 类型断言使用reflect.Typeof()

我试图用字符串值(名称)来识别结构。 reflect.TypeOf返回Type。


但是类型断言需要一个type.


我怎样才能投射Type到type?


或者有什么建议来处理它?


http://play.golang.org/p/3PJG3YxIyf


package main


import (

"fmt"

"reflect"

)

type Article struct {

    Id             int64       `json:"id"`

    Title          string      `json:"title",sql:"size:255"`

    Content        string      `json:"content"`

}



func IdentifyItemType(name string) interface{} {

    var item interface{}

    switch name {

    default:

        item = Article{}

    }

    return item

}


func main() {


    i := IdentifyItemType("name")

    item := i.(Article)

    fmt.Printf("Hello, item : %v\n", item)

    item2 := i.(reflect.TypeOf(i))  // reflect.TypeOf(i) is not a type

    fmt.Printf("Hello, item2 : %v\n", item2)


}


蝴蝶不菲
浏览 357回答 3
3回答

12345678_0001

如果您需要打开外部接口的类型,则不需要反射。{}switch x.(type){&nbsp; case int:&nbsp;&nbsp; &nbsp; dosomething()}...但是如果您需要在界面中打开属性的类型,那么您可以这样做:s := reflect.ValueOf(x)for i:=0; i<s.NumValues; i++{&nbsp; switch s.Field(i).Interface().(type){&nbsp; &nbsp; case int:&nbsp;&nbsp; &nbsp; &nbsp; dosomething()&nbsp; }}我还没有找到更干净的方法,我很想知道它是否存在。

大话西游666

类型断言在语法上采用括号中的类型,而不是表达式。所以这是一个语法错误。您似乎正在尝试使用在运行时计算的值进行类型断言。那有意义吗?让我们考虑一下什么是类型断言。类型断言包括两件事:在编译时:它使结果表达式具有所需的编译时类型。该表达式x.(T)具有编译时类型T。这允许您执行可以使用 type 执行的表达式T,而您可能无法使用 of 的类型执行这些表达式x。在运行时:它检查值是否不是nil给定的类型,并且实际上是给定的类型,如果不是,它会导致恐慌。第一部分显然对于在运行时计算的类型没有意义。结果表达式的编译时类型不能依赖于编译时未知的东西。第二个(运行时检查)可以使用在运行时计算的类型来完成。就像是:if reflect.TypeOf(x) != someTypeComputedAtRuntime {&nbsp; &nbsp; panic(42)}
随时随地看视频慕课网APP

相关分类

Go
我要回答