簡體   English   中英

使用協議緩沖區錯誤構建:struct initializer中的值太少

[英]Go build with protocol buffer error: too few values in struct initializer

我有一個原型文件:

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)}

在struct composite literals中,您可以省略列出值的字段名稱(這稱為unkeyed literal ),但是您必須列出所有字段的初始值並按其聲明順序列出。 或者,您可以使用鍵控文字,其中您明確說明了為其指定初始值的字段。 在后者中,您可以省略任何字段,您可以只列出要提供與字段的零值不同的初始值的字段。

您使用了未加密的復合文字,在這種情況下,您必須列出所有字段的值,而您沒有。 這是錯誤消息告訴您的: “struct initializer中的值太少”

字段名稱(由protobuf生成)本身應該為您提供提示: XXX_NoUnkeyedLiteral 它建議你不要使用沒有鍵的復合文字。

所以使用帶有鍵的復合文字,比如::

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

這種形式更具可讀性,並且不受結構變化的影響。 例如,如果Client結構將獲得新字段,或者字段將重新排列,則此代碼仍然有效並編譯。

在值可以解決構建錯誤之前添加字段名稱,如

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

我通過檢查grpc golang示例找到了這個,但也許有人可以解釋為什么? ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM