Что делает инициализация структуры Go в скобках?
Обычно я инициализирую такую структуру:
item1 := Item{1, "Foo"}
Однако недавно я видел код, инициализирующийся паренами:
item2 := (Item{2, "Bar"})
reflect
возвращает то же самое Item
название.
Что делает инициализация в скобках и когда это предпочтительнее?
Вот некоторый код Go, чтобы попробовать это:
- Детская площадка: https://play.golang.org/p/_gsaruS_DVi
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