当前位置: 首页 > 知识库问答 >
问题:

为什么Go切片不只是在重新分配时切换底层数组?

端木兴国
2023-03-14

切片包含三个组件:长度、容量和指向底层数组的指针。

当我们尝试将追加到一个满的切片(len(s)==cap(s))时,将分配一个更大的数组。

我在一本书中读到,我们必须将append的返回值分配回切片,因为由于底层数组的重新分配,可能会返回不同的切片。

runes=append(runes,r)

但我不知道为什么这是必要的。我们不能重新分配一个新数组并更新原始切片实例的指针吗?


共有1个答案

乐正焕
2023-03-14

所有函数参数都在Go中按值传递。函数无法更改调用方的值。

切片(长度、容量、指针)按值传递给append函数。由于append无法更改调用方的切片,因此append函数返回新切片。

append函数可以编写为获取指向切片的指针,但这会使append在切片值不可寻址的许多情况下难以使用。

 类似资料:
  • 我对切片中的数组感到非常困惑。代码发布在下面。 我知道test()从main()获取arr的副本,test()中的“append”不会分配新数组,因为cap 但是,测试片arr[]和主片arr[]中的底层数组似乎不同,因为它们的地址不同。 另一方面,test()中的append操作会修改main()中的基础数组,因为在打印主切片的基础数组时会出现一个新的1。此外,test()能够设置arr[0]=

  • 问题内容: 在阅读Go slice时,我在方法的上下文中遇到了此行为 如果s的后备数组太小而无法容纳所有给定值,则会分配更大的数组。返回的切片将指向新分配的数组。 来源-高朗之旅 为了理解这一点,我编写了以下代码: 尝试去游乐场 输出: 我希望并指向相同的基础数组,因为它们都是相同长度的切片 但是如果我将相同的代码用于另一片切片: 尝试去游乐场 输出: 在这种情况下,与他们再次同长度的片,但他们不

  • 问题内容: 这似乎是这将是整个interwebs一个相当普遍的事情,丰富的实例,但我似乎无法找到如何将一个转换的例子来。 我有一个从外部lib调用的函数,该函数返回一个数组 然后,我需要将该结果传递给其他函数以进行进一步处理。 不幸的是,如果我尝试致电 我懂了 在做 好多了。我该怎么做,尤其是在不创建数据副本的情况下(当我正在做的事情是传递数据时,似乎很愚蠢地复制该数据)。 问题答案: 这应该工作

  • 问题内容: 我一直在阅读Go,并为这个基本问题感到困惑。 在Go中,很明显,切片更灵活,并且在需要一系列数据时通常可以代替数组使用。 阅读了大多数文档,他们似乎鼓励开发人员只使用切片而不是数组。我得到的印象是,创建者可以简单地将数组设计为可调整大小的,而无需整个切片部分即可完成。实际上,这样的设计会使该语言更易于理解,甚至鼓励使用更多惯用的代码。 那么,为什么创建者首先要允许数组呢?什么时候可以使

  • 问题内容: Swift中的切片是什么,它与数组有何不同? 从文档中,下标(Range)的类型签名为: 为什么不返回另一个而不是一个? 看起来我可以将切片与数组连接起来: 但这会产生错误: 无法找到接受提供的参数的“下标”的重载 什么是切片? 问题答案: 切片指向数组。当数组已经存在并且切片只能描述其所需部分时,再也没有必要制作另一个数组。 加法会导致隐式强制,因此可以正常工作。为了使您的作业正常进

  • 切片是Go语言的关键类型之一,它提供了比数组更多的功能。 示例1: package main import "fmt" func main() { // 和数组不同的是,切片的长度是可变的。 // 我们可以使用内置函数make来创建一个长度不为零的切片 // 这里我们创建了一个长度为3,存储字符串的切片,切片元素 // 默认为零值,对于字符串就是""。 s