Go语言——切片和数组的区别

关于切片与数组的区别,这里给出定义和传值等使用上的区别,最后给出总结


数组定义

  • 申明类型定义
1
2
var arr [2]byte
arr[0] = 10
  • 直接赋值定义
1
arr := [2]byte{1,2}

切片定义

  • 申明类型定义
1
var sli []byte
  • 直接赋值定义
1
sli := make([]byte, 5)

作为参数传入

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main

import "fmt"

func changeSlicePoint(p *[]byte){
(*p)[0] = 100
}

func changeSlice(a []byte){
a[4] = 100
}

func changeArrayPoint(p *[5]byte){
(*p)[0] = 100
}

func changeArray(a [5]byte){
a[4] = 100
}

func main() {
array := [5]byte{1,2,3,4,5}
var sli1 []byte
sli1 = make([]byte, 5)
slice := []byte{1,2,3,4,5}

changeSlicePoint(&sli1)
changeSlice(sli1)
changeArray(array)
changeArrayPoint(&array)
changeSlicePoint(&slice)
changeSlice(slice)

fmt.Printf("slice[0]: %d\nslice[4]: %d\n", slice[0], slice[4])
fmt.Printf("sli1[0]: %d\nsli1[4]: %d\n", sli1[0], sli1[4])
fmt.Printf("array[0]: %d\narray[4]: %d\n", array[0], array[4])
}


//output:
//slice[0]: 100
//slice[4]: 100
//sli1[0]: 100
//sli1[4]: 100
//array[0]: 100
//array[4]: 5
//

总结

  • 切片传入时是按照引用传递的,加上指针甚至可以修改引用(内存地址)本身

    比如下面的代码会是的传入的引用重新指向nil指针:

1
2
3
4
func changeSlicePoint(p *[]byte){
(*p)[0] = 100
*p = nil
}
  • 数组的传递是按值传递的,使用了指针可实现传入地址,从而实现对数组的修改