我有结构
type ChartOpts struct {
Name mypakage.MyType
Repo mypakage.MyType
}
我想迭代它的字段,如果满足类型断言,则调用该(断言)类型的方法。func (chartOpts ChartOpts) BindFlags(cobCom *cobra.Command) {
fields := reflect.TypeOf(chartOpts)
values := reflect.ValueOf(chartOpts)
num := fields.NumField()
fmt.Println(fields, values, num)
for i := 0; i < num; i++ {
field := fields.Field(i)
switch v := field.Type.(type) {
case mypackage.MyType:
field.BindPersistentFlag(cobCom)
default:
log.Fatal(ErrUnhandledType)
}
}
}
上面的代码无法编译并出现此错误:field.BindPersistentFlag undefined (type reflect.StructField has no field or method BindPersistentFlag)
为什么?
最佳答案
field
是 reflect.StructField
类型,这不是字段的值,而是它的结构字段描述符。
您需要在字段的值上进行类型切换:
values.Field(i)
请注意,上面是包裹在 reflect.Value
中的字段值。 ,所以用 Value.Interface()
提取值:for i := 0; i < num; i++ {
switch v := values.Field(i).Interface().(type) {
case mypackage.MyType:
v.BindPersistentFlag(cobCom)
default:
log.Fatal(ErrUnhandledType)
}
}
并调用BindPersistentFlag()
在 v
,因为它的类型为 mypackage.MyType
里面case
.
关于go - 在golang中反射和类型切换后调用接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63245271/