![](/img/trans.png)
[英]Go Protobuf declarations and optional Fields in Go Struct (string pointers)
[英]Protobuf, Go and private fields
假设我在.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
文件中是否可以包含私有字段?
Protobuf用于通信 ,而不用于数据库建模。 您应该使用protobuf来描述您打算通过客户端发送/接收的数据结构。
如果您不打算将用户ID发送给客户端,则不要在protobuf Player
定义中包括该ID。
该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
字段发送给客户端,其余为“私有”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.