教程 > Go 教程 > Go 基础 阅读:168

Go 语言数组详解

Go 编程语言提供了一种称为数组的数据结构。数组是属于同一类型的元素的集合。例如,整数 5、8、9、79、76 的集合构成一个数组。

Go 语言中的数组不允许混合不同类型的值,例如同时包含字符串和整数的数组是不能通过编译的。

所有数组都由连续的内存位置组成。最低地址对应第一个元素,最高地址对应最后一个元素。

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。以下是我们上面讨论的同一数组的图形表示

Go 数组初始化值

下面让我们使用简写的形式创建上面的数组

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)

Go 数组大小不同变量之间赋值导致错误

查看笔记

扫码一下
查看教程更方便