Что делает инициализация структуры Go в скобках? - PullRequest
0 голосов
/ 13 июня 2018

Обычно я инициализирую структуру наподобие

item1 := Item{1, "Foo"}

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

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

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

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

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

1 Ответ

0 голосов
/ 13 июня 2018

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

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

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

Результат:

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

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

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

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

Подробнее см .: Структура для инициализатора цикла

...