首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Protobuf,Go和私有领域

Protobuf,Go和私有领域
EN

Stack Overflow用户
提问于 2018-07-11 08:02:32
回答 1查看 1.5K关注 0票数 3

假设我在我的Player文件中定义了一个.proto

代码语言:javascript
复制
message Player {
  string first_name = 1;
  string last_name = 2;
  int32 user_id = 3;
}

我使用https://github.com/twitchtv/twirp在Go后端和JavaScript前端之间进行通信。如果您不知道Twirp,那么它只是HTTP1.1上的JSON。

Player消息转换为Go结构。

代码语言:javascript
复制
type Player struct {
  FirstName string
  LastName string
  UserId int32
}

众所周知,大写字段是公共的。但是,我希望保持UserId的私有性,即使其小写。我前面的用户不应该能够看到播放器的UserId。在我的后端,我需要这个信息,所以我不能简单地删除字段。

有什么办法处理这种情况吗?在我的.proto文件中有可能有私有字段吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 08:21:39

Protobuf用于通信,而不是用于数据库建模。您应该使用protobuf来描述您打算从客户端发送/接收的数据结构。

如果您不打算向客户端发送用户ID,则不要将其包括在protobuf Player定义中。

发送给客户端的Player和存储在数据库中的Player不必相同。更多的情况是,它们不一样,您通常存储其他字段,如创建时间、数据库ID等,这些字段不适合客户端。

因此,对于一个Player,您应该有两个单独的结构,一个是服务器使用的(存储)结构,另一个是客户端看到的结构。当然,在定义这两个结构时,您可以利用另一个结构来防止重复,例如服务器播放器可以嵌入客户端播放器,例如:

新proto Player

代码语言:javascript
复制
message Player {
  string first_name = 1;
  string last_name = 2;
}

客户端Player

代码语言:javascript
复制
type Player struct {
    FirstName string
    LastName string
}

服务器Player

代码语言:javascript
复制
type DBPlayer struct {
    Player // Embed Player

    UserId int32
}

当您在服务器中加载DBPlayer时,您只会将DBPlayer.Player字段发送到客户端,其余的都是“私有”的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51280221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档