Golang - 数组和切片

路漫漫其修远兮,吾将上下而求索。

数组介绍

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组的长度是数组类型的组成部分。 数组的元素可以被修改,但是数组本身的赋值和函数传参都是以整体复制的方式处理的。

定义数组的几种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义一个长度为3的数组,数组中的元素全部为0
var a [3]int

// 定义一个长度为3的数组,数组的元素为1,2,3
var b = [...]int{1, 2, 3}

// 定义一个长度为3的数组,数组的元素为0,2,3
var c = [...]int{1:2, 2:3}

// 定义一个长度为4的数组,数组的元素为1,0,0,4
var d = [...]int{1, 3:4}

// 定义一个长度为3的数组,数组的元素为长度为2的数组
var e [3][2]int

迭代数组

我们有几种常用的迭代数组的方式:

1
2
3
4
for i := range a {
    // 获取元素
    a[i]
}
1
2
3
4
for i, item := range a {
    // 获取元素
    item
}
1
2
3
4
for i := 0; i<len(a); i++ {
    // 获取元素
    a[i]
}

用for range方式迭代的性能可能会更好一些,因为这种迭代可以保证不会出现数组越界的情形。

切片介绍

切片就是一种简化版的动态数组。因为动态数组的长度不固定,所以切片的长度自然也就不能是类型的组成部分了。 不像数组变量,声明切片变量并不会自动创建一个切片。

结构定义:

1
2
3
4
5
type SliceHeader struct {
    Data uintptr
    Len int
    Cap int
}

Len 表示切片中有效元素长度,Cap 表示切片最大元素长度。

定义切片的几种方式

除了不指定大小,与声明一个数组变量的语法完全相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义一个 nil 切片,和 nil 相等
var a []int

// 定义一个空切片, 和 nil 不相等
var b = []int{}

// 定义一个有3个元素的切片,len 为3,cap 为3
var c = []int{1, 2, 3}

// 定义一个有3个元素的切片,len 为3,cap 为3
var d = make([]int, 3)

// 定义一个有2个元素的切片,len 为2,cap 为3
var e = make([]int, 2, 3)

迭代切片

和迭代数组相同