Go语言之集合类型
在 Go 语言中,并没有像其他语言那样的集合类型,但是我们可以使用其他的方式来实现类似的功能。
- 使用
map
实现集合:
Go 语言中的 map
是一种内置的数据类型,它将一种类型的值映射到另一种类型的值。因此,我们可以使用 map
来实现集合的功能。
package main
import "fmt"
func main() {
// 使用map实现集合
mySet := make(map[string]bool)
// 添加元素
mySet["apple"] = true
mySet["banana"] = true
mySet["orange"] = true
// 删除元素
delete(mySet, "banana")
// 查看元素是否存在
_, exists := mySet["apple"]
fmt.Println("apple exists:", exists)
// 遍历集合
for elem := range mySet {
fmt.Println("Set element:", elem)
}
}
- 使用
struct
和map
实现集合:
除了使用 map
外,我们还可以使用结构体和 map
的组合来实现集合的功能。
package main
import (
"fmt"
)
type MySet struct {
data map[string]bool
}
func NewMySet() *MySet {
return &MySet{
data: make(map[string]bool),
}
}
func (set *MySet) Add(value string) {
if !set.data[value] {
set.data[value] = true
}
}
func (set *MySet) Remove(value string) {
delete(set.data, value)
}
func (set *MySet) Exists(value string) bool {
_, exists := set.data[value]
return exists
}
func (set *MySet) Len() int {
return len(set.data)
}
func main() {
mySet := NewMySet()
mySet.Add("apple")
mySet.Add("banana")
mySet.Add("orange")
fmt.Println("Set length:", mySet.Len())
fmt.Println("banana exists:", mySet.Exists("banana"))
mySet.Remove("banana")
fmt.Println("banana exists:", mySet.Exists("banana"))
}
- 使用
slice
实现集合:
我们也可以使用 slice
来实现集合的功能,但这种方式不推荐,因为 slice
是基于数组实现的,数组的大小是固定的,而集合的大小通常是可变的。
package main
import (
"fmt"
)
type MySet struct {
data []string
}
func NewMySet() *MySet {
return &MySet{
data: make([]string, 0),
}
}
func (set *MySet) Add(value string) {
for _, elem := range set.data {
if elem == value {
return
}
}
set.data = append(set.data, value)
}
func (set *MySet) Remove(value string) {
index := -1
for i, elem := range set.data {
if elem == value {
index = i
break
}
}
if index != -1 {
set.data = append(set.data[:index], set.data[index+1:]...)
}
}
func (set *MySet) Exists(value string) bool {
for _, elem := range set.data {
if elem == value {
return true
}
}
return false
}
评论已关闭