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

java - GO切片问题:一个切片从中间删除用另外一个变量接收原切片值变化的原理是啥?

景胜涝
2024-03-19

一个go切片的问题

    var i = 3    nums := []int{1, 2, 3, 4, 5, 6}    nums6 := append(nums[:i], nums[i+2:]...)    fmt.Println(nums, nums6)

这段代码nums 最终输出为什么变成了[1,2,3,6,5,6]
输出内容为:// [1 2 3 6 5 6] [1 2 3 6]
看这个输入nums应该是改动了,但是为什么5,6又还在呢

共有1个答案

华锦程
2024-03-19

在 Go 语言中,切片是对底层数组的引用,而不是对底层数组的一个副本。这意味着当你创建一个新的切片时,如果你没有创建新的底层数组,那么新的切片和原来的切片会共享同一个底层数组。

现在,让我们分析你提供的代码:

var i = 3nums := []int{1, 2, 3, 4, 5, 6}nums6 := append(nums[:i], nums[i+2:]...)fmt.Println(nums, nums6)
  1. nums 是一个包含 6 个整数的切片。
  2. i 被设置为 3。
  3. nums6 是通过 append 函数创建的,该函数将 nums 切片的前 i 个元素(即 nums[:i])和从 i+2 开始到 nums 结尾的所有元素(即 nums[i+2:])合并到一个新的切片中。

这里的关键是 append 函数如何工作。在 Go 中,append 函数可能会重新分配底层数组,特别是当切片没有足够的容量来容纳额外的元素时。但是,在你的例子中,nums[:i]nums[i+2:] 都没有超出 nums 的容量,所以 append 函数不需要重新分配底层数组。

因此,nums6 切片和 nums 切片共享同一个底层数组。当你修改 nums 切片时(在这个例子中是 nums[i] = 6),你实际上是在修改两个切片共享的底层数组。

最终,当你打印 numsnums6 时,你会看到 nums 的值已经被改变,因为它和 nums6 共享同一个底层数组。

为了避免这种情况,你可以在创建 nums6 时创建一个新的底层数组,如下所示:

nums6 := append([]int{}, nums[:i]...)nums6 = append(nums6, nums[i+2:]...)

这样,nums6 会有一个独立的底层数组,对 nums6 的修改不会影响 nums

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

  • 我想把一个切片的末尾写到同一个切片的顶部。 我见过如何在锈菌阵列的两个可变切片上操作 我希望获得尽可能高的性能(例如,通过使用)。

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

  • 我正在尝试组合切片和切片。我怎么能在围棋中做到这一点? 我试过: 但是得到: 然而,文档似乎表明这是可能的,我遗漏了什么?

  • 本文向大家介绍tensorflow从张量中提取一个切片,包括了tensorflow从张量中提取一个切片的使用技巧和注意事项,需要的朋友参考一下 示例 请参阅文档以获取详细信息。tf.slice(input, begin, size) 参数: input:张量 begin:每个维度的起始位置 input size:的每个维度的元素数input,使用-1包括所有剩余元素 块状切片: 使用负索引,检索第

  • 问题内容: 我是Go编程的新手。我已经阅读了Go编程书籍,其中的内容由三部分组成:指向数组的指针,长度和容量。 我对nil slices(切片没有指向len的下层数组,len = 0,cap = 0),非lens切片(其中只有len = 0,cap = 0)和空切片之间感到困惑。 谁能告诉我nil和空片是否相同?如果两者都不相同,那么请说出两者之间的区别是什么? 如何测试切片是否为空? 另外,指针