第四章 go语言 数组、切片和映射

数组是由同构的元素组成。结构体是由异构的元素组成。数据和结构体都是有固定内存大小的数据结构。相比之下,切片和映射则是动态的数据结构,它们根据需要动态增长。

4.1 数组

数组是一系列同一类型数据的集合,数组中包含的每个数据被称为数组元素。一个数组包含的元素个数称为数组的长度,数组长度是固定的。一个数组可以由零个或多个元素组成。

1 数组声明

数组声明的一般形式:

var 数组名 [长度]类型

 

示例如下:

var arr [10]int           //10个元素的整型数组

var ptrs [5]*float64  //5个元素的指针数组,每个指针都指向float64类型 

var points [8]struct{ x, y int }  //8个元素的结构体类型

var arry [2][3]int               //2*3的二维整型数组 

 

2 简短声明

与变量的简短声明一样,数组也可以简短声明。如果在数组的长度位置出现的是...”省略号,则表示数据的长度是根据初始化值得个数来计算。

a := [3]int{1, 2, 3} // 长度为3的数组

b := [5]int{1, 2, 3} //长度为10,前三个元素为1、2、3,其它默认为0

c := [...]int{4, 5, 6} //长度3的方式,Go自动计算长度

r := [...]int{9: 6}    //长度为10,最后一个元素的值为6,其它默认为0

arr2 := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}//二维数组

 

3 元素访问

数组的每个元素通过索引下标来访问,内置的len函数将返回数组中元素的个数。

arr := [...]int{1, 2, 3, 4, 5}

len := len(arr)   //len获取数组长度

fmt.Println("修改前:", arr)

arr[0] = 100      //下标访问数组元素

fmt.Println("修改后:", arr)

fmt.Println("数组长度:", len)

打印结果:

修改前: [1 2 3 4 5]

修改后: [100 2 3 4 5]

数组长度: 5

 

4 数组遍历

两种遍历方式,其中range表达式遍历有两个返回值,第一个是索引,第二个是元素的值。示例如下:

arr := [...]int{1, 2, 3, 4, 5}

len := len(arr) //len获取数组长度

for i := 0; i < len; i++ {

  fmt.Println(i, arr[i])

}

for i, v := range arr {

  fmt.Println(i, v)

}

 

 

5 作为函数参数

Go语言中,数组作为函数的参数仍然是值传递,虽然可以使用数组的指针来代替,但是改变不了数组长度。这时,我们通常使用切片slice来替代数组。

 

6 数组比较

如果数组元素的类型是可比较的,那么这个数组也是可的比较。只有数组的所有元素都相等数组才是相等的。由于长度也是数组类型的一部分,所以长度不同的数组是不等的。

数组可遍历、可修改,是否可比较,由数组元素决定。%T用于显示一个值对应的数据类型。

 

4.2 数组切片(slice

数组的长度在定义之后无法修改。数组是值类型,每次传递都将产生一份副本。显然这无法满足开发者的某些需求。Go语言提供了数组切片(slice)来弥补数组的不足。数组和slice之间有着紧密的联系,一个slice是一个轻量级的数据结构,提供了访问数组子序列元素的功能,而且slice的底层确实引用一个数组对象。

1 声明数组切片(slice

    数组切片与数组声明非常相似,唯一区别是无需指定长度。

var 数组切片 []类型

var slice []int

 

2 基于数组以及基于切片创建切片

arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //数组

slice1 := arr[0:5]     //基于数组切片1,左闭右开

slice2 := slice1[1:3]  //基于切片1创建切片2

fmt.Println(slice1)    //[1 2 3 4 5]

fmt.Println(slice2)    //[2 3]

 

3 直接创建切片

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxdzw.html