匿名結構:揭示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中文網其他相關文章!