У меня есть прото-файл:
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)}
В структуре составные литералы вы можете опустить имена полей, для которых вы указываете значения (это называется без ключа буквальный), но тогда вы должны указать начальные значения для всех полей и в порядке их объявления. Или вы можете использовать литерал с ключом, где вы явно указываете, для каких полей вы указываете начальные значения. В последнем случае вам разрешено опускать любое из полей, вы можете просто указать те из них, которым вы хотите присвоить начальное значение, отличное от поля нулевое значение).
Вы использовали составной литерал без ключа, и в этом случае вы должны указать значения для всех полей, чего вы не сделали. Вот что сообщает вам сообщение об ошибке: "слишком мало значений в инициализаторе структуры".
Само имя поля (сгенерированное protobuf) должно дать вам подсказку: XXX_NoUnkeyedLiteral
. Он предлагает вам не использовать составной литерал без ключей.
Поэтому используйте составной литерал с ключами, например:
client := &Client{
Id: 123,
Name: "John",
Email: "[email protected]",
}
Эта форма более читабельна и невосприимчива к структурным изменениям. Например. если структура Client
получит новые поля или поля будут переупорядочены, этот код все равно будет действителен и компилируется.
Добавьте имя поля до того, как значение сможет устранить ошибку здания, как
client := &Client{Id: 123, Name: "John", Email: "[email protected]"}
Я узнаю это, проверяя пример grpc golang, но, может быть, кто-нибудь сможет объяснить, почему? ;)
Спасибо за Ваш ответ. Но написать что-то подобное в GoLang непросто. Не знаю, как изменить настройки.