go切片常见注意事项

本文深入探讨Go语言中切片的工作原理,特别是其指向数组的特性。通过示例代码展示了如何使用make初始化切片,以及在append操作时如何影响切片和数组的内存地址。强调了当不指定容量时,append可能导致数组重新分配,以及如何通过copy避免不同切片间的相互影响。
摘要由CSDN通过智能技术生成

由于go的切片是指向数组的,所以在使用切片时要特别注意一些问题。例如下面一个例子。

//可以使用make函数来指定长度和容量。如果不指定容量,
//那么使用append函数时,如果发生了扩容,数组可能会被重新分配空间。看下面的例子。
func main() {
	a := make([]int, 2, 3) //初始化了一个长度为2,容量为3的切片
	a[0] = 1
	a[1] = 2    //此时切片为[1,2]
	p := a
	p[1] = 200    //这一步也同时修改了a切片的值。因为此时a和p指向
	//同一块内存地址
	a = append(a, 3)   //向a中增加一个元素,因为a的长度为2,容量
	//为3,此时不会重新分配内存,因此经过append操作后,p和a此时还是
	//指向同一个数组。此时a=[1,200,3],p=[1,200]。
	
	p = append(p, 999)   //向p中添加元素,由于不超过数组的容量限制,
	//p和a此时还是指向同一个数组,但是append操作时的a和p的值此
	//时都变成了[1,200,999]
	fmt.Println(a)     //[1,200,999]
	fmt.Println(p)     //[1,200,999]
}
//使用下标(类似[i:]同样也是管理同一块内存。
//如果不想要两个切片互相影响,可以使用copy函数复制元素,而非直接用“=”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值