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

将一个元素附加到零切片将容量增加两个

岳允晨
2023-03-14
问题内容

我有零片:

var s1 []int // len(s1) == 0, cap(s1) == 0

我在其中添加一个元素:

s2 := append(s1, 1) // len(s2) == 1, cap(s2) == 2

为什么在一个nil slice上附加一个元素会使容量增加2?

使用来打印切片fmt.Printf显示以下内容:

[] // s1
[1] // s2

我也很困惑为什么重新切片会s2[0:2]显示一个零,该零既不在原始切片中也不附加在原始切片上:

[1,0] // s2[0:2]

问题答案:

Go可以免费为您提供超出您要求的容量。通过减少所需的分配(可以复制)数量来提高性能。容量只是在需要另一分配之前保留的空间量。

如果至少在我的实验中将5个元素添加到此片中,则容量为8。这并不奇怪,但也不应依赖。在不同平台或不同版本的编译器上,只要容量“足够大”(等于或大于长度),实际结果就可能不同。

切片的上索引上限定义为其容量:

对于数组或字符串,如果0 <=低<=高<=
len(a),则索引在范围内,否则它们超出范围。对于切片,索引的上限是切片容量cap(a)而不是长度。常数索引必须是非负数,并且可以由int类型的值表示;对于数组或常量字符串,常量索引也必须在范围内。如果两个索引都恒定,则它们必须满足低<=高。如果索引在运行时超出范围,则会发生运行时恐慌。

这就是为什么阅读超过长度不会引起恐慌的原因。即使这样,您也不应将这些零视为切片的一部分。它们可通过切片索引,但fmt.Printf(s2)由于它们不属于切片,因此无法正确显示它们。不要这样下标。

通常,您要查看的是长度而不是容量。大部分容量都是可读的,以帮助优化性能。



 类似资料:
  • 问题内容: Go编译器抱怨我的代码将切片附加到切片。以下是相关摘录: 该行生成以下编译器消息: 我知道,根据Go Blog帖子中 标题为Append:the Built-in function 一节下的示例,将切片追加到切片会很好。 问题答案: 您需要使用: 另外,还请格式化您的代码:) 您还应该阅读Wiki上的Slice Tricks。

  • 问题内容: 我需要一种无需使用innerHTML即可将HTML附加到容器元素的方法。我不想使用innerHTML的原因是因为当使用这样的内容时: 它的工作原理是先添加所有html,然后再添加旧html和新html。这不好,因为它会重置动态媒体,例如嵌入式Flash视频… 我可以通过这种方式工作: 但是,这种方式的问题是我现在不想在文档中有多余的span标签。 那怎么办呢?谢谢! 问题答案: 给出一

  • 问题内容: 我在做下面的运动。 创建一个包含四个元素的切片。 创建一个新切片,并将第三个和第四个元素仅复制到其中。 我已经返回了以下程序 我程序的输出是。但我希望newElements切片为[3 4]- 我的程序出了什么问题。 问题答案: 使用内置的复制功能将元素从一个切片复制到另一个切片。 在操场上跑 您可以使用append创建切片并在单个语句中复制元素,但是代码并不像使用copy那样明显。 在

  • 我想以无原子锁的方式使用ConcurrentLinkedQueue: 几个并发线程将事件推送到队列中,其他一些线程将处理它们。队列没有绑定,我不希望任何线程等待或被锁定。然而,阅读部分可能会注意到队列变空了。在无锁实现中,读取线程不能阻塞,只能结束其任务并继续执行其他任务(即作为ExecutorService)。因此,将第一个新事件推送到空队列中的写入程序必须知道它,并且应该重新启动读取器(即,通

  • 问题内容: 我目前正在尝试在ArrayList中每个元素的末尾附加一个分号。 代码: 最终,我将获取此电子邮件地址列表,并将其输出到“收件人”字段以使用Java发送电子邮件。因此,为什么我要在元素后面加上分号以分隔电子邮件地址。 谢谢 问题答案: 假设您使用 Java 8 ,则可以使用with as收集器来 进行 操作,该收集器 允许按输入顺序将输入元素(由指定的定界符分隔)连接起来, 如下所示:

  • 问题内容: 假设我有一些要将JavaScript操作添加到的链接: 当页面加载时,我给他们所有的click事件: 但让我们说之后,我添加了另一个元素,但我想给它相同的事件。我不能这样做: 因为前三个事件将包含两个事件。处理此问题的最佳方法是什么? 问题答案: 您可以将$ .on绑定到这样的dom中始终存在的父元素。 请注意: 您可以用dom中将始终存在的元素的任何父级替换,并且父级越近越好。 具有