Я пытаюсь получить все имена полей в файле go, созданном из proto. Ниже приведена сгенерированная структура.
type Action struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Types that are valid to be assigned to ActionType:
// *Action_TaskAction
ActionType isAction_ActionType `protobuf_oneof:"action_type"`
}
Как видно, ActionType - это одно из полей в прототипе, которое реализовано, как показано ниже.
type isAction_ActionType interface {
isAction_ActionType()
}
type Action_TaskAction struct {
TaskAction *TaskAction `protobuf:"bytes,16,opt,name=task_action,json=taskAction,proto3,oneof"`
}
type TaskAction struct {
Progress float32 `protobuf:"fixed32,1,opt,name=progress,proto3" json:"progress,omitempty"`
}
Поскольку я хочу получить имя поля в структуре TaskAction, которое является Progress.
Я использую приведенный ниже код, чтобы получить имена полей, но сталкиваюсь с проблемой, если тип поля является интерфейсом (для поля oneof)
func printFieldNames(t reflect.Type) error {
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
if field.Type.Kind() == reflect.Struct {
printFieldNames(field.Type)
continue
}
if field.Type.Kind() == reflect.Interface {
// what to do here.
}
column := field.Tag.Get("json")
fmt.Println("column: ", column)
}
return nil
}