这篇文章涵盖了Go语言中Set数据结构的实现及实例
如何在Golang中创建一个Set?
Set是一个一般的数据结构,包含元素的集合,不允许有重复的元素。一些编程语言如java有内置的Set支持。
在编程语言中,Set是一种计算机数据结构,实现了数学上最好的概念。一般来说,Set是一个无序的列表,没有重复的。在Golang中,我们可以使用Map类型来实现Set类型。
你可以使用Map 类型来实现set 。
Golang没有内置的对set 的支持,因为没有可用的泛型。我们可以写一个自定义代码来写一个 Map 实现。
语法
var myset map[type]struct{} or
var myset map[type]bool
我们可以使用map[type]struct{}而不是map[type]bool,原因是空的struct需要0字节,bool在内存中需要1字节的大小。
关键是你要创建的数据的类型
Struct{} 是空结构的大小为0字节
和其他数据结构一样,集合也可以进行操作--创建一个集合,遍历这些元素,添加元素,删除元素,清除集合,集合的大小,检查元素在集合中的存在。
我们将看到一个集合的基本功能
- 创建和声明一个集合
例如,让我们创建一个接受字符串值的空集合
s1 := make(map[string]struct{})
这是一个空的集合,它有字符串的键和空的结构--struct{}。
您可以使用添加元素到地图的语法将元素添加到集合中,地图声明一个空结构,将其作为集合地图中的一个值,键为字符串。
var empty = struct{}{}
s1["one"] = empty
s1["two"] = empty
s1["three"] = empty
fmt.Println(s1) // map[three:{} one:{} two:{}]
fmt.Println(len(s1)) // 3
上面的代码向集合中添加了三个元素 一旦数据被添加到集合中,我们将看到迭代
- 集合元素的迭代
你可以使用带有范围形式的for循环来迭代一个集合的元素。
for v := range s1 {
fmt.Println(v)
}
当你多次运行上述代码时,元素的顺序是不确定的,输出如下
- 检查元素是否存在于一个集合中
我们可以使用两个值的表达式来检查一个集合中的元素,使用从map中获取的项目
这将返回两个值,第一个值是空结构,不是必须的,所以用空白标识符(_)代替,第二个参数是一个布尔值--如果存在,返回ok=true,如果不存在,返回ok=false。
if _, ok := s1["one"]; ok {
fmt.Println("exists in a set ") // Element exists
}
if _, ok := s1["ten"]; ok {
fmt.Println("Not exists in a set.") // Element not exists
}
输出结果是
exists in a set
- 删除一个集合中的一个元素
你可以使用map的delete()函数来删除一个集合中的元素。
delete(s1, "one")
fmt.Println(len(s1)) // 2
集合实例 - 基本操作
下面是一个完整的集合实例,包括所有的基本操作
package main
import (
"fmt"
)
func main() {
s1 := make(map[string]struct{})
fmt.Println(s1) // map[]
//Adding elements to Set
var empty = struct{}{}
s1["one"] = empty
s1["two"] = empty
s1["three"] = empty
fmt.Println(s1) // map[three:{} one:{} two:{}]
fmt.Println(len(s1)) // 3
for v := range s1 {
fmt.Println(v)
}
if _, ok := s1["one"]; ok {
fmt.Println("exists in a set ") // Element exists
}
if _, ok := s1["ten"]; ok {
fmt.Println("Not exists in a set.") // Element not exists
}
delete(s1, "one")
fmt.Println(len(s1)) // 2
}
输出是
map[]
map[two:{} three:{} one:{}]
3
one
two
three
exists in a set
2