一、数组定义

package main

import "fmt"

func main() {
    var arr1 [5]int              // 定义5个int元素的数组
    arr2 := [3]int{1, 3, 5}      // 定义3个int元素的数组,并且赋值
    arr3 := [...]int{2, 4, 6, 8} // 让编译器自动判断元素个数,且赋值

    fmt.Println(arr1, arr2, arr3)
}

运行输出

$ go run 05arrays.go
[0 0 0 0 0] [1 3 5] [2 4 6 8]

二、二维数组

package main

import "fmt"

func main() {
    var grid [4][5]int // 二维数组4行5列
    fmt.Println(grid)
}

运行输出

$ go run 05arrays.go
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

三、遍历数组

首先我们想到的肯定是传统的遍历方法

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

go 中只要使用 range 关键字进行遍历

for key := range arr3 {
    fmt.Println(arr3[key])
}

还可以获取到 value

for key, value := range arr3 {
    fmt.Println(key, value)
}

四、数组是值类型

package main

import "fmt"

func printArray(arr [5]int) {
    arr[0] = 100 // 虽然边修改了,但是不会影响到main函数的数组,因为只值传递
    for key, value := range arr {
        fmt.Println(key, value)
    }
}

func main() {
    var arr1 [5]int                  // 定义5个int元素的数组
    arr2 := [3]int{1, 3, 5}          // 定义3个int元素的数组,并且赋值
    arr3 := [...]int{2, 4, 6, 8, 10} // 让编译器自动判断元素个数,且赋值
    var grid [4][5]int               // 二维数组4行5列

    printArray(arr1)
    printArray(arr3)
    // printArray(arr2)
    // printArray(grid)
}

[5]int[3]int 是不同类型,
所以arr2grid 是不能调用的,因为printArray要求参数必须是5个元素的数组

因为数组是值传递,所以每次调用 printArray(arr [5]int) 会拷贝数组

可以看到数组每次传参要知道元素个数,非常麻烦,所以一般不会直接使用数组,所以go一般用的都是切片slice