struct {}和struct {} {}如何在Go中工作?

时间:2017-07-15 21:29:43

标签: go struct syntax

我想知道Go中的“struct {}”和“struct {} {}”是什么意思?一个例子如下:

array[index] = struct{}{}

make(map[type]struct{})

2 个答案:

答案 0 :(得分:13)

Go中的{p> structkeyword。它用于定义struct types,它是一系列命名元素。

例如:

type Person struct {
    Name string
    Age  int
}

struct{}struct类型,零元素。它通常在没有信息存储时使用。它具有0大小的优点,因此通常不需要内存来存储struct{}类型的值。

另一方面,

struct{}{}composite literal,它构造了struct{}类型的值。复合文字构造类型的值,例如结构,数组,映射和切片。它的语法是大括号中的元素后跟的类型。由于“空”结构(struct{})没有字段,因此元素列表也是空的:

 struct{}  {}
|  ^     | ^
  type     empty element list

作为一个例子,让我们在Go中创建一个“集合”。 Go没有内置集数据结构,但它有内置映射。我们可以使用地图作为集合,因为地图最多只能有一个具有给定键的条目。由于我们只想在地图中存储键(元素),因此我们可以选择地图值类型为struct{}

包含string元素的地图:

var set map[string]struct{}
// Initialize the set
set = make(map[string]struct{})

// Add some values to the set:
set["red"] = struct{}{}
set["blue"] = struct{}{}

// Check if a value is in the map:
_, ok := set["red"]
fmt.Println("Is red in the map?", ok)
_, ok = set["green"]
fmt.Println("Is green in the map?", ok)

输出(在Go Playground上尝试):

Is red in the map? true
Is green in the map? false

请注意,在创建地图集时使用bool作为值类型可能更方便,因为检查元素是否在其中的语法更简单。有关详细信息,请参阅How can I create an array that contains unique strings?

答案 1 :(得分:3)

正如izca所指出的那样:

Struct是一个go关键字,用于定义结构类型,结构类型只是用户定义的类型,由您决定的任意类型的变量组成。

type Person struct {
    Name string
    Age  int
}

使用Zero元素,结构也可以为空。 然而,Struct {} {}具有不同的含义。这是一个复合结构文字。它内联定义了一个结构类型并定义了一个结构并且没有赋予任何属性。

emptyStruct := Struct{} // This is an illegal operation
// you define an inline struct literal with no types
// the same is true for the following

car := struct{
          Speed  int
          Weight float
       }
// you define a struct be do now create an instance and assign it to car
// the following however is completely valid

car2 := struct{
          Speed  int
          Weight float
       }{6, 7.1}

//car2 now has a Speed of 6 and Weight of 7.1

这一行只是创建一个空结构文字的地图,这是完全合法的。

make(map[type]struct{})

相同
make(map[type]struct{
        x int
        y int
     })