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

切片在GO中如何工作?

姬烨磊
2023-03-14
a = make([]int, 7, 15)

创建大小为15的隐式数组,并创建一个隐式数组的浅副本,指向数组中的前7个元素。

考虑

var a []int;

创建不指向任何隐式数组的零长度切片。

a = append(a, 9, 86);

创建长度为2的新隐式数组,并附加值986。slice(a)指向新的隐式数组,其中

len(a)是2cap(a)

我的问题:

这是正确的理解吗?


共有1个答案

瞿和硕
2023-03-14

正如我提到的“声明切片还是制作切片?”,切片的零值(nil)的作用类似于零长度切片。

因此,您可以直接附加到a[]int

仅当您希望潜在地返回空切片(而不是nil)时,才需要生成切片(make([]int,0)
如果没有,则无需在开始追加之前分配内存
另请参见“数组、片(和字符串)“‘附加’的机制”:Nil”

nil切片在功能上等同于零长度切片,即使它不指向任何内容。它的长度为零,可以通过分配追加到。

 类似资料:
  • 问题内容: 在Go中清除切片的适当方法是什么? 这是我在go论坛中找到的内容: 这样对吗? 为了澄清起见,清除了缓冲区,以便可以重用它。 一个示例是bytes包中的Buffer.Truncate函数。 请注意,Reset只是调用Truncate(0)。因此看来,在这种情况下,第70行将评估:b.buf = b.buf [0:0] http://golang.org/src/pkg/bytes/bu

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

  • 问题内容: mapArray是float32的2D切片。我对其进行了复制,因此 无需修改mapArray即可进行复制 。但是,事实并非如此。分配一个值进行修改。 这样做将使-1而不是其原始值。 如何制作切片的真实独立副本? 谢谢。 编辑: 问题答案: 2D切片是切片的切片。在您的函数中,您分配一个切片来容纳其他切片,然后为每个切片分配内存来容纳该行数据。要复制它,您需要复制所有这些数据行以及整个切

  • 我有一个结构片。 以下是此文件的输出: 如何搜索此数组以获取所在的元素?

  • 问题内容: 假设我有以下长度为3的整数数组: 然后我只抓了前两个项目 在这两种情况下,调用numSlice和nums都会产生3,分别产生2和3。 如果我随后附加到该slice(),则基础数组()现在为。两者的值均保持为3,因为切片的基础数组相同,并且切片的len现在为3。 但是,如果我再次追加到该片(),则该片的基础数组必须更改- 我们看到的情况是,现在numSlice增加了一倍,而len现在是4

  • 问题内容: 我正在尝试将切片和切片结合起来。如何在Go中执行此操作? 我试过了: 但得到: 但是,文档似乎表明这是可能的,我想念的是什么? 问题答案: 在第二个切片之后添加点: 就像任何其他可变参数函数一样。