为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁花如伊 2021-04-02 18:19:28
我有一个原始文件: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_NoUnkeyedLiteral,XXX_unrecognized,XXX_sizecache。我不知道这些是什么,并且想知道这是否是正确的方法:client := &Client{123, "John", "john@aol.com", struct{}{}, []byte{}, int32(0)}
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

在struct复合文字中,您可以省略为其列出值的字段名称(这称为“无键文字”),但是随后您必须按其声明顺序列出所有字段的初始值。或者,您可以使用键字面量,在其中显式说明要为其指定初始值的字段。在后者中,您可以省略任何字段,您可以只列出要为其提供初始值(不同于该字段的零值)的字段。


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


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


因此,请使用带有keys的复合文字,例如:


client := &Client{

    Id:    123,

    Name:  "John",

    Email: "john@aol.com",

}

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


查看完整回答
反对 回复 2021-04-19
?
慕容708150

TA贡献1831条经验 获得超4个赞

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

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

我通过查看grpc golang示例找到了这一点,但是也许有人可以解释为什么?;)


查看完整回答
反对 回复 2021-04-19
  • 2 回答
  • 0 关注
  • 344 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信