当前位置: 首页 > 面试题库 >

为什么Go中不经常使用列表?

翟鹏
2023-03-14
问题内容

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

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

看来,与Python不同,RangeList不支持Python,这是IMO的一大缺陷。我想念什么吗?

切片当然不错,但是它们仍然需要基于具有硬编码大小的数组。这就是List出现的地方。有没有一种方法可以在Go中创建数组/切片,而无需使用硬编码的数组大小?为什么列表被忽略?


问题答案:

几个月前,当我第一次开始研究Go时,我问了这个问题。从那时起,我每天都在阅读有关Go的内容,并在Go中进行编码。

因为我没有收到关于该问题的明确答案(尽管我已经接受了一个答案),所以我现在要根据我所学到的内容自行回答,因为我已经问过:

有没有一种方法可以在没有硬编码数组大小的情况下在Go中创建数组/切片?

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

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

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

为什么被list.List忽略?

list.List似乎在Go中很少引起注意的主要原因是:

  • 正如@Nick Craig-Wood的答案中所解释的那样,对于列表而言,用切片无法完成的事情几乎是无法完成的,通常更有效,更简洁,更优雅的语法也无法做到。例如范围构造:
    for i:=range sl {
    

    sl[i]=i
    }

不能与list一起使用-需要C样式的for循环。而且在许多情况下,C ++集合样式语法必须与list:push_back等一起使用 。

  • 也许更重要的是,list.List它不是强类型的-它与Python的列表和字典非常相似,后者允许将集合中的各种类型混合在一起。这似乎与Go的处理方法背道而驰。Go是一种非常强类型化的语言-例如,Go从未允许隐式类型转换,即使upCast从intto也int64必须是显式的。但是list.List的所有方法都采用空接口-任何事情都会发生。

我放弃Python并转而使用Go的原因之一是由于Python的类型系统中的这种弱点,尽​​管Python声称自己是“强类型”(IMO并非如此)。Go
list.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



 类似资料:
  • 问题内容: 这与为什么为什么不接受(&)映射成员的地址而允许(&)slice元素相同?但我对接受的答案不满意:“切片由后备数组支持,而映射则不支持。” 注意:现在,我已对上面提到的问题添加了自己的答案。 Map中的Access Struct问题(不带复制)甚至更好,但是它被接受的答案是您不能修改map中的struct值字段,因为您无法获取其地址(这是我的问题)。 就像切片一样,映射由内存结构(可能

  • 问题内容: 在Go中,有可能等同于或取决于系统架构的类型。我可以声明一个整数变量而不必担心它的大小: 为什么没有type ,它等于或取决于我的系统的体系结构?我希望我也可以: 问题答案: float已在版本2011/01/20中删除。 您仍然可以使用简短的变量声明: 但正如GO常见问题解答所述: 出于可移植性的原因,我们决定以代码中的一些显式转换为代价,使事情变得清晰明了。 您可以在以下主题中查看

  • 问题内容: 我有一个http客户端,可以创建与主机的多个连接。我想设置它可以设置到特定主机的最大连接数。go的request.Transport中没有此类选项。我的代码看起来像 我希望这会创建1个连接。正如我在for循环中所说的那样。但这一直在创建无限数量的连接。 使用请求库的类似python代码仅创建一个连接。 由于某种原因,go代码没有重用http连接。 编辑:go代码需要关闭主体才能重用连接

  • 问题内容: The Go Playground上可用的程序读取 并产生一个错误 我了解是字符串的“零值”。我不明白为什么我不能分配给我的。 问题答案: 简单的答案是, 在语言规范中未将其定义为类型的有效值。 …但是也许您想要更长的答案? 是指针,接口,通道,切片,映射和函数类型的零值,它表示 未初始化的 状态。 考虑以下变量声明: 所有这些变量都有一个代表未初始化状态的值,这很自然。已被声明为指针

  • 问题内容: 对于什么可以/不能用作python dict的键,我有些困惑。 因此,元组是不可变的类型,但是如果我在其中隐藏一个列表,那么它就不能成为键。.我不能像在模块内部一样轻松地隐藏一个列表吗? 我有一个模糊的想法,认为密钥必须是“可哈希的”,但是我只是承认自己对技术细节的无知。我不知道这里到底发生了什么。如果您尝试使用列表作为键,而将哈希作为其存储位置,那会出什么问题呢? 问题答案: Pyt

  • 问题内容: 我正在阅读Caleb Doxsey的Go书,我对http://www.golang-book.com/4有两个疑问 我想知道为什么在第二个Scanf之后程序没有停止并等待用户输入?以及如何测试用户是否输入了整数和/或没有留空? 问题答案: 这是发行5391::拒绝在Windows上线的末端。 作为一种解决方法,要检查输入是否有效,请编写, 和 解决方法是格式字符串中的换行符。 包 功能