为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
蝴蝶不菲 2021-09-10 20:41:04
我试图用字符串值(名称)来识别结构。 reflect.TypeOf返回Type。但是类型断言需要一个type.我怎样才能投射Type到type?或者有什么建议来处理它?http://play.golang.org/p/3PJG3YxIyfpackage mainimport ("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)}
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

如果您需要打开外部接口的类型,则不需要反射。{}


switch x.(type){

  case int: 

    dosomething()

}

...但是如果您需要在界面中打开属性的类型,那么您可以这样做:


s := reflect.ValueOf(x)

for i:=0; i<s.NumValues; i++{

  switch s.Field(i).Interface().(type){

    case int: 

      dosomething()

  }

}

我还没有找到更干净的方法,我很想知道它是否存在。


查看完整回答
反对 回复 2021-09-10
?
大话西游666

TA贡献1817条经验 获得超14个赞

类型断言在语法上采用括号中的类型,而不是表达式。所以这是一个语法错误。

您似乎正在尝试使用在运行时计算的值进行类型断言。那有意义吗?让我们考虑一下什么是类型断言。

类型断言包括两件事:

  1. 在编译时:它使结果表达式具有所需的编译时类型。该表达式x.(T)具有编译时类型T。这允许您执行可以使用 type 执行的表达式T,而您可能无法使用 of 的类型执行这些表达式x

  2. 在运行时:它检查值是否不是nil给定的类型,并且实际上是给定的类型,如果不是,它会导致恐慌。

第一部分显然对于在运行时计算的类型没有意义。结果表达式的编译时类型不能依赖于编译时未知的东西。

第二个(运行时检查)可以使用在运行时计算的类型来完成。就像是:

if reflect.TypeOf(x) != someTypeComputedAtRuntime {

    panic(42)

}


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 356 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信