一尘不染

为什么列表在 Go 中很少使用?

go

我是 Go 的新手,对此非常兴奋。但是,在我广泛使用的所有语言中:Delphi、C#、C++、Python - 列表非常重要,因为它们可以动态调整大小,而不是数组。

在 Golang 中确实有一个list.List结构体,但我很少看到关于它的文档——无论是在Go By Example还是我拥有的三本 Go 书籍——Summerfield、Chisnal 和 Balbaert——他们都花了很多时间在数组和切片上,然后跳到地图。在源代码示例中,我也发现很少或根本没有使用list.List.

似乎与 Python 不同的Range是,List 不支持 - IMO 的一大缺点。我错过了什么吗?

切片当然很好,但它们仍然需要基于具有硬编码大小的数组。这就是 List 的用武之地。有没有办法在没有硬编码数组大小的情况下在 Go 中创建数组/切片?为什么列表会被忽略?


阅读 302

收藏
2021-12-06

共2个答案

一尘不染

我是 Go 的新手,对此非常兴奋。但是,在我广泛使用的所有语言中:Delphi、C#、C++、Python - 列表非常重要,因为它们可以动态调整大小,而不是数组。

在 Golang 中确实有一个list.List结构体,但我很少看到关于它的文档——无论是在Go By Example还是我拥有的三本 Go 书籍——Summerfield、Chisnal 和 Balbaert——他们都花了很多时间在数组和切片上,然后跳到地图。在源代码示例中,我也发现很少或根本没有使用list.List.

似乎与 Python 不同的Range是,List 不支持 - IMO 的一大缺点。我错过了什么吗?

切片当然很好,但它们仍然需要基于具有硬编码大小的数组。这就是 List 的用武之地。有没有办法在没有硬编码数组大小的情况下在 Go 中创建数组/切片?为什么列表会被忽略?

2021-12-06
一尘不染

几个月前,当我第一次开始研究 Go 时,我问过这个问题。从那以后,我每天都在阅读有关 Go 的文章,并使用 Go 进行编码。

因为我没有收到这个问题的明确答案(虽然我已经接受了一个答案)我现在要根据我所学到的来自己回答,因为我问过它:

有没有办法在没有硬编码数组大小的情况下在 Go 中创建数组/切片?

是的。切片不需要硬编码数组即可slice

var sl []int = make([]int,len,cap)

此代码分配容量为-sl大小的slice ,并且是可以在运行时分配的变量。len``cap``len``cap

为什么被list.List忽略?

list.List在 Go 中似乎很少受到关注的主要原因是:

  • 正如@Nick Craig-Wood 的回答中所解释的那样,使用切片无法完成的列表几乎没有任何事情可以完成,而且通常更有效且语法更简洁、更优雅。例如范围构造:

golang 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.

2021-12-06