首页 >后端开发 >Golang >Go 中的匿名结构:什么时候在 `map[string]struct{}` 中指定类型是多余的?

Go 中的匿名结构:什么时候在 `map[string]struct{}` 中指定类型是多余的?

Susan Sarandon
Susan Sarandon原创
2024-10-30 04:06:28351浏览

 Anonymous Struct in Go:  When is it Redundant to Specify the Type in `map[string]struct{}`?

匿名结构:揭示 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn