为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
明月笑刀无情 2022-11-08 15:17:01
package mainimport "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 仍指向已修改的旧数组。感谢您的任何提示,非常感谢
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

切片 a 被复制为具有值 [0, 1, 2, 9] 的新底层数组的新切片,切片 b 仍指向已修改的旧数组。

a := src[:3]创建了一个切片(指向 src 头的指针,长度 = 3,容量 = 7)

b := src[3:]创建了一个切片(指向 src[3] 的指针,长度 = 4,容量 = 4)

a并b共享由src

a = append(a, 9),追加到同一个slice时,只要不超过cap,就是修改的同一个数组

append 是否将底层数组修改为 []int{0, 1, 2, 9, 4, 5, 6}

是的


如果append超过capof a,将分配新数组并将数据复制到新数组


试试这个:


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, 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]


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 48 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信