首页 > 解决方案 > 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文件中是否可以包含私有字段?

标签: gostructprotocol-buffers

解决方案


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


推荐阅读