假设我在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
文件中是否可以包含私有字段?
答案 0 :(得分:5)
Protobuf用于通信,而不用于数据库建模。您应该使用protobuf来描述您打算通过客户端发送/接收的数据结构。
如果您不打算将用户ID发送给客户端,请不要将其包含在protobuf Player
定义中。
您发送给客户端的Player
和存储在数据库中的Player
不必相同。通常,它们不一样,您通常会存储其他字段(例如创建时间,数据库ID等),这些字段不适用于客户端。
因此,对于Player
,您应该具有2个单独的结构,一个服务器使用(存储)的结构,另一个则供客户端查看的结构。当然,在定义这两个结构时,您可以在另一个结构中加以利用以防止重复,例如服务器播放器可以嵌入客户端播放器,例如:
新原型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
时,您只会将DBPlayer.Player
字段发送给客户端,其余为“私有”。