go - 在golang中反射和类型切换后调用接口(interface)方法

标签 go methods struct reflection type-switch

我有结构

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/

相关文章:

go - beego 必须有一个寄存器 DataBase 别名 `default`

html - 如何在getProjectLists上调用我创建的方法,以便从字符串中删除HTML标记

c - 如何从 C 文件中的双引号中读取多个单词

C 结构指针访问字段

c++ - 如何在 go 中使用 .lib 和 .dll 文件调用预构建的 API?

go - 如何组合 2 个结构内容,一个具有相同的键

java - 如何在未将对象作为参数传递的方法中创建引用实例化类对象的对象?

c - 解析二进制数据时使用属性打包的结构

go - 如何使用 golang Gorilla mux 查找 CSS 文件

ruby-on-rails - 在 Controller 中调用模型自定义方法