3 回答
TA贡献1887条经验 获得超5个赞
当您考虑列表时,几乎总是 - 在 Go 中使用切片代替。切片动态调整大小。它们的底层是一个可以改变大小的连续内存片。
这是摘录:
复制
b = make([]T, len(a))copy(b, a) // or b = append([]T(nil), a...)切
a = append(a[:i], a[j:]...)删除
a = append(a[:i], a[i+1:]...) // or a = a[:i+copy(a[i:], a[i+1:])]删除而不保留顺序
a[i], a = a[len(a)-1], a[:len(a)-1]流行音乐
x, a = a[len(a)-1], a[:len(a)-1]推
a = append(a, x)
TA贡献1844条经验 获得超8个赞
几个月前,当我第一次开始研究 Go 时,我问过这个问题。从那时起,我每天都在阅读有关 Go 的文章,并使用 Go 进行编码。
因为我没有得到这个问题的明确答案(虽然我已经接受了一个答案)我现在要根据我所学到的来回答这个问题,因为我问过它:
有没有办法在没有硬编码数组大小的情况下在 Go 中创建数组/切片?
是的。切片不需要硬编码数组即可slice:
var sl []int = make([]int,len,cap)
此代码分配容量为-sl大小的slice ,并且是可以在运行时分配的变量。lencaplencap
为什么被list.List忽略?
list.List在 Go 中似乎很少受到关注的主要原因是:
正如@Nick Craig-Wood 的回答中所解释的那样,使用切片无法完成的列表几乎没有任何事情可以完成,通常更有效,并且语法更简洁,更优雅。例如范围构造:
for i:=range sl {
sl[i]=i
}
不能与列表一起使用 - 需要 C 风格的 for 循环。并且在许多情况下,C++ 集合样式语法必须与列表一起使用: push_back等。
也许更重要的是,list.List它不是强类型的——它与 Python 的列表和字典非常相似,允许在集合中混合各种类型。这似乎与 Go 处理事物的方法背道而驰。Go 是一种非常强类型的语言——例如,Go 中从不允许隐式类型转换,即使是从intto的 upCast也int64必须是显式的。但是 list.List 的所有方法都采用空接口 - 任何事情都可以。
我放弃 Python 而转向 Go 的原因之一是因为 Python 类型系统的这种弱点,尽管 Python 声称是“强类型”(IMO 并非如此)。Golist.List似乎是一种“杂种”,诞生于 C++vector<T>和 Python 的 List(),并且在 Go 本身中可能有点格格不入。
如果在不久的将来的某个时候,我们发现 list.List 在 Go 中已被弃用,我不会感到惊讶,尽管它可能会保留,以适应那些即使使用良好的设计实践也能最好地解决问题的罕见情况拥有一个包含各种类型的集合。或者它可能为 C 系列开发人员提供一个“桥梁”,让他们在学习切片的细微差别之前熟悉 Go,AFAIK。(在某些方面,切片似乎类似于 C++ 或 Delphi 中的流类,但并非完全如此。)
虽然来自 Delphi/C++/Python 背景,但在我最初接触 Go 时,我发现list.List比 Go 的 slice 更熟悉,因为我对 Go 越来越熟悉,我回去将所有列表更改为 slice。我还没有发现任何东西slice和/或map不允许我这样做,所以我需要使用list.List.
- 3 回答
- 0 关注
- 233 浏览
添加回答
举报