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

Jac*_*ack 5 python api-design go protocol-buffers grpc-go

Python 生成的代码列出了众所周知的类型,但Go 生成的代码中没有等效的类型。我假设如果有的话,它会记录这个包google.golang.org/protobuf/types/known

具体来说,我正在寻找有关FieldMask. 虽然它在Go 生成的代码中完全不存在,但我确实在go.dev上找到了它(https://pkg.go.dev/google.golang.org/protobuf/types/known/fieldmaskpb)。

问题

FieldMask的 Python 实现提供了一个MergeMessage函数,可以合并FieldMask从源到目标中指定的字段。这在API 更新操作中非常有用,因为您可以轻松合并 2 个原始消息,同时遵循FieldMask

# 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
Run Code Online (Sandbox Code Playgroud)

Go 中是否有等效的便利函数?如果不是,应该如何使用 合并原始消息FieldMask?有我可以遵循的参考实现或示例吗?FieldMask我在grpc-go/examples/中找不到任何用途。

虽然有一个原始合并函数,但它会合并所有字段,并且无法合并FieldMask仅合并特定字段。

Fra*_*nci 4

fieldmaskpb.FieldMasktype 提供了一些有用的方法,例如IsValidNormalize

追加方法看起来可以在合并的情况下使用

有一些很棒的存储库可以处理字段掩码、fieldmask-utilsfmutils

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

  1. 使用go的v1 api,您需要使用reflecton struct(从pb消息转换而来)或使用a map[string]interface{}(从pb消息转换而来)来处理FieldMask
  2. 或者使用go的v2 api,它变得更容易,至于proto.Message. 检查代码

您可以在上面的存储库中获取更多代码详细信息,以帮助您编写与FieldMask.