Golang 切片与函数参数“陷阱”

人世间 ·
你好: 我想提一个疑问,copy函数在复制时,应该并不关心底层数组。像您上面的例子slice4 := make([]int, len(slice2)) copy(slice4, slice2),此时slice4是通过make函数创建出来的切片,底层肯定是一个新的匿名数组,所以,对slice1的修改不会影响到slice4。 但是如果: <pre><code> var s1 = []int{1, 2, 3} var s3 = s1[0:2] copy(s3, s1) fmt.Printf("s1:%v, %p, s3:%v, %p\n", s1, &s1, s3, &s3) s3[0] = 10 fmt.Printf("s1:%v, %p, s3:%v, %p\n", s1, &s1, s3, &s3) </code></pre> 此时s3是基于s1创建的切片,对s3的复制操作后,对s3重新赋值,仍然会影响到s1。 输出: <pre><code> s1:[10 5 3], 0xc00006c020, s3:[10 5], 0xc000094000 </code></pre> 请您指正哈~
#1
更多评论
你的思路错了,并不是copy不关心底层数组,而是copy无关“作为参数的两个切片是否共享底层数组”。 第一个例子中,因为slice4是你通过make新建的,所以是在底层重新分配的数组,不和slice2共享底层数组。 第二个例子中,s3你并没有通过make新建,而是直接在s1上切出来的,所以s3是共享s1底层的数组的,因此对s3的操作可能影响到s1。
#2