GO 调用切片append后导致原切片数据异常,什么原理?

新手上路,请多包涵

image.png
如图:
这个5是怎么出现的
代码:
func rangeList() {

c := [3]int{1, 2, 3}
d := []int{4, 5}
e := append(c[:], d...)
fmt.Printf("e: %p\n", &e)
fmt.Println(e)
i := 2
e1 := e[:i]
fmt.Printf("e1: %p\n", &e1)
fmt.Println(e1)

f := append(e1, e[i+1:]...)
fmt.Printf("f: %p\n", &f)
fmt.Println(f)

fmt.Printf("e: %p\n", &e)
fmt.Println(e)

}

阅读 3.4k
2 个回答

e1是从e来的,容量是5,所以append(e1, e[i+1:])不需要分配新的内存空间,直接修改了底层的内存了。所以最终ef的相同。为什么e1不是,因为受长度限制,实际上它们指向的内存是同一个,你可以试试fmt.Println(e1[:5])打印看看。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题