我试图解决"去编程语言"运动#1.4需要我一套。我可以创建一个集合类型,但为什么这个语言没有? go,来自谷歌,guava也来自哪里,为什么语言设计师不选择添加对基础数据结构的支持?为什么要强迫你的用户为像set这样基本的东西创建自己的实现呢?
答案 0 :(得分:57)
部分原因是因为Go没有泛型(所以你需要为每种类型设置一种类型,或者反复使用反射,这是相当低效的。)
部分原因,因为如果您只需要“添加/删除单个元素到一个集合”和“相对节省空间”,那么只需使用map[yourtype]bool
即可获得相当一部分(并设置对于集合中的任何元素,值为true
,或者,为了提高空间效率,可以使用空结构作为值,并使用_, present = the_setoid[key]
检查是否存在。
答案 1 :(得分:43)
一个原因是很容易从地图创建一个集合:
s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element
delete(s, 2) // remove element
联盟
s_union := map[int]bool{}
for k, _ := range s1{
s_union[k] = true
}
for k, _ := range s2{
s_union[k] = true
}
交叉口
s_intersection := map[int]bool{}
for k,_ := range s1 {
if s2[k] {
s_intersection[k] = true
}
}
实现所有其他设置操作并不是那么难。
答案 2 :(得分:4)
答案 3 :(得分:2)
像Vatine所写:由于缺乏泛型,它必须是语言的一部分而不是标准库。为此,您必须使用关键字set,union,intersection,difference,subset ...来污染语言。
另一个原因是,它根本不清楚"对"一组的实现是:
有一种功能性方法:
func IsInEvenNumbers(n int) bool {
if n % 2 == 0 {
return true
}
return false
}
这是一组甚至整数。它具有非常高效的查找和联合,交叉,差异和子集可以通过功能组合轻松完成。
地图没有这个问题,因为您存储了与该值相关联的内容。