Go Slice和数组的区别

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]