golang强制转换为relfect.Type

时间:2015-04-30 10:55:49

标签: go

我的问题如下:

我有一片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中执行此操作?

谢谢和问候

BillDoor

2 个答案:

答案 0 :(得分:2)

如果你有使用普通类型断言语法的代码,如:

x := v.(mytype)

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

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

只有在编译时知道类型时,才能恢复到常规语法。

答案 1 :(得分:1)

什么是演员表(类型断言)?它有两个影响:

  1. 在编译时,整个类型断言表达式的编译时间是转换为的类型。
  2. 在运行时,会检查值的实际运行时类型,如果它不是类型转换的类型,则会生成运行时错误。
  3. 显然,#1对于编译时未知的类型没有意义,因为编译时类型的某些东西如何依赖于编译时未知的东西?

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