在 Go 语言中,数组是一个固定长度的元素集合,所有元素都必须是相同的数据类型。与其他编程语言不同,Go 中的数组长度是数组类型的一部分,因此数组的长度是数组的一个特性,不可更改。

数组在 Go 中是一种基础的数据结构,适用于需要存储固定大小集合的情况。


📖 目录

  1. 数组定义
  2. 数组初始化
  3. 数组访问
  4. 数组长度
  5. 多维数组
  6. 数组的遍历
  7. 数组的复制
  8. 数组与切片
  9. 参考资料

1. 数组定义

在 Go 语言中,数组的定义方式包括指定长度和元素类型。数组的长度是数组类型的一部分。

1.1 基本语法

var 数组名 [长度] 类型

  • 长度 是数组的大小。
  • 类型 是数组中元素的类型。

示例:

package main

import "fmt"

func main() {
    var arr [5]int // 定义一个长度为 5 的整数数组
    fmt.Println(arr)
}

输出:

[0 0 0 0 0]

在这个示例中,数组 arr 被定义为包含 5 个整数的数组,默认值为 0。


2. 数组初始化

Go 语言允许在声明数组时直接初始化其值。

2.1 声明并初始化

var arr = [3]int{1, 2, 3}

2.2 使用 := 初始化

arr := [3]int{1, 2, 3}

2.3 使用省略号自动推断长度

arr := [...]int{1, 2, 3} // Go 会自动推断数组的长度为 3


3. 数组访问

数组的元素可以通过索引访问,索引从 0 开始。

示例:

package main

import "fmt"

func main() {
    arr := [3]int{10, 20, 30}
    fmt.Println(arr[0]) // 访问第一个元素,输出: 10
    fmt.Println(arr[1]) // 访问第二个元素,输出: 20
    fmt.Println(arr[2]) // 访问第三个元素,输出: 30
}


4. 数组长度

Go 数组的长度在定义时确定,并且是类型的一部分。可以使用 len() 函数获取数组的长度。

示例:

package main

import "fmt"

func main() {
    arr := [4]int{1, 2, 3, 4}
    fmt.Println(len(arr)) // 输出: 4
}


5. 多维数组

Go 语言支持多维数组。多维数组是数组的数组,常见的有二维数组。多维数组的定义方式如下:

示例:

package main

import "fmt"

func main() {
    var arr [2][3]int // 定义一个 2x3 的二维数组
    arr[0][0] = 1
    arr[0][1] = 2
    arr[0][2] = 3
    arr[1][0] = 4
    arr[1][1] = 5
    arr[1][2] = 6

    fmt.Println(arr)
}

输出:

[[1 2 3] [4 5 6]]


6. 数组的遍历

可以使用 for 循环遍历数组中的所有元素。Go 语言提供了简便的方式遍历数组的元素。

6.1 基本遍历

package main

import "fmt"

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

6.2 使用 range 遍历数组

range 提供了更简洁的方式来遍历数组,并返回每个元素的索引和值。

package main

import "fmt"

func main() {
    arr := [4]int{1, 2, 3, 4}
    for index, value := range arr {
        fmt.Println("Index:", index, "Value:", value)
    }
}

输出:

Index: 0 Value: 1
Index: 1 Value: 2
Index: 2 Value: 3
Index: 3 Value: 4


7. 数组的复制

在 Go 中,数组是值类型,因此当你将一个数组赋值给另一个数组时,实际上是进行了一次数组的复制。

示例:

package main

import "fmt"

func main() {
    arr1 := [3]int{1, 2, 3}
    arr2 := arr1 // 数组赋值会创建副本
    arr2[0] = 10

    fmt.Println("arr1:", arr1) // 输出: [1 2 3]
    fmt.Println("arr2:", arr2) // 输出: [10 2 3]
}


8. 数组与切片

数组的大小是固定的,因此不够灵活。Go 提供了切片(slice)来弥补这一缺点,切片是数组的一个动态视图。切片允许动态增加或减少元素,而不必担心数组的固定大小。

示例:

package main

import "fmt"

func main() {
    arr := [3]int{1, 2, 3} // 定义一个数组
    slice := arr[:]         // 将数组转化为切片
    fmt.Println(slice)      // 输出: [1 2 3]

    slice[0] = 10
    fmt.Println(slice)      // 输出: [10 2 3]
    fmt.Println(arr)        // 输出: [1 2 3]
}

在上述示例中,切片是数组的一个视图,对切片的修改不会影响原数组(因为数组和切片是不同的类型)。


9. 参考资料


Go 语言的数组是一个简单但功能强大的数据结构,适用于存储固定大小的数据集合。理解数组的使用方式、遍历和与切片的关系对高效使用 Go 语言至关重要。