go语言的内置容器 数组

网友投稿 264 2022-06-14


数组的概念

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

数组的语法

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)

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:GO语言之函数(go语言常用函数)
下一篇:Go语言标准库 container 相关包的学习与实践(go语言标准库如何使用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~