由于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函数复制元素,而非直接用“=”。