匿名结构,struct {} {}和{}之间的区别

hyw*_*wak 1 struct dictionary go composite-literals

我必须stringstruct在这样定义的映射golang:

var Foo = map[string]struct{}{
    "foo": struct{}{},
}
Run Code Online (Sandbox Code Playgroud)

Gogland默认将此声明标记为警告,并说"冗余类型声明".

var Foo = map[string]struct{}{
    "foo": {},
}
Run Code Online (Sandbox Code Playgroud)

上面的代码解决了警告,但我找不到任何关于struct{}{}{}声明之间的区别的信息.这是一种"短记"吗?

https://play.golang.org/p/0Akx98XtB4

icz*_*cza 9

这个:

struct{}{}
Run Code Online (Sandbox Code Playgroud)

是一个复合文字,包含type(struct{})和literal的value({}).

这个:

{}
Run Code Online (Sandbox Code Playgroud)

也是一个没有类型的复合文字,只是值.

通常,您必须在复合文字中指定/包含类型,以便让编译器知道您正在创建的复合文字的类型("类型"),因此语法为:

CompositeLit = LiteralType LiteralValue.

但是,当您指定地图复合文字时,键和值的类型是从地图类型中获知的,因此如果您要指定这些类型的值,则可以省略.这在规范:复合文字中提到:

在数组,切片或地图类型的复合文字中T,如果元素或地图键本身是复合文字,则它们可能会忽略相应的文字类型(如果它与元素或键类型相同)T.类似地,作为复合文字地址的元素或键可能会忽略&T元素或键类型的时间*T.

(注意:由于疏忽,这仅适用于Go 1.5.)

  • 这个答案还有助于理解警告“来自数组、切片或映射复合的冗余类型” (2认同)