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仅合并特定字段。
fieldmaskpb.FieldMasktype 提供了一些有用的方法,例如IsValid和Normalize。
追加方法看起来可以在合并的情况下使用。
有一些很棒的存储库可以处理字段掩码、fieldmask-utils和fmutils。
根据我的理解,在获得FieldMask值后,这是[]string:
reflecton struct(从pb消息转换而来)或使用a map[string]interface{}(从pb消息转换而来)来处理FieldMaskproto.Message. 检查代码您可以在上面的存储库中获取更多代码详细信息,以帮助您编写与FieldMask.