go语言中切片当作函数传递

本文探讨了Go语言中切片作为参数传递时的行为特点,特别是使用append函数时的地址变动问题,并给出了确保切片正确修改的方法。

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

|版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:https://blog.youkuaiyun.com/sgsgy5

传递分为值传递和地址传递,go语言中切片和map是地址传递,但是切片传递要有一个注意事项
例如:

package main
func test(a []int){
    a=append(a,1,2,3)
}
func main(){
	var s []int=[]int{89,4,5,6}
	test(s)
	fmt.Println(s)
}

在这里里面为什么调用函数后切片没有变化呢,切片不是地址传递吗?这是因为在test函数里面用了append()函数,在调用函数时,在栈区里面把1 2 3 添加到a里面然后重新分配了地址,而原来的s切片还是指向原来地址,根本没有变,所以在main函数里面打印出s还是原来的,不会改变,那么如何做到用了append后改变原来切片的值呢
如下

package main
import "fmt"
func test(a []int)(b []int){
	b=append(a,1,2,3,7)
	return
}
func main(){
	var s []int=[]int{9,10}
	s=test(s)
	fmt.Println(s)
}

我们可以用return 把改变后的地址传回去这样就可以了
切片用append函数的时候一定要注意,因为如果容量不足的时候会自动扩充,如果原来的地址后面没有足够的空间那么就会重新找一个足够大的空间来储存,所以切片利用append的时候地址是有可能变化的。
https://blog.youkuaiyun.com/sgsgy5/article/details/81949992 切片详细讲解

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值