如何在Go中使用协议缓冲区FieldMask

问题描述

Python Generated Code列出了Well Known Types,但是Go Generated Code中没有等效项。我认为如果有,它将记录此软件包google.golang.org/protobuf/types/known

特别是,我正在寻找有关FieldMask的文档。 Go Generated Code上完全没有,但是我确实在go.devhttps://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 类型仅提供 IsValidNormalize 方法。

对于这个问题,有一些很好的存储库,fieldmask-utilsfmutils

根据我的理解,在获得 FieldMask 值后,它是一个 []string

  1. 使用 go 的 v1 api,您需要在 reflect(从 pb 消息转换而来)或使用 struct(从 pb 消息转换)上使用 map[string]interface{} 来处理 { {1}}
  2. 或者使用 go 的 v2 api,它变得更容易,至于 FieldMask 上的反射 api。检查 code

您可以在上述存储库中获取更多代码详细信息,以帮助您编写自己的与 proto.Message 相关的代码。