首先,在 Go 中数组基本用不上,一般用的都是切片(slice)

因为 Go 与 C 中的数组有一个很大的不同,这个下面会讲,先说一些基本的东西

声明

这个应该很好理解

1
var a [3]int             // array of 3 integers

初始化

基础的写法

1
2
3
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"

根据元素个数确定长度

1
2
q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"

注意不是 []int{1, 2, 3} ,这是切片的写法

使用索引和对应值初始化

这是一种 C 里没有的方法,算是一种改进

1
r := [...]int{99: -1}

定义了一个含有 100 个元素的数组 r,最后一个元素被初始化为 -1,其它元素都是用 0 初始化

求长度

使用 len() 函数

1
2
var a [3]int             // array of 3 integers
fmt.Println(a[len(a)-1]) // print the last element, a[2]

for 遍历

Go 中的 for 基本就和 Python 中的一模一样,分别返回下标和值

1
2
3
4
// Print the indices and elements.
for i, v := range a {
fmt.Printf("%d %d\n", i, v)
}

当然你也可以只接收值

1
2
3
4
// Print the elements only.
for _, v := range a {
fmt.Printf("%d\n", v)
}

与 C 中数组的不同

与 C 相比,最大的区别就是:在 Go 中,数组的长度也是类型的一部分

1
fmt.Printf("%T\n", q) // "[3]int"

就如你看见的那样,类型叫做 [3]int 而不是 []int 或者 *int

这就是一个很大的问题:在写函数的时候,输入数组的长度必须是相同的

而且在较新版本的 C 中,数组在声明时可以用一个变量来动态地确定它的长度

但 Go 中不行,数组的的长度必须编译时就确定下来

这两点就使数组非常僵化,极大地限制了数组的应用,除了像 SHA256 这类需要处理特定大小数组的特例外,数组很少用作函数参数