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
}
Другие вопросы по тегам