使用协议缓冲区错误进行构建:结构初始化程序中的值太少

时间:2018-08-08 08:41:44

标签: go struct protocol-buffers composite-literals

我有一个原始文件:

syntax = "proto3";

package main;

message Client {
    int32 Id = 1;
    string Name = 2;
    string Email = 3;
}

经过编译的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:"-"`
}

当我尝试初始化此Client结构时,如下所示:

client := &Client{123, "John", "john@aol.com"}

我收到构建错误:too few values in struct initializer。我找到了一种通过添加XXX_NoUnkeyedLiteralXXX_unrecognizedXXX_sizecache来解决此问题的方法。我不知道这些是什么,并且想知道这是否是正确的方法:

client := &Client{123, "John", "john@aol.com", struct{}{}, []byte{}, int32(0)}

2 个答案:

答案 0 :(得分:3)

在结构composite literals中,您可以省略为其列出值的字段名称(这称为 unkeyedliteral ),但是随后您必须列出所有字段的初始值和他们的申报顺序。或者,您可以使用键字面量,在其中显式说明要为其指定初始值的字段。在后者中,您可以省略任何字段,可以只列出要为其提供初始值的字段,而不是字段zero value)。

您使用了无键复合文字,在这种情况下,您必须列出所有字段的值,而没有列出。这是错误消息告诉您的内容:“结构初始化程序中的值太少”

字段名称(由protobuf生成)本身应该给您提示:XXX_NoUnkeyedLiteral。建议您不要使用没有键的复合文字。

因此,使用带键的复合文字 ,例如::

client := &Client{
    Id:    123,
    Name:  "John",
    Email: "john@aol.com",
}

这种形式更具可读性,并且不受结构变化的影响。例如。如果Client结构将获得新的字段,或重新排列字段,则此代码将仍然有效并可以编译。

答案 1 :(得分:0)

在值可以解决构建错误之前添加字段名称,例如

client := &Client{Id: 123, Name: "John", Email: "john@aol.com"}

我通过检查grpc golang example发现了这一点,但是也许有人可以解释为什么? ;)