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

golang 投射到 relfect.Type

golang 投射到 relfect.Type

Go
呼啦一阵风 2021-10-04 13:33:17
我的问题如下:我有一个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.ValueAPI。您可以使用它的Type方法确定值的类型,并且有一些方法可以让您访问结构字段、切片或数组中的索引等。

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


查看完整回答
反对 回复 2021-10-04
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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

  1. 在编译时,整个类型断言表达式的编译时就是转换到的类型。

  2. 在运行时,会检查值的实际运行时类型,如果它不是强制转换的类型,则会生成运行时错误。

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

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


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

添加回答

举报

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