我的问题如下:我有一个reflect.Value从MethodByName("foo").Call().现在我想将包含的值转换为它们的类型,我静态地不知道,但是形式为 relflect.Type基本上我想做的是:values[0].Interface().(mytype)但有反思values[0].Interface().(reflect.TypeOf(responseObject))这给了我编译错误:reflect.TypeOf(responseObject) is not a type有没有办法做到这一点?
2 回答
qq_花开花谢_0
TA贡献1835条经验 获得超7个赞
如果您有使用正常类型断言语法的代码,例如:
x := v.(mytype)
然后编译器知道该变量x
的类型为mytype
,并相应地生成代码。如果语言允许您使用表达式代替类型,那么编译器将无法知道什么是类型x
,因此无法生成使用该变量的代码。
如果您只知道运行时值的类型,那么您将需要坚持使用reflect.Value
API。您可以使用它的Type
方法确定值的类型,并且有一些方法可以让您访问结构字段、切片或数组中的索引等。
只有当你在编译时知道一个类型时,你才能回到常规语法。
慕桂英546537
TA贡献1848条经验 获得超10个赞
什么是强制转换(类型断言)?它有两个作用:
在编译时,整个类型断言表达式的编译时就是转换到的类型。
在运行时,会检查值的实际运行时类型,如果它不是强制转换的类型,则会生成运行时错误。
显然,#1 对于编译时未知的类型没有意义,因为某物的编译时类型如何依赖于编译时未知的东西?
对于编译时未知的类型,您仍然可以手动执行 #2。只需获取使用的值的运行时类型reflect.TypeOf()
并将其与runtime.Type
您拥有的进行比较。
- 2 回答
- 0 关注
- 176 浏览
添加回答
举报
0/150
提交
取消