Go 语言数组详解
Go 编程语言提供了一种称为数组的数据结构。数组是属于同一类型的元素的集合。例如,整数 5、8、9、79、76 的集合构成一个数组。
Go 语言中的数组不允许混合不同类型的值,例如同时包含字符串和整数的数组是不能通过编译的。
所有数组都由连续的内存位置组成。最低地址对应第一个元素,最高地址对应最后一个元素。
声明数组
数组属于 type [n]T。n表示数组中元素的个数,T表示每个元素的类型。
元素的数量n也是类型的一部分。稍后我们将更详细地讨论这一点。
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var variable_name [SIZE] variable_type
以上为一维数组的定义方式。例如以下定义了数组 balance 长度为 10 类型为 float32:
var balance [10] float32
在这里,balance 是一个变量数组,最多可以容纳 10 个浮点数。
下面我们通过示例来看一下声明数组的方式
package main
import (
"fmt"
)
func main() {
var a [3]int //长度为3的整数数组
fmt.Println(a)
}
上述代码编译执行结果如下
[0 0 0]
var a [3]int
声明一个长度为 3 的整数数组。数组中的所有元素都会自动分配数组类型的零值。在这种情况下a是一个整数数组,因此所有元素a都分配一个整数0。
我们可以在 Go 中使用单个语句在声明数组的同时初始化数组,如下所示
var balance = [5]int{1000, 2, 3, 7, 50}
大括号 { } 之间的值数不能大于我们为方括号 [ ] 之间的数组声明的元素数。
如果在初始化时不指定数组的大小,则会创建一个刚好足以容纳 { }
中的元素个数的数组。
var balance = []int{1000, 2, 3, 7, 50}
将创建与前一个示例中完全相同的数组。
所有数组的第一个元素的索引都为 0,也称为基索引,数组的最后一个索引将是数组的总大小减 1。以下是我们上面讨论的同一数组的图形表示
下面让我们使用简写的形式创建上面的数组
package main
import (
"fmt"
)
func main() {
balance := [5]int{1000, 2, 3, 7, 50}
fmt.Println(balance)
}
上述代码编译执行结果如下
[1000 2 3 7 50]
数组的长度
数组的长度是通过将数组作为参数传递给len()
函数来计算的 。
package main
import "fmt"
func main() {
balance := [...]float64{67.7, 89.8, 21, 78}
fmt.Println("balance 的长度:",len(balance))
}
上述代码编译执行结果如下
balance 的长度: 4
访问数组元素
数组元素可以通过索引(位置)来读取。格式为数组名后加中括号,中括号中为索引的值。例如:
var salary float32 = balance[9]
以上实例读取了数组 balance 第 10 个元素的值。
以下演示了数组完整操作(声明、赋值、访问)的实例:
package main
import "fmt"
func main() {
// 声明并初始化数组
a := [...]float64{67.7, 89.8, 21, 78}
for i := 0; i < len(a); i++ { // 从 0 开始循环
fmt.Printf("%d th element of a is %.2f\n", i, a[i])
}
}
上述代码编译执行结果如下
0 th element of a is 67.70
1 th element of a is 89.80
2 th element of a is 21.00
3 th element of a is 78.00
上面的程序使用一个for循环来迭代数组的元素,从索引0到数组的长度-1。
数组大小不同类型不同
在本章的前面我们说过,数组的大小是类型的一部分。因此[5]int和[25]int是不同的类型。也就是说,数组一旦被定义,其大小是不能再被改变的。下面我们举例子来看一下这个知识点
package main
func main() {
a := [3]int{5, 78, 8}
var b [5]int
b = a // 将 a 赋值给 b
}
上面我们试图将一个类型[3]int的变量分配给一个[5]int,因为二者属于不同的类型,因此赋值会失败。编译运行上述代码报错如下
cannot use a (type [3]int) as type [5]int in assignment (exit status 2)