yon*_* ho 3 struct go protocol-buffers composite-literals
我有一个原始文件:
syntax = "proto3";
package main;
message Client {
int32 Id = 1;
string Name = 2;
string Email = 3;
}
Run Code Online (Sandbox Code Playgroud)
编译后的Client结构如下:
type Client struct {
Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"`
Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"`
Email string `protobuf:"bytes,3,opt,name=Email,proto3" json:"Email,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
Run Code Online (Sandbox Code Playgroud)
当我尝试Client像下面这样初始化此结构时:
client := &Client{123, "John", "john@aol.com"}
我收到建筑错误:too few values in struct initializer。我发现了一种通过增加来解决它XXX_NoUnkeyedLiteral,XXX_unrecognized,XXX_sizecache。我不知道这些是什么,并且想知道这是否是正确的方法:
client := &Client{123, "John", "john@aol.com", struct{}{}, []byte{}, int32(0)}
Run Code Online (Sandbox Code Playgroud)
在struct 复合文字中,您可以省略为其列出值的字段名称(这称为unkeyedliteral),但是随后您必须按声明顺序列出所有字段的初始值。或者,您可以使用键字面量,在其中显式说明要为其指定初始值的字段。在后一种情况下,您可以省略任何字段,您可以只列出要为其提供初始值(不同于该字段的零值)的字段。
您使用了无键复合文字,在这种情况下,您必须列出所有字段的值,而没有列出。这是错误消息告诉您的内容:“ struct initializer中的值太少”。
字段名称(由protobuf生成)本身应该给您提示:XXX_NoUnkeyedLiteral。建议您不要使用没有键的复合文字。
因此,请使用带有keys的复合文字,例如:
client := &Client{
Id: 123,
Name: "John",
Email: "john@aol.com",
}
Run Code Online (Sandbox Code Playgroud)
这种形式更具可读性,并且不受结构变化的影响。例如,如果该Client结构将获得新的字段,或者将重新排列字段,则此代码将仍然有效并可以编译。