golang为什么我们没有一套数据结构[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang为什么我们没有一套数据结构[关闭]相关的知识,希望对你有一定的参考价值。

我正在尝试解决“去编程语言”练习#1.4,这需要我有一套。我可以创建一个集合类型,但为什么语言没有附带? go,来自谷歌,guava也来自哪里,为什么语言设计师不选择添加对基础数据结构的支持?为什么强迫你的用户创建自己的实现为一个基本的集合?

答案

部分原因是因为Go没有泛型(所以你需要为每种类型设置一种类型,或者反复使用反射,这是相当低效的)。

部分地,因为如果您只需要“添加/删除单个元素到一个集合”和“相对节省空间”,您可以通过使用map[yourtype]bool(并将值设置为true)来获得相当多的元素。设置)或者,为了提高空间效率,您可以使用空结构作为值,并使用_, present = the_setoid[key]检查是否存在。

另一答案

一个原因是从地图创建集合很容易:

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
  }
}

实现所有其他设置操作并不是那么难。

另一答案

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

另一答案

就像Vatine写道:由于缺乏泛型,它必须是语言的一部分而不是标准库。为此你必须用关键字集,联合,交集,差异,子集污染语言......

另一个原因是,根本不清楚集合的“正确”实现是什么:

  1. 有一种功能方法: func IsInEvenNumbers(n int) bool { if n % 2 == 0 { return true } return false }

这是一组甚至整数。它具有非常高效的查找和联合,交叉,差异和子集可以通过功能组合轻松完成。

  1. 或者你像达利一样表现出类似的方式。

地图没有这个问题,因为您存储了与该值相关联的内容。

以上是关于golang为什么我们没有一套数据结构[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

golang: 常用数据类型底层结构分析

golang: 常用数据类型底层结构分析

有没有办法在接口 [Golang] 中传递多个参数? [关闭]

如何基于Golang设计一套微服务架构

GoLanggolang底层数据类型实现原理

golang 连接、操作完mysql, 对mysql的连接会自动关闭,还是必须要手动关闭?