【发布时间】:2021-10-04 23:48:54
【问题描述】:
我的 proto 文件是这样的
message DeviceOption {
string ApID = 1;
string Other = 2;
}
运行 protoc 后,DeviceOption 结构体生成如下:
type DeviceOption struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ApID string `protobuf:"bytes,1,opt,name=ApID,proto3" json:"ApID,omitempty"`
Other string `protobuf:"bytes,2,opt,name=Other,proto3" json:"Other,omitempty"`
}
现在,在服务器中,我想使用 https://pkg.go.dev/reflect 解析所有可用字段。我的代码是这样的:
v := reflect.ValueOf(pb.DeviceOption{
ApID: "random1",
Other: "random2",
})
for i := 0; i < v.NumField(); i++ {
// Do my thing
}
v.NumField() 返回 5,表示它包含了所有字段,包括我们不想要的 state、sizeCache、unknownFields .我们只需要 ApID 和 Other。
有没有其他方法可以让反射只返回数据(导出)字段,而忽略元数据(未导出)字段?
【问题讨论】:
-
如何定义“数据字段”和“元数据字段”?我知道您在示例中的意思,但请形式化它。
-
@icza 虽然 OP 的问题可能会引发一些猜测,但在这种情况下,我认为不太可能发生误解,因此立即编辑和回答可能是一个好的做法
-
@icza 我是 protobuf 的新手,猜测那些字段 state、sizeCache、unknownFields 是元数据,protobuf 添加了这些字段以提供一些控制。而本例中的数据字段是 ApID 和 Other ,由我们在 .proto 文件中定义
-
@AlexPham 我认为您的意思(以及您可以合理做出的唯一区别)是在导出(大写)和未导出(未大写)字段之间
标签: go reflection protocol-buffers