golang在函数中对slice进行append操作不影响外部的值

Go语言中的函数传参是值传递,但当slice作为参数时,由于其包含底层数组的指针,对数组的修改可以反映到函数外部。然而,slice的长度和容量在函数内部修改不会影响外部。当slice扩容时,底层数组会改变,外部切片可能不再与内部切片同步。解决方法是传递切片指针。append和copy函数分别用于在原地添加元素和复制切片内容,两者不影响对方的底层数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

slice包含三个成员:指向底层数组的指针,slice的长度,长度的容量

        go中所有的函数传参都为值传递,当slice作为入参,并且对slice进行修改时,由于指向数组的指针指向同一个地址,对数组的修改会同步到函数外部的切片上;但是slice的长度和容量是两个值变量,函数内部对他们的修改无法传递到函数外,所以会造成函数内对slice进行append操作,底层数组发生了变化,但是函数外部slice因无法感知内部切片长度的变化,而没有修改的情况;另外,当slice的长度要超出slice的容量时,slice会进行扩容:申请一块新的地址作为底层数组,将旧的数组上的值拷贝过来,扩容完成后,函数内切片指向的数组与函数外切片指向的数组就不再是同一个地址,所有的修改都不会生效。

解决方案:将切片的指针作为参数传递进去


func append_test (arr *[]int) {
	*arr = append(*arr, 555,555)
	(*arr)[0] = 55 //注意这里的写法 (*arr)[] //*arr[] 会被编译器理解为*(arr[index])
}

append 和 copy函数:

copy() 将切片s的内容复制给切片s1,返回复制的元素数
若元素不够,则只拷贝一部分
s和s1数据空间相互独立,相互不影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值