go - Protobuf、Go 和私有(private)字段

标签 go struct protocol-buffers

假设我在我的 .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/

相关文章:

Golang不向多播组发送UDP数据包

protocol-buffers - 如何检查 protoc-gen-go 和 protoc-gen-validate 的版本?

python - tf.SequenceExample 与多维数组

java - 如何为spring kafka设置protobuf参数?

go - 为什么我的 Stringer 接口(interface)方法没有被调用?使用 fmt.Println 时

Golang,追加的第一个参数必须是 slice ;有结构

json - Golang 使用类型

使用结构创建和扩展链表

c - 将结构指针指向 C 中动态分配内存的第一个 block

c - 在堆内存数组中分配指向结构的指针