func main(){
s1 := make([]int, 5)
fmt.Println(s1) // 输出 0,0,0,0,0
hello(s1)
fmt.Println(s1) // 输出 0,0,-5,0,0
}
func hello(s2 []int){
s2[2] = -5
}
问:为什么在函数内部修改s2会改变s1的元素?
答:虽然s1作为参数传递时是传递s1的副本,但是该副本中的底层数组还是原始s1的底层数组,s2的array和s1的array保存的内存地址依旧是同一个数组的首个元素的地址。
slice的底层实现是一个struct:
type slice struct{
array unsafe.Pointer
cap int
len int
}
当我们将slice作为参数传递时,参数slice的array保存的内存地址与原始slice中array保存的内存地址是相同的。所以修改s2的元素会影响到s1。
请看图: