首页 > 编程语言 > go > go语言的内置容器 数组
2020
05-07

go语言的内置容器 数组




数组的概念


数组是相同类型的一组数据构成的长度固定的序列,其中数据类型包含了基本数据类型、复合数据类型和自定义类型。数组中的每一项被称为数组的元素。数组名是数组的唯一标识符, 数组的每一个元素都是没有名字的,只能通过索引下标(位置)进行访问。因为数组的内存是一段连续的存储区域,所以数组的检索速度是非常快的,但是数组也有一定的缺陷,就是定义后长度不能更改。


数组的语法


Go 语言数组声明需要指定元素类型及元素个数,语法格式如下。

  • var 变量名 [数组长度] 数据类型

以上为一维数组的定义方式,数组长度必须是整数且大于 0,未初始化的数组不是nil,也就是说没有空数组(与切片不同)。

初始化数组语法格式如下。

  • var nums = [5]int{1,2,3,4,5}

初始化数组中 {} 中的元素个数不能大于 [] 中的数字。

如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小。可以忽略声明中数组的长度并将其替换为…。编译器会自动计算长度。语法格式如下。

  • var nums = [...]int{1,2,3,4,5}

以上两种初始化方式相同,虽然第二种没有设置数组的大小。

修改数组内容,语法格式如下。

  • nums[4] = 4

以上实例读取数组第五个元素。数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。


数组的长度


数组的长度是该数组类型的一个内置常量,通过将数组作为参数传递给len()函数,可以获得数组的长度。忽略声明中数组的长度并将其替换为…,编译器可以找到长度。接下来使用案例演示获取数组长度的使用方式。

示例代码

package main

import "fmt"

func main() {
  a := [4]float64{67.7, 89.8, 21, 78}
    b := [...]int{2, 3, 5}
    fmt.Printf("数组a 的长度为 %d, 数组b的长度为 %d\n", len(a), len(b))
}

运行

  • 数组a 的长度为 4, 数组b的长度为 3


遍历数组


在数组中查找目标元素,需要进行遍历,在Go语言中数组的遍历方式如下所示。

package main
import "fmt"
func main() {
   a := [4]float64{67.7, 89.8, 21, 78}
   b := [...]int{2, 3, 5}
   //遍历数组方式1
   for i := 0; i < len(a); i++ {
      fmt.Print(a[i], "\t")
   }
   fmt.Println()
   // 遍历数组方式2
   for _, value := range b {
      fmt.Print(value, "\t")
   }
}

运行

67.7    89.8    21      78
2       3       5


多维数组


由于数据的复杂程度不一样,数组可能有多个下标。一般将数组元素下标的个数称为维数,根据维数,可将数组分为一维数组、二维数组、三维数组、四维数组等。二维及以上的数组可称为多维数组。


Go 语言的多维数组声明方式:

var variable [size1][size2]...[sizen] variable_type


二维数组

  • 在实际应用中,仅仅使用一维数组是不够的,例如,一个学习小组有10个人,每人有三门课的考试成绩,这时,一位数组明显不够用,就可以使用二维数组。 
  • 二维数组是最简单的多维数组,二维数组的本质也是一个一维数组,只是数组成员,由基本数据类型变成了构造数据类型(一维数组)。


二维数组的定义方式

var arrayName [x][y] variable_type

二维数组初始化,语法格式

a = [3][4]int{
  {0, 1, 2, 3},       //第一行索引为 0
  {4, 5, 6, 7},       //第二行索引为 1
  {8, 9, 10, 11}      //第三行索引为 2
}

在上述定义的二维数组中,共包含3*4个元素,即12个元素。接下来,通过一张图来描述二维数组a的元素分布情况,如图所示。




二维数组通过指定坐标来访问。如数组中的行索引与列索引。语法格式如下。

int val = a[2][3]

以上实例访问了二维数组 val 第三行的第四个元素。

二维数组可以使用循环嵌套来输出元素,具体语法通过案例演示

package main
import "fmt"
func main() {
   /* 数组 - 5 行 2 列*/
   var a = [5][2]int{ {0,0}, {1,2}, {2,4}, {3,6},{4,8}}
   fmt.Println(len(a))
   fmt.Println(len(a[0]))
   /* 输出数组元素 */
   for  i := 0; i < len(a); i++ {
      for j := 0; j < len(a[0]); j++ {
         fmt.Printf("a[%d][%d] = %d\n", i,j, a[i][j] )
      }
   }
}

运行

5
2
a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8

三维数组


三维数组的本质也是一个一维数组,只是数组成员,由基本数据类型变成了构造数据类型(二维数组)。如同阅兵仪式的多个方阵。

定义三维数组的语法格式如下。

var threedim [5][10][4]in

多维数组在实际的工作中极少使用,并且使用方法与二维数组相似


数组是值类型


Go语言中的数组并非引用类型,而是值类型。当它们被分配给一个新变量时,会将原始数组复制出一份分配给新变量。因此对新变量进行更改,原始数组中不会有反映。下面通过一个案例来验证原始数组是否被更改,具体如下所示

package main
import "fmt"
func main() {
   a := [...]string{"USA", "China", "India", "Germany", "France"}
   b := a // a copy of a is assigned to b
   b[0] = "Singapore"
   fmt.Println("a :", a)
   fmt.Println("b :", b)
}


运行

package main
import "fmt"
func main() {
   a := [...]string{"USA", "China", "India", "Germany", "France"}
   b := a // a copy of a is assigned to b
   b[0] = "Singapore"
   fmt.Println("a :", a)
   fmt.Println("b :", b)
}


当将数组传递给函数作为参数时,它们将通过值传递,原始数组依然保持不变。


扫码芷若 获取免费视频学习资料

编程学习

查 看2019高级编程视频教程免费获取