gogoGo Slice和数组的区别
Alex
1.使用方式
数组和slice长的很像,操作方式也都差不多,并且slice包含了数组的基本的操作方式,如下标、range循环,还有一些如len()则是多种类型共用,所以根据操作根本搞不清数组和切片的区别,能够看出区别的地方主要看如何声明的。
数组的声明方式很单一,通常就是下面这样:
1 2 3
| array1 := [5]int{1, 2, 3, 4, 5}
array2 := [5]int{}
|
slice的声明方式就非常多样了,如前面介绍的几种:
1 2 3 4 5 6 7
| var slice1 = []int{1, 2, 3, 4, 5}
var slice2 = make([]int, 0, 5)
var slice3 = make([]int, 5, 5)
var slice4 = make([]int, 5)
|
加上对数组的切片和append操作都会产生数组切片(slice)
2.值传递or引用传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| func arrayModify(array [5]int) {
newArray := array
newArray[0] = 88
}
func sliceModify(slice []int) {
newSlice := slice
newSlice[0] = 88
}
func main() {
array := [5]int{1, 2, 3, 4, 5}
slice := []int{1, 2, 3, 4, 5}
arrayModify(array)
sliceModify(slice)
fmt.Println(array)
fmt.Println(slice)
}
|
输出
1 2 3
| [1 2 3 4 5]
[88 2 3 4 5]
|
3、数组可以new 不能make
1 2 3 4 5 6
| a := new([5]int) fmt.Println(a) a[1] = 5 fmt.Println(a) //&[0 0 0 0 0] //&[0 5 0 0 0]
|
4、slice 可以new和make
1 2 3 4
| s := make([]int,5) m := new([]int) fmt.Println(m) //&[] fmt.Println(s) // [0 0 0 0 0]
|