在括号中初始化 Go 结构有什么作用?

What does initializing a Go struct in parentheses do?

通常,我会像这样初始化一个结构:

item1 := Item{1, "Foo"}

不过,我最近看到代码用括号初始化:

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

reflect returns 同一个 Item 名字。

括号中的初始化有什么作用,何时首选?

这里有一些 Go 代码来尝试这个:

没什么特别的,这两行是相同的。

但是,当您想在 if 语句中使用它时,括号是必需的,否则会出现编译时错误:

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

结果:

expected boolean expression, found simple statement (missing parentheses around composite literal?) (and 1 more errors)

这是因为出现了解析歧义:左大括号是复合文字的一部分还是 if 语句的主体并不明显。

使用圆括号会使编译器明确无歧义,所以这行得通:

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

详情见: