Go语言基础之数组

作者:[Joho]
创建于:2019-04-19
更新于:2023-04-19

数组的定义

在 Go 语言中,数组是一种固定大小的数据结构,它由相同类型的元素组成。数组在创建时就已经确定长度,并且无法更改。 要声明一个数组,需要指定元素的类型和长度。例如:

var a [3]int

数组的长度是其类型的一部分,因此类型为[5]int 和[10]int 是不同类型的数组。 这将创建一个名为a的数组,其中包含 3 个整数。数组中的每个元素都被初始化为其类型的零值。 在定义数组时,我们可以指定初始值。例如:

var names [3]string = [3]string{"香蕉", "苹果", "橙子"}

可以使用省略号来快速初始化数组。例如:

a := [...]int{1, 2, 3, 4, 5}

可以使用索引和值进行初始化。例如:

a := [3]int{0: 1, 2: 3}

在这个例子中,将 a[0]初始化为 1,将 a[2]初始化为 3。其余位置都会被自动初始化为 0。

数组的用法

要访问数组中的元素,可以使用索引。数组的索引从 0 开始,到 len-1 结束,访问越界将触发 panic。例如:

nums := [...]int{1, 2, 3, 4, 5}
fmt.Println(nums[2]) // 输出 3
nums[0] = 10 // 修改数组中的元素
// 处理数组时要考虑边界条件
if index >= 0 && index < len(nums) {
	fmt.Println(nums[index])
}

可以使用for循环来遍历数组。例如:

nums := [...]int{1, 2, 3, 4, 5}
for i := 0; i < len(nums); i++ {
	fmt.Println(nums[i])
}

可以使用range关键字来遍历数组,同时获取数组的索引和值。例如:

nums := [...]int{1, 2, 3, 4, 5}
for i, num := range nums {
	fmt.Printf("nums[%d] = %d\n", i, num)
}

数组是值类型,赋值和传参将会拷贝整个数组,在函数中修改的是原始数组的副本。例如:

func modifyArray(a [5]int) {
	a[0] = 10
}

nums := [5]int{1, 2, 3, 4, 5}
modifyArray(nums)
fmt.Println(nums) // 输出 [1 2 3 4 5]

如果要修改原是数组,需要将数组的指针传递给函数。例如:

// 使用数组指针传参
func modifyArray(a *[5]int) {
	(*a)[0] = 10
}

nums := [5]int{1, 2, 3, 4, 5}
modifyArray(&nums)
fmt.Println(nums) // 输出 [10 2 3 4 5]

多维数组

Go 语言也支持多维数组,即数组中的元素可以是其他的数组。例如:

var matrix [2][3]int = [2][3]int{{1, 2, 3}, {4, 5, 6}}

在这个例子中,使用[2][3]int来定义了一个包含两行三列的整数矩阵。 要遍历多维数组,可以使用多个嵌套的 for 循环。例如:

matrix := [2][3]int{{1, 2, 3}, {4, 5, 6}}

for i := 0; i < len(matrix); i++ {
	for j := 0; j < len(matrix[i]); j++ {
		fmt.Printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j])
	}
}

数组的特点

  • 长度固定:数组的长度在定义时就已经确定,并且不能更改。
  • 类型一致:数组中的每个元素都是相同类型的。
  • 相关元素:数组中元素的位置按照一维连续排列。

数组使用的注意事项

  • 数组越界:访问数组时,要确保不要超出数组的长度。
  • 数组切片:数组切片是对指向底层数组的窗口的引用。因此,在对切片进行修改时,底层数组中的相应元素也会被修改。
  • 数组传参:在将数组作为参数传递给函数时,将复制整个数组的值。因此,在处理大型数组时,应考虑使用指向数组的指针。