Go 数组

数组
创建于:2020年08月12日 更新于:2020年08月23日

声明

数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列;这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以 [5] int 和 [10] int 是属于不同类型的。

声明的格式是var identifier [len]type。例如:var arr1 [5]int

对索引项为 i 的数组元素赋值可以这么操作:arr[i] = value,所以数组是 可变的

for-range 生成:

package main

import "fmt"

func main(){
    var arr1 [5]int

    for i,_:= range arr1 {
        arr1[i] = i*2
    }

    for i:=0; i<len(arr1); i++{
        fmt.Print(arr1[i])
    }
}

初始化赋值

package main

import "fmt"

func main() {
    a, b, c := 1, 2, 3

    // 第一种
    arr1 := [5]int{a, b, c ,4, 5}

    // 第二种,可以忽略数组中元素
    arr2 := [5]int{1, 2, 3}

    // 第三种
    var arr3 = [...]int{5, 6, 7, 8}

    // 第四种,key: value syntax,数组长度可以省略,默认长度为数组索引最大值
    var arr4 = [5]int{3: 3, 4: 4}
    // 输出: [0 0 0 3 4]

    fmt.Printf("arr1-type: %T;  arr2-type: %T; arr3-type: %T; arr4-type: %T", arr1, arr2, arr3, arr4)
    // arr1-type: [5]int;  arr2-type: [5]int; arr3-type: [4]int; arr4-type: [5]int
}

多维数组

Go语言中允许使用多维数组,因为数组属于值类型,所以多维数组的所有维度都会在创建时自动初始化零值,多维数组尤其适合管理具有父子关系或者与坐标系相关联的数据,例如:[3][5]int(第一维3个元素,第二维5个元素),[2][2][2]float64。

内部数组总是长度相同的。Go 语言的多维数组是矩形式的(唯一的例外是切片的数组)

声明并赋值var array = [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}}

package main

import "fmt"

const (
    ONE  = 3
    TWO = 2
)

type pixel int
var screen [ONE][TWO]pixel

func main() {
    for y := 0; y < TWO; y++ {
        for x := 0; x < ONE; x++ {
            screen[x][y] = pixel(x) // 此处需要用类型转换
        }
    }

    fmt.Println(screen) // [[0 0] [1 1] [2 2]]
}

比较两个数组是否相等

如果两个数组类型相同(包括数组的长度,数组中元素的类型)的情况下,我们可以直接通过较运算符(==和!=)来判断两个数组是否相等,只有当两个数组的所有元素都是相等的时候数组才是相等的,不能比较两个类型不同的数组,否则程序将无法完成编译。

package main

import "fmt"

func main() {
    a := [2]int{1, 2}
    b := [...]int{1, 2}
    c := [2]int{1, 3}
    fmt.Println(a == b, a == c, b == c) // "true false false"
    d := [3]int{1, 2}
    fmt.Println(a == d) // 编译错误:无法比较 [2]int == [3]int
}