我正在尝试获取从 proto 生成的 go 文件中的所有字段名称。下面是生成的结构。
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 是 proto 中的一个字段,实现如下。
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
}