解释array和slice的区别 ?
在Go语言中,数组(Array)和切片(Slice)都是用来存储元素的集合,但他们在使用和性质上有一些重要的区别。
数组:
- 数组是具有固定长度的数据类型,这个长度在声明时被设定,并且之后不能更改。
- 当你将一个数组赋值给另一个数组时,内容会被复制。如果你在一个数组上做了改动,那么原始数组不会被改变。
切片:
- 切片是对数组一个连续片段的引用,因此切片是动态的,长度可以按需增加或减少。切片的长度可以在运行时改变。
- 当你将一个切片赋值给另一个切片时,他们都会引用同一个底层数组。如果你在一个切片上做了改动,那么原始切片和底层数组都会被改变。
以下例子可以帮助理解这些区别:
func main() {
arr := [3]int{1, 2, 3} // an array
sli := []int{1, 2, 3} // a slice
anotherArr := arr
anotherArr[0] = 9
fmt.Println(arr) // Output: [1 2 3]
anotherSli := sli
anotherSli[0] = 9
fmt.Println(sli) // Output: [9 2 3]
}
在这个例子中,我们看到修改anotherArr
并不会影响原始的arr
,但是修改anotherSli
确实改变了原始的sli
。这是因为数组在赋值时进行了内容复制,而切片只是创建了对同一底层数组的新引用。