一个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又还在呢
在 Go 语言中,切片是对底层数组的引用,而不是对底层数组的一个副本。这意味着当你创建一个新的切片时,如果你没有创建新的底层数组,那么新的切片和原来的切片会共享同一个底层数组。
现在,让我们分析你提供的代码:
var i = 3nums := []int{1, 2, 3, 4, 5, 6}nums6 := append(nums[:i], nums[i+2:]...)fmt.Println(nums, nums6)
nums
是一个包含 6 个整数的切片。i
被设置为 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
),你实际上是在修改两个切片共享的底层数组。
最终,当你打印 nums
和 nums6
时,你会看到 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和空片是否相同?如果两者都不相同,那么请说出两者之间的区别是什么? 如何测试切片是否为空? 另外,指针