Перейти к сборке с ошибкой буфера протокола: слишком мало значений в инициализаторе структуры

У меня есть прото-файл:

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", "[email protected]"}

Я получаю сообщение об ошибке сборки: too few values in struct initializer. Я нашел способ исправить это, добавив XXX_NoUnkeyedLiteral, XXX_unrecognized, XXX_sizecache. Я не знаю, что это такое, и задаюсь вопросом, правильный ли это способ сделать это:

client := &Client{123, "John", "[email protected]", struct{}{}, []byte{}, int32(0)}
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
6
0
5 186
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В структуре составные литералы вы можете опустить имена полей, для которых вы указываете значения (это называется без ключа буквальный), но тогда вы должны указать начальные значения для всех полей и в порядке их объявления. Или вы можете использовать литерал с ключом, где вы явно указываете, для каких полей вы указываете начальные значения. В последнем случае вам разрешено опускать любое из полей, вы можете просто указать те из них, которым вы хотите присвоить начальное значение, отличное от поля нулевое значение).

Вы использовали составной литерал без ключа, и в этом случае вы должны указать значения для всех полей, чего вы не сделали. Вот что сообщает вам сообщение об ошибке: "слишком мало значений в инициализаторе структуры".

Само имя поля (сгенерированное protobuf) должно дать вам подсказку: XXX_NoUnkeyedLiteral. Он предлагает вам не использовать составной литерал без ключей.

Поэтому используйте составной литерал с ключами, например:

client := &Client{
    Id:    123,
    Name:  "John",
    Email: "[email protected]",
}

Эта форма более читабельна и невосприимчива к структурным изменениям. Например. если структура Client получит новые поля или поля будут переупорядочены, этот код все равно будет действителен и компилируется.

Спасибо за Ваш ответ. Но написать что-то подобное в GoLang непросто. Не знаю, как изменить настройки.

yong ho 10.08.2018 10:12

Добавьте имя поля до того, как значение сможет устранить ошибку здания, как

client := &Client{Id: 123, Name: "John", Email: "[email protected]"}

Я узнаю это, проверяя пример grpc golang, но, может быть, кто-нибудь сможет объяснить, почему? ;)

Другие вопросы по теме