匿名结构:揭示 struct{}{} 和 {} 之间的差异
在 Go 中,声明字符串到匿名结构映射可以通过两种方式完成:
<code class="go">var Foo = map[string]struct{}{ "foo": struct{}{}, }</code>
<code class="go">var Foo = map[string]struct{}{ "foo": {}, }</code>
虽然这两个表达式都有效,但第二个表达式会在 Gogland 中引发有关“冗余类型声明”的警告。为了澄清这一点,让我们探讨一下这两种形式之间的根本区别。
首先,考虑以下内容:
<code class="go">struct{}{}</code>
这是一个由类型 (struct{}) 及其结构组成的复合文字价值 ({})。相比之下,以下:
<code class="go">{}</code>
是省略类型并仅保留值的复合文字。
通常,复合文字需要包含类型规范以帮助编译器识别他们的预期类型。根据语言规范:
CompositeLit = LiteralType LiteralValue .
但是,在定义映射复合文字时,键和值类型已由映射类型指定。因此,如果您计划提供这些指定类型的值,则可以省略类型规范。
这种省略受到 Go 规范的认可,其中规定:
"Within a composite literal of array, slice, or map type T, elements or map keys that are themselves composite literals may elide the respective literal type if it is identical to the element or key type of T."
结论,开头提出的两个表达式达到相同的最终结果。然而,后者利用了一种语言功能,允许在映射复合文字中省略冗余类型规范。
以上是Go 中的匿名结构:什么时候在 `map[string]struct{}` 中指定类型是多余的?的详细内容。更多信息请关注PHP中文网其他相关文章!