hyw*_*wak 1 struct dictionary go composite-literals
我必须string要struct在这样定义的映射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{}{}和{}声明之间的区别的信息.这是一种"短记"吗?
这个:
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.)