几个月前,当我第一次开始研究Go时,我问了这个问题。从那时起,我每天都在阅读有关Go的内容,并在Go中进行编码。
因为我没有收到关于该问题的明确答案(尽管我已经接受了一个答案),所以我现在要根据我所学到的知识自行回答,因为我已经问过:
有没有一种方法可以在没有硬编码数组大小的情况下在Go中创建数组/切片?
是。切片不需要硬编码数组即可slice
从:
var sl []int = make([]int,len,cap)
此代码分配slice sl
,其大小len
为cap
-,len
并且cap
是可以在运行时分配的变量。
为什么被list.List
忽略?
看来list.List
在Go中很少引起注意的主要原因是:
正如@Nick Craig-Wood的答案中所解释的那样,对于列表而言,用切片无法完成的事情几乎是无法完成的,通常更高效,更简洁,更优雅的语法也无法做到。例如范围构造:
for i:=range sl {
sl[i]=i
}
不能与列表一起使用-需要C样式的循环。而且在许多情况下,C ++集合样式语法必须与列表一起使用:
push_back
等。
也许更重要的是,list.List
它不是强类型的-它与Python的列表和字典非常相似,后者允许将集合中的各种类型混合在一起。这似乎与Go的处理方法背道而驰。Go是一种非常强类型化的语言-例如,Go从未允许隐式类型转换,即使upCast从int
to也int64
必须是显式的。但是list.List的所有方法都采用空接口-任何事情都会发生。
我放弃Python并转而使用Go的原因之一是由于Python的类型系统中的这种弱点,尽管Python声称是“强类型”的(IMO并非如此)。Golist.List
似乎是一种“杂种”,由C ++vector<T>
和Python产生
List()
,并且在Go本身中可能有点不合适。
如果在不远的将来的某个时刻找到list,这也不会令我感到惊讶。Go中不推荐使用list,尽管它可能会保留下来,以容纳 稀有的东西。情况,即使使用良好的设计实践,也可以最好地解决问题与拥有各种类型的集合。或者,它可以为C系列开发人员提供一个“桥梁”,让他们在了解切片的细微差别之前熟悉Go,AFAIK是Go特有的。(在某些方面,切片似乎与C ++或Delphi中的流类相似,但不完全相同。)
尽管来自Delphi / C ++ / Python背景,但在初次接触Go时,我发现list.List
自己比Go的slice更熟悉,因为我对Go越来越熟悉,所以我回去并将所有列表更改为slice。我还没有发现任何东西slice
和/或map
不允许我这样做,所以我需要使用list.List
。
list
类型不是使用链表实现的:它的行为类似于Go切片,偶尔需要扩展数据副本。