假设我在我的 .proto
文件中定义了一个 Player
。
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
文件中包含私有(private)字段?
最佳答案
Protobuf 用于通信,而不用于数据库建模。您应该使用 protobuf 来描述您打算从客户端发送/接收的数据结构。
如果您不打算将用户 ID 发送给客户端,请不要将其包含在您的 protobuf Player
定义中。
您发送给客户端的 Player
和您存储在数据库中的 Player
不必相同。更多时候它们并不相同,您通常会存储其他字段,例如创建时间、数据库 ID 等,这些字段不适用于客户端。
因此您应该为 Player
设置 2 个独立的结构,一个供服务器使用(存储),一个供客户端查看。当然,在定义这两个结构时,您可以在另一个中使用一个来防止重复,例如服务器播放器可以嵌入客户端播放器,例如:
新原型(prototype)播放器
:
message Player {
string first_name = 1;
string last_name = 2;
}
客户端播放器
:
type Player struct {
FirstName string
LastName string
}
服务器播放器
:
type DBPlayer struct {
Player // Embed Player
UserId int32
}
当你在你的服务器上加载一个DBPlayer
时,你只会将DBPlayer.Player
字段发送给客户端,其余的都是“私有(private)的”。
关于go - Protobuf、Go 和私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51280221/