golang为什么我们没有固定的数据结构

时间:2015-12-01 11:09:29

标签: data-structures go set

我试图解决"去编程语言"运动#1.4需要我一套。我可以创建一个集合类型,但为什么这个语言没有? go,来自谷歌,guava也来自哪里,为什么语言设计师不选择添加对基础数据结构的支持?为什么要强迫你的用户为像set这样基本的东西创建自己的实现呢?

4 个答案:

答案 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)

另一种可能性是使用至少有一个package的位集,或者您可以使用内置的big包。在这种情况下,基本上您需要定义一种将对象转换为索引的方法。

答案 3 :(得分:2)

像Vatine所写:由于缺乏泛型,它必须是语言的一部分而不是标准库。为此,您必须使用关键字set,union,intersection,difference,subset ...来污染语言。

另一个原因是,它根本不清楚"对"一组的实现是:

  1. 有一种功能性方法:

    func IsInEvenNumbers(n int) bool {
        if n % 2 == 0 {
            return true
        }
       return false
    }
    
  2. 这是一组甚至整数。它具有非常高效的查找和联合,交叉,差异和子集可以通过功能组合轻松完成。

    1. 或者你像Dali一样做了一个像我一样的方法。
    2. 地图没有这个问题,因为您存储了与该值相关联的内容。