【问题标题】:golang cast to relfect.Type [duplicate]golang转换为reflect.Type [重复]
【发布时间】:2015-07-10 01:04:39
【问题描述】:

我的问题如下:

我有一个reflect.Value 的切片,它是从MethodByName("foo").Call() 返回的。

现在我想将包含的值转换为它们的类型,我静态地不知道,但形式为relflect.Type

基本上我想做的是:

values[0].Interface().(mytype)

但有反射

values[0].Interface().(reflect.TypeOf(responseObject))

这给了我编译错误:

reflect.TypeOf(responseObject) is not a type

有没有办法在go中做到这一点?

感谢和问候

比尔门

【问题讨论】:

  • 我不能,因为我不知道静态类型
  • 您打开 reflect.Type.Kind() 并相应地调用 reflect.Value.{Int,String,Float,...}()。
  • @billdoor:您应该在问题中描述您打算用reflect.Values 的切片做什么。因为您所提议的内容以目前的形式无法完成。
  • @bildor:您确实知道 reflect.Value 可以转换为哪些类型,因为这是一个 固定 列表。当然,您不能进行动态类型转换,但是然后像我们试图解释的那样找到不同的设计。动态类型转换的整个理念是无意义的,因为生成的对象需要在编译时已知的静态类型。
  • 如果您不知道静态类型,那么就没有理由进行类型断言,您可以将其留在interface{} 中。如果您要进行类型断言,那是因为您需要一个特定的已知类型。

标签: go


【解决方案1】:

如果您有使用正常类型断言语法的代码,例如:

x := v.(mytype)

然后编译器知道变量x的类型是mytype,并相应地生成代码。如果语言允许您使用表达式代替类型,那么编译器将无法知道x 是什么类型,因此无法生成使用该变量的代码。

如果您只知道运行时值的类型,那么您将需要坚持使用reflect.Value API。您可以使用其Type 方法确定值的类型,并且有一些方法可以让您访问结构字段、切片或数组中的索引等。

只有当你在编译时有一个你知道的类型时,你才能回到常规语法。

【讨论】:

    【解决方案2】:

    什么是强制转换(类型断言)?它有两个作用:

    1. 在编译时,整个类型断言表达式的编译时是转换为的类型。
    2. 在运行时,会检查值的实际运行时类型,如果不是强制转换的类型,则会产生运行时错误。

    显然,#1 对于编译时未知的类型没有意义,因为某事物的编译时类型如何依赖于编译时未知的某事物?

    对于编译时未知的类型,您仍然可以手动执行 #2。只需使用 reflect.TypeOf() 获取值的运行时类型,然后将其与您拥有的 runtime.Type 进行比较。

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 2015-06-04
      • 2016-09-24
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      相关资源
      最近更新 更多