gpt4 book ai didi

go - 将一个引用类型为 "slice"的变量赋值给另一个变量,为什么它们不同时变化?

转载 作者:IT王子 更新时间:2023-10-29 01:58:54 25 4
gpt4 key购买 nike

anotherSlice := theSlice
anotherSlice = append(anotherSlice, newEle)
fmt.Println(len(anotherSlice) == len(theSlice))

此代码段将输出 false。为什么?

还有一些其他的实验:

package main

import "fmt"

func main() {
theSlice := []int{3,3,2,5,12,43}
anotherSlice := theSlice
fmt.Println(anotherSlice[3], theSlice[3])
anotherSlice[3] = anotherSlice[3]+2
fmt.Println(anotherSlice[3], theSlice[3])
anotherSlice = append(anotherSlice[:3], anotherSlice[4:]...)
fmt.Println(len(anotherSlice),len(theSlice))
}

输出如下:

5 5
7 7
5 6

Program exited.

最佳答案

每当附加 slice anotherSlice 没有新元素的容量时,append 函数会创建新 slice 并返回它。从那时起, slice anotherSlicetheSlice 就不同了——它们由不同的数组支持。

用较短的长度 anotherSlice[:3] 重新 slice 对 slice 的原始容量没有影响。

下面一行:

anotherSlice = append(anotherSlice[:3], anotherSlice[4:]...)

删除第四个(索引 3)元素。因为 anotherSlice[:3] 有能力容纳 anotherSlice[4:] 的所有元素,所以没有新的分配发生,因此两个 slice 都被修改了。

package main

import (
"fmt"
)

func main() {
x := []int{1, 2, 3, 4, 5, 6}
fmt.Println(cap(x[:3]) >= len(x[:3])+len(x[4:]))
y := append(x[:3], x[4:]...)
fmt.Println(x, y)
}

Playground

关于go - 将一个引用类型为 "slice"的变量赋值给另一个变量,为什么它们不同时变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36890875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com