Что делает инициализация структуры Go в скобках?

Обычно я инициализирую такую ​​структуру:

item1 := Item{1, "Foo"}

Однако недавно я видел код, инициализирующийся паренами:

item2 := (Item{2, "Bar"})

reflect возвращает то же самое Item название.

Что делает инициализация в скобках и когда это предпочтительнее?

Вот некоторый код Go, чтобы попробовать это:

1 ответ

Решение

Это не делает ничего особенного, эти две строки идентичны.

Тем не менее, когда вы хотите использовать это в if например, в скобках будет обязательно, иначе вы получите ошибку времени компиляции:

if i := Item{3, "a"}; i.Id == 3 {
}

Результаты в:

ожидаемое логическое выражение, найдено простое утверждение (отсутствуют круглые скобки вокруг составного литерала?) (и еще 1 ошибка)

Это происходит потому, что возникает неоднозначность синтаксического анализа: не очевидно, будет ли открывающая скобка частью составного литерала или тела if заявление.

Использование скобок сделает его однозначным для компилятора, так что это работает:

if i := (Item{3, "a"}); i.Id == 3 {
}

Для получения дополнительной информации см.: Struct in for for initializer

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