【发布时间】:2011-10-25 21:58:03
【问题描述】:
在 python 中是否有任何类似于 'Set' 的 Go 集合?
替代方案:
- 有在 Go 中实现 Set 的简单方法吗?
- 有什么方法可以消除切片中的重复项吗?
【问题讨论】:
标签: collections set go
在 python 中是否有任何类似于 'Set' 的 Go 集合?
替代方案:
【问题讨论】:
标签: collections set go
您可以只拥有一个map[whatevertype]bool 并将值设置为true。您可以将切片中的每个元素添加为映射键,然后使用 range 仅取出唯一的元素。
package main
import "fmt"
func main() {
m := make(map[string]bool)
s := make([]string, 0)
s = append(s, "foo")
s = append(s, "foo")
s = append(s, "foo")
s = append(s, "bar")
s = append(s, "bar")
for _, r := range s {
m[r] = true
}
s = make([]string, 0)
for k, _ := range m {
s = append(s, k)
}
fmt.Printf("%v\n", s)
}
【讨论】:
bool总是设置为true有一个额外的好处是能够简单地通过索引来测试一个元素是否存在,因为当你索引一个键并且它不存在时,它将返回值类型的零值,这对于布尔值是错误的。
我认为map[T]bool 是最好的选择,但另一个选择是
map[T]struct{}:
package main
func main() {
{ // example 1
s := make(map[string]struct{})
s["north"] = struct{}{}
s["south"] = struct{}{}
_, ok := s["north"]
println(ok)
}
{ // example 2
s := map[string]struct{}{
"north": {}, "south": {},
}
_, ok := s["north"]
println(ok)
}
}
使用起来并不容易,但如果这对您来说是一个因素,它占用的内存更少。
【讨论】:
目前在 golang 中没有 set 实现。您需要自己做或获得第三方库。这里还有一篇不错的博文:
http://openmymind.net/2011/7/15/Learning-Go-By-Benchmarking-Set-Implementation
【讨论】: