数组相关

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。

在Go语言中数组是固定长度的数据类型,它包含相同类型的连续的元素,这些元素可以是内建类型,像数字和字符串,也可以是结构类型,元素可以通过唯一的索引值访问,从0开始。

数组是很有价值的数据结构,因为它的内存分配是连续的,内存连续意味着可以让它在CPU缓存中待更久,所以迭代数组和移动元素都会非常迅速

数组的定义

第一种,通过指定数据类型和元素个数(数组的长度)来声明数组

示例:

1
2
3
4
5
6
7
func main() {
// 定义一个长度为6的int类型数组
var array [6]int
// 为前面定义的数组赋值,当对应索引未赋值时默认初始化数据类型的默认值
array = [6]int{1, 2, 3, 4, 5} // [1 2 3 4 5 0]
fmt.Println(array)
}

第二种,快速创建和初始化数组的方法是使用数组字面值。数组字面值允许我们声明我们需要的元素个数并指定数据类型。

示例:

1
2
3
4
5
func main() {
// 快速创建和初始化数组
array1 := [4]string{"张三", "李四", "王五", "赵六"}
fmt.Println(array1) // [张三 李四 王五 赵六]
}

第三种把长度写成…,Go编译器将会根据你的元素来推导出长度

示例:

1
2
3
4
5
func main() {
// 数组元素的长度自动推导,把长度写成...
array2 := [...]string{"西瓜", "桃子"}
fmt.Println(array2) /// [西瓜 桃子]
}

第四种,我们知道数组的长度,希望对指定位置的元素初始化,其他位置元素使用默认值。

示例:

1
2
3
4
5
6
func main() {
// 知道数组的长度,希望对指定位置元素初始化,其他位置元素使用默认值
var array3 [5]string
array3 = [5]string{1: "第1位", 3: "第3位"}
fmt.Printf("%#v", array3) // [5]string{"", "第1位", "", "第3位", ""}
}

注意:当一个数组被声明时,它里面包含的每个元素都会被初始化为该元素类型的默认值。一旦数组被声明了,那么它的数据类型跟长度都不能再被改变。如果你需要更多的元素,那么只能创建一个你想要长度的新的数组,然后把原有数组的元素拷贝过去

数组的操作

数组元素关系运算

1
2
3
4
5
6
7
func main() {
// 数组的关系运算 == | !=
var name [3]string
name = [3]string{1: "pu"}
fmt.Println(name == [3]string{}) // false
fmt.Println(name == [3]string{1: "pu"}) // true
}

数组元素的访问和修改

1
2
3
4
5
6
7
func main() {
// 数组元素的访问 & 修改
name1 := [3]string{"张三", "李四", "王五"}
fmt.Println(name1[1]) // 李四
name1[1] = "小蒲"
fmt.Println(name1) // [张三 小蒲 王五]
}

数组元素的遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
name1 := [3]string{"张三", "李四", "王五"}

// 通过for遍历数组元素
for i := 0; i < len(name1); i++ {
fmt.Println(i, name1[i])
}

// 通过for range遍历数组元素
for k, v := range name1 {
fmt.Println(k, v)
}
}

多维数组

多维数组通常用于有父子关系的数据或者都是坐标系数据:

声明一个二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {
var array [3][2]int
fmt.Printf("%#v", array) // {{0,0},{0,0},{0,0}}

// 定义并初始化多维数组
array1 := [3][2]int{{1, 1}, {2, 2}, {3, 3}}
fmt.Println(array1) // [[1 1] [2 2] [3 3]]

// 指定外部数组索引位置初始化,未初始化索引位置使用默认值
array2 := [3][2]int{1: {1, 2}}
fmt.Println(array2) //[[0 0] [1 2] [0 0]]
}