【问题标题】:Protobuf, Go and private fieldsProtobuf、Go 和私有字段
【发布时间】:2018-07-11 08:02:32
【问题描述】:

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

message Player {
  string first_name = 1;
  string last_name = 2;
  int32 user_id = 3;
}

我正在使用https://github.com/twitchtv/twirp 在我的 Go 后端和我的 JavaScript 前端之间进行通信。如果您不了解 Twirp,它只是 JSON RPC over HTTP 1.1。

Player 消息被转换成 Go 结构体

type Player struct {
  FirstName string
  LastName string
  UserId int32
}

众所周知,大写字段是公开的。但是,我想将 UserId 保留为私有,即将其设为小写。我在前端的用户应该看不到玩家的UserId。在我的后端,我需要这些信息,所以我不能简单地删除该字段。

任何想法如何处理这种情况?我的.proto 文件中是否可以包含私有字段?

【问题讨论】:

    标签: go struct protocol-buffers


    【解决方案1】:

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

    【讨论】:

    • 当然!这完全有道理。非常感谢:)
    • 还有办法让它成为可能吗?
    猜你喜欢
    • 2023-03-08
    • 2011-08-13
    • 1970-01-01
    • 2010-09-29
    • 2023-04-02
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多