【问题标题】:Anonymous struct, difference between struct{}{} and {}匿名结构,结构{}{}和{}的区别
【发布时间】:2017-10-12 10:21:35
【问题描述】:

我在 golang 中有 stringstruct 的映射,定义如下:

var Foo = map[string]struct{}{
    "foo": struct{}{},
}

Gogland 默认将此声明标记为警告,表示“冗余类型声明”

var Foo = map[string]struct{}{
    "foo": {},
}

上面的代码解决了警告,但我找不到任何关于struct{}{}{} 声明之间区别的信息。它是一种“短符号”吗?

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

【问题讨论】:

    标签: dictionary go struct composite-literals


    【解决方案1】:

    这个:

    struct{}{}
    

    是一个composite literal,它包含类型(struct{})和文字值({})。

    这个:

    {}
    

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

    通常您必须在复合文字中指定/包含类型,以让编译器知道您正在创建哪种(什么“类型”)复合文字,因此语法是:

    CompositeLit = LiteralType LiteralValue .

    但是当你指定一个 map 复合字面量时,key 和 value 的类型是从 map 类型中知道的,因此如果你打算指定这些类型的值,则可以省略。 Spec: Composite literals:中提到了这一点

    在数组、切片或映射类型T 的复合字面量中,如果它们与T 的元素或键类型相同,则本身是复合字面量的元素或映射键可以省略相应的字面量类型。类似地,当元素或键类型为 *T 时,作为复合文字地址的元素或键可以省略 &T

    (注:due to an oversight, this is only valid from Go 1.5.)

    【讨论】:

    • 这个答案也有助于理解警告redundant type from array, slice, or map composite
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 2014-10-21
    • 2013-04-18
    • 2020-10-28
    • 2018-03-28
    • 2015-02-23
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多