Golang struct литерал синтаксиса с неэкспортированными полями
У меня есть длинная структура, которую я до сих пор создавал с синтаксисом struct literal, например:
Thing{
"the name",
...
}
Я только что добавил неэкспортированное поле Thing
структура и теперь Go жалуется: implicit assignment of unexported field 'config' in Thing literal
,
Есть ли способ, которым я могу продолжать использовать буквальный синтаксис, хотя в структуре теперь есть неэкспортированное поле?
2 ответа
Вы можете использовать только составные литералы для создания значений структурных типов, определенных в другом пакете, если вы используете ключевые значения в литерале, потому что тогда вам не нужно предоставлять начальные значения для всех полей, и поэтому вы можете опускать неэкспортированные поля (которые только декларирующий пакет может быть установлен / изменен).
Если тип объявлен в том же пакете, вы также можете установить неэкспортированные поля:
t := Thing{
Name: "the name",
someUnexported: 23,
}
Но вы можете предоставить только начальные значения для экспортируемых полей, если тип объявлен в другом пакете, что не удивительно, я думаю:
t := otherpackage.Thing{
Name: "the name",
// someUnexported will implicitly be its zero value
}
Если вам нужны значения структуры, в которой неэкспортированные поля имеют значения, отличные от нулевого значения их типов, сам пакет должен экспортировать какой-либо конструктор или инициализатор (или метод установки), потому что извне (из пакета) вы не может изменить / установить неэкспортированные поля.
Смотрите связанный вопрос: Как клонировать структуру с неэкспортированным полем?
Еще один момент, чтобы добавить. все свойства структуры должны начинаться с заглавной буквы, например:
t := Thing
{
Name: "the name", // <-- This will work because Name start with capital letter
someUnexported: 23, // <-- this wont work because someUnexported starts with small letter
}