Protobuf,Go和私有字段

时间:2018-07-11 08:02:32

标签: go struct protocol-buffers

假设我在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文件中是否可以包含私有字段?

1 个答案:

答案 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字段发送给客户端,其余为“私有”。