问题描述
Python Generated Code列出了Well Known Types,但是Go Generated Code中没有等效项。我认为如果有,它将记录此软件包google.golang.org/protobuf/types/known。
特别是,我正在寻找有关FieldMask
的文档。 Go Generated Code上完全没有,但是我确实在go.dev(https://pkg.go.dev/google.golang.org/protobuf/types/known/fieldmaskpb)上找到了它。
问题
FieldMask的Python实现提供了一个MergeMessage
函数,该函数将FieldMask
中指定的字段从源合并到目标。这在API update操作中非常有用,因为您可以在遵守FieldMask
的同时轻松合并2个原型消息:
# get field mask and message from request
updated_message = request.message
field_mask = request.mask
# load original message from database
original_message = read_from_db(request.id)
# source,destination
field_mask.MergeMessage(updated_message,original_message)
# original_message is Now updated according to the field mask
Go中是否有等效的便捷功能?如果不是,应该如何使用FieldMask
合并原始消息?有没有我可以遵循的参考实现或示例?我在grpc-go/examples/中找不到FieldMask
的任何用法。
虽然有一个原型Merge function,但它会合并所有字段,并且无法合并FieldMask
来仅合并特定字段。
解决方法
我认为处理 go 中的 protobuf FieldMask
是开发人员的工作。
fieldmaskpb.FieldMask
类型仅提供 IsValid
和 Normalize
方法。
对于这个问题,有一些很好的存储库,fieldmask-utils 和 fmutils。
根据我的理解,在获得 FieldMask
值后,它是一个 []string
:
- 使用 go 的 v1 api,您需要在
reflect
(从 pb 消息转换而来)或使用struct
(从 pb 消息转换)上使用map[string]interface{}
来处理 { {1}} - 或者使用 go 的 v2 api,它变得更容易,至于
FieldMask
上的反射 api。检查 code
您可以在上述存储库中获取更多代码详细信息,以帮助您编写自己的与 proto.Message
相关的代码。