为什么在切片上附加修改了另一个切片?

package main


import "fmt"


func main() {

    src := []int{0, 1, 2, 3, 4, 5, 6}

    a := src[:3]

    b := src[3:]

    a = append(a, 9)


    fmt.Println(a, b)

}

输出:


[0 1 2 9] [9 4 5 6]


append 是否将底层数组修改为 []int{0, 1, 2, 9, 4, 5, 6}?切片 a 被复制为具有值 [0, 1, 2, 9] 的新底层数组的新切片,切片 b 仍指向已修改的旧数组。


感谢您的任何提示,非常感谢


明月笑刀无情
浏览 49回答 1
1回答

千巷猫影

切片 a 被复制为具有值 [0, 1, 2, 9] 的新底层数组的新切片,切片 b 仍指向已修改的旧数组。a := src[:3]创建了一个切片(指向 src 头的指针,长度 = 3,容量 = 7)b := src[3:]创建了一个切片(指向 src[3] 的指针,长度 = 4,容量 = 4)a并b共享由srca = append(a, 9),追加到同一个slice时,只要不超过cap,就是修改的同一个数组append 是否将底层数组修改为 []int{0, 1, 2, 9, 4, 5, 6}是的如果append超过capof a,将分配新数组并将数据复制到新数组试试这个:package mainimport "fmt"func main() {    src := []int{0, 1, 2, 3, 4, 5, 6}    a := src[:3]    b := src[3:]    a = append(a, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9)    fmt.Println(a, b)}输出:[0 1 2 9 9 9 9 9 9 9 9 9 9] [3 4 5 6]
打开App,查看更多内容
随时随地看视频慕课网APP