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()
...
field
是 reflect.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
类型
我有结构
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()
...
field
是 reflect.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
类型