19 Golang数组和切片

19 Go的数组和切片

且看官网文档:

参考链接

数组

  • 一维数组
    • 定义:var variable_name [SIZE] variable_type
    • 初始化:
      • var balance = [5]int{1, 2, 4, 5, 3}
      • var balance = []int{1, 2, 4, 5, 3}
    • 多维数组:var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
  • 数组指针:var a * [3] int
  • 指针数组:var a [3] * int

切片

  • 定义

    • var identifier []type,切片不需要说明长度

    • var slical []type = make([]type, len)

    • slical := make([]make, len)

    • 指定切片的容量,可以不写,要求length <= capacity

      make ([]T, length, capacity)

区别

  • 数组是值类型;切片是引用类型
  • 数组做函数参数,拷贝一个数组传递;切片是指向一个数组切片的指针
  • 数组的长度也是Type的一部分;切片总是指向底层的数组的数据结构

代码论证

由于Go的数组

  • 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"fmt"
"unsafe"
)

func main() {
var a = [3]int{1, 2, 3} // 数组
var b = a[:] // 切片
var c = a // 拷贝数组
var pa = &a[0]
var pb = &a[0]
var pc = &c[0]


fmt.Printf("a = %d, b = %d\n", &a, &b)
fmt.Printf("sizeof(a) = %d,sizeof(b) = %d\n", unsafe.Sizeof(a), unsafe.Sizeof(b))
fmt.Println("pa = &a[0] =", pa)
fmt.Println("pb = &b[0] =", pb)
fmt.Println("pc = &c[0] =", pc)

}
  • 运行结果
1
2
3
4
5
a = &[1 2 3], b = &[1 2 3]
sizeof(a) = 24,sizeof(b) = 24
pa = &a[0] = 0xc04200c2e0
pb = &b[0] = 0xc04200c2e0
pc = &c[0] = 0xc04200c300
  • 论证结果

    数组是值类型;切片是引用类型