Golang 数组、切片与映射教程:5.1 数组基础

在 Go 语言中,数组是一个基本的数据结构,用于存储固定大小的同类型元素的集合。数组的大小在声明时就已经确定,并且在整个生命周期内不可更改。本文将详细介绍 Go 语言中的数组,包括其定义、初始化、操作、优缺点以及注意事项。

1. 数组的定义

在 Go 中,数组的定义语法如下:

var arrayName [size]elementType
  • arrayName 是数组的名称。
  • size 是数组的长度,必须是一个常量。
  • elementType 是数组中元素的类型。

示例代码

package main

import "fmt"

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

在上面的示例中,我们定义了一个长度为 5 的整型数组 arr,并且在初始化时,数组的所有元素都被默认初始化为 0。

2. 数组的初始化

数组可以在声明时进行初始化,语法如下:

var arrayName = [size]elementType{value1, value2, value3, ...}

如果我们不指定数组的大小,Go 会根据提供的初始值自动推断数组的大小。

示例代码

package main

import "fmt"

func main() {
    // 指定大小的初始化
    arr1 := [5]int{1, 2, 3, 4, 5}
    fmt.Println(arr1) // 输出: [1 2 3 4 5]

    // 自动推断大小的初始化
    arr2 := [...]int{1, 2, 3, 4, 5}
    fmt.Println(arr2) // 输出: [1 2 3 4 5]
}

3. 数组的访问和修改

数组的元素可以通过索引进行访问和修改,索引从 0 开始。

示例代码

package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    
    // 访问元素
    fmt.Println(arr[0]) // 输出: 1
    fmt.Println(arr[4]) // 输出: 5

    // 修改元素
    arr[2] = 10
    fmt.Println(arr) // 输出: [1 2 10 4 5]
}

4. 数组的长度

可以使用内置的 len() 函数获取数组的长度。

示例代码

package main

import "fmt"

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

5. 数组的优缺点

优点

  1. 固定大小:数组的大小在编译时就已确定,适合存储固定数量的数据。
  2. 内存连续性:数组的元素在内存中是连续存储的,这使得访问速度较快。
  3. 类型安全:数组中的所有元素都是同一类型,避免了类型不匹配的问题。

缺点

  1. 大小不可变:一旦定义,数组的大小就无法更改,这在处理动态数据时不够灵活。
  2. 复制开销:在函数传参时,数组会被复制,这可能导致性能问题,尤其是大数组。
  3. 不支持切片操作:数组不支持动态扩展和切片操作,使用起来不如切片方便。

6. 注意事项

  1. 数组的零值:未初始化的数组会被自动填充为其元素类型的零值(例如,整型为 0,布尔型为 false,字符串为空字符串等)。
  2. 数组的比较:Go 语言支持数组的比较操作,但仅限于相同长度和相同元素类型的数组。
  3. 多维数组:Go 语言支持多维数组,定义方式为 var arrayName [size1][size2]...elementType

示例代码:多维数组

package main

import "fmt"

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

    fmt.Println(matrix) // 输出: [[1 2 3] [4 5 6]]
}

7. 总结

数组是 Go 语言中一个重要的基础数据结构,适合用于存储固定数量的同类型元素。尽管数组在某些方面存在局限性,但它们在性能和内存管理方面的优势使其在特定场景下仍然非常有用。在实际开发中,了解数组的特性和使用场景,可以帮助我们更好地选择合适的数据结构来解决问题。

在后续的章节中,我们将深入探讨切片和映射,它们是 Go 语言中更为灵活和强大的数据结构。