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