go - Protobuf、Go 和私有字段
问题描述
假设我的文件Player
中有一个定义。.proto
message Player {
string first_name = 1;
string last_name = 2;
int32 user_id = 3;
}
我正在使用https://github.com/twitchtv/twirp在我的 Go 后端和我的 JavaScript 前端之间进行通信。如果您不了解 Twirp,它只是基于 HTTP 1.1 的 JSON RPC。
消息被Player
转换为 Go 结构
type Player struct {
FirstName string
LastName string
UserId int32
}
众所周知,大写字段是公开的。但是我想保持UserId
私有,即使其小写。我在前端的用户应该看不到UserId
玩家的。在我的后端,我需要这些信息,所以我不能简单地删除该字段。
任何想法如何处理这种情况?我的.proto
文件中是否可以包含私有字段?
解决方案
Protobuf 用于通信,而不是用于数据库建模。您应该使用 protobuf 来描述您打算从客户端发送/接收的数据结构。
如果您不打算将用户 ID 发送给客户端,请不要将其包含在您的 protobufPlayer
定义中。
Player
您发送给客户的数据和您Player
存储在数据库中的数据不必相同。更多的时候它们是不一样的,你通常会存储其他字段,例如创建时间、数据库 ID 等,这些字段不适合客户端。
因此,您应该有 2 个单独的结构 a Player
,一个是服务器使用(存储)的,一个是客户端看到的。当然,在定义这两个结构时,您可以使用其中一个来防止重复,例如服务器播放器可以嵌入客户端播放器,例如:
新原型Player
:
message Player {
string first_name = 1;
string last_name = 2;
}
客户Player
:
type Player struct {
FirstName string
LastName string
}
服务器Player
:
type DBPlayer struct {
Player // Embed Player
UserId int32
}
当您DBPlayer
在服务器中加载 a 时,您只会将DBPlayer.Player
字段发送给客户端,其余的都是“私有的”。
推荐阅读
- regex - 如何获得释放值?
- javascript - Moment js添加日期和格式失败
- javascript - Visual Studio Code - 格式化代码样式
- json - 如何从 SP API 获取亚马逊履行中心 ID
- python - 如何更改代码以使其不出现 html 标签
- jquery - 在 C# UI 中捕获 SSRS/PowerBI/Tableau 报告错误
- inform7 - 如何以不同的方式回应“chuck wood”和“throw log”?
- swift5 - 如何在 Regex iOS Swift 中添加汉字?
- laravel - “DataTables”命名空间中没有定义命令
- flutter - 当txt在毫秒内保持打开和关闭时如何避免文本文件出错