接下来我们来学习一下 Go 语言中数组的相关使用及常见的操作。

定义

数组是同一种数据类型元素的集合。Go 语言的数组从声明时就是确定的,使用时元素可以修改,但数组长度不可变,基本语法如下:

var 数组变量名 [元素数量]数据类型
var a [3]int

说明:数组的长度必须是常量,并且一旦定义之后,长度不能变。

初始化

数组的初始化和变量一样有很多种初始化方式。

方式一

使用初始化列表来设置数组元素的值。示例如下:

func main() {
    var baseArray [3]int
    var numArray = [3]int{1, 2}
    var stringArray = [2]string{"杭州", "上海"}

    fmt.Println(baseArray) // [0 0 0]
    fmt.Println(numArray) // [1 2 0]
    fmt.Println(stringArray) // [杭州 上海]
}

从上面的示例中可以看出以下几点:

  • int 类型的初始化值为零。
  • 可以指定初始化的数值,未被初始化数值的元素会初始化为该类型的默认值。

方式二

上面的方式在初始化时数组的需要提供初始值和数组长度,其实我们还可以像变量一样采用自行推断的方式,示例如下:

func main() {
    var baseArray [3]int
    var numArray = [...]int{1, 2}
    var stringArray = [...]string{"杭州", "北京", "上海"}

    fmt.Println(baseArray)   // [0 0 0]
    fmt.Println(numArray)    // [1 2 0]
    fmt.Println(stringArray) // [杭州 北京 上海]
}

方式三

使用指定索引值方式来初始化数组,示例如下:

func main() {
    var a = [...]int{1: 1, 3: 5}
    fmt.Println(a)                  // [0 1 0 5]
    fmt.Printf("type of a:%T\n", a) // type of a:[4]int
}

遍历

遍历数组有以下两种方法,示例如下:

func main() {
    a := [...]string{"大王", "小王", "王炸"}

    // 方式一:for 循环遍历
    for i := 0; i < len(a); i++ {
        fmt.Println(a[i])
    }

    // 方式二:for range 循环遍历
    for index, value := range a {
        fmt.Println(index, value)
    }
}

多维数组

Go语言同样也是支持多维数组的,下面以二维数组为例来学习一下吧~

二维数组的定义

func main() {
    a := [...][2]int{
        {11, 12},
        {21, 22},
    }
    fmt.Println(a)       // [[11 12] [21 22]]
    fmt.Println(a[0][1]) // 12
}

说明:多维数组的第一层是可以使用...来让编译器自动推导数组长度的

二维数组的遍历

func main() {
    a := [...][2]string{
        {"杭州", "北京"},
        {"上海", "深圳"},
    }

    for _, v1 := range a {
        for _, v2 := range v1 {
            fmt.Printf("%s\t", v2)
        }
        fmt.Println()
    }
}

输出:

杭州    北京
上海    深圳

关于数组需要注意以下几点:

  • 数组是值类型的,因此改变副本的值并不会改变本身的值。
  • 数组支持“==”、“!=”操作符,因为内存总是被初始化过的。
  • [n]*T表示指针数组,*[n]T表示数组指针。