Go中使用Set
st := make(map[string]struct{})
// add element
st["hello"] = struct{}{}
这段代码包含了两行,分别是:
st := make(map[string]struct{})
和
st["hello"] = struct{}{}
我们一行一行地解析它们的含义:
1. st := make(map[string]struct{})
这一行代码的作用是创建一个空的 map
,其中 map
的键类型为 string
,值类型为 struct{}
(空结构体)。
解释:
-
make(map[string]struct{})
:make
是 Go 中的内建函数,用来分配内存并初始化某些数据结构。这里它初始化了一个map
,键的类型是string
,值的类型是struct{}
(一个没有字段的空结构体)。 -
map[string]struct{}
:这是一个映射(字典),其键是字符串类型(string
),值是空结构体类型(struct{}
)。空结构体(struct{}
)没有字段,因此它不占用任何内存,只是用来表示某个元素的存在性。我们通常利用它来模拟集合(set),因为它不存储数据,仅仅表示“键是否存在”。
因此,st
变量是一个空的 map
,它用来存储唯一的 string
键,并且不关心这些键的值(只关心它们是否存在)。这种用法在模拟集合(set
)时非常有用。
2. st["hello"] = struct{}{}
这一行代码的作用是向 map
中添加一个键值对,其中键是 "hello"
,值是一个空结构体 struct{}{}
。
解释:
-
st["hello"]
:这是对map
中键"hello"
的引用。通过这个操作,Go 会在map
中查找键"hello"
,如果它存在则更新值,如果不存在则添加该键值对。 -
struct{}{}
:这是一个空结构体的字面量。struct{}
是一种类型,它没有字段,不占用内存。在这里,struct{}{}
表示map
中键"hello"
对应的值。虽然这个值为空结构体,但它表示“存在”这一事实。
所以,st["hello"] = struct{}{}
的意思是:在 st
这个 map
中添加键 "hello"
,并将值设置为一个空结构体 struct{}{}
,表示 "hello"
这个键存在。由于空结构体没有实际内容,它只是用来表示键 "hello"
的存在性。
为什么要使用空结构体 struct{}{}
?
-
节省内存: 空结构体在 Go 中不占用任何内存空间(它的大小是 0 字节)。因此,当你不需要存储任何与键相关的额外数据时,可以使用空结构体来节省内存。
-
表示存在性: 使用
struct{}{}
作为值,意味着我们关心的是某个键是否存在,而不需要存储任何额外的信息。例如,在模拟集合时,map
中的每个键都是唯一的,空结构体的值只起到“存在”的标记作用。
代码总结:
st := make(map[string]struct{})
:创建了一个空的map
,它的键是字符串类型,值是空结构体类型,用来表示集合。st["hello"] = struct{}{}
:向这个map
中添加了一个键"hello"
,并将值设置为一个空结构体,表示键"hello"
存在。
通过这种方式,map
的键 "hello"
被添加到集合中,但不存储任何额外的信息,仅仅表示该键的存在性。这种方式常用于实现集合(set
)的功能。