golang中反射&类型切换后调用接口方法

Calling interface method after reflection & type switching in golang

我有结构

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)

为什么?

您需要使用该值并从反射中恢复接口:

values.Field(i).Interface().(Type).Method()

在你的情况下,切换界面会更简单:

switch v := values.Field(i).Interface().(type) {
case Type:
    v.Method()
...

fieldreflect.StructField 类型,它不是字段的值,它是它的结构字段描述符。

您需要 type-switch 字段值:

values.Field(i)

注意上面是reflect.Value, so extract the value with 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)
    }
}

并在 v 上调用 BindPersistentFlag(),因为它将是 case.

中的 mypackage.MyType 类型