3 回答
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()
}
}
我还没有找到更干净的方法,我很想知道它是否存在。
TA贡献1817条经验 获得超14个赞
类型断言在语法上采用括号中的类型,而不是表达式。所以这是一个语法错误。
您似乎正在尝试使用在运行时计算的值进行类型断言。那有意义吗?让我们考虑一下什么是类型断言。
类型断言包括两件事:
在编译时:它使结果表达式具有所需的编译时类型。该表达式
x.(T)具有编译时类型T。这允许您执行可以使用 type 执行的表达式T,而您可能无法使用 of 的类型执行这些表达式x。在运行时:它检查值是否不是
nil给定的类型,并且实际上是给定的类型,如果不是,它会导致恐慌。
第一部分显然对于在运行时计算的类型没有意义。结果表达式的编译时类型不能依赖于编译时未知的东西。
第二个(运行时检查)可以使用在运行时计算的类型来完成。就像是:
if reflect.TypeOf(x) != someTypeComputedAtRuntime {
panic(42)
}
- 3 回答
- 0 关注
- 403 浏览
添加回答
举报
