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

遍历map使用range风格的for循环实现。由于map是无序的集合,所以每次遍历的顺序可能不一样。

myMap3 := map[string]int{"str1": 10, "str2": 20, "str3": 30}

for k, v := range myMap3 {

   fmt.Println(k, v)

}

 

6 映射不可比较

slice一样,map之前也不能进行相等比较;唯一的例外是和nil进行比较。要判断两个map是否包含相同的keyvalue,我们必须通过一个循环实现。有时候,我们需要一个mapkeyslice类型,但是mapkey必须是可比较的类型,但是slice并不满足这个条件。我们可以通过两个步骤绕过这个限制。第一步,定义一个辅助函数k,将slice转为map对应的string类型的key,确保只有xy相等时,k(x)==k(y)才成立。然后创建一个keystring类型的map,在每次对map操作时,先用k辅助函数将slice转化为string类型。

7 不能对映射元素取址操作

map中的元素并不是一个变量,不能对map元素进行取址操作。禁止对map元素取址的原因是map可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址无效。slice元素可以取址操作。

fmt.Println(&myMap3["str1"])//错误,不能取址操作

 

8 nil值映射

map上的大部分操作,包括查找、删除、lenrange循环都可以安全工作在nil值的map上,它们的行为和一个空map类似。但是向一个nil值的map存入元素将导致一个panic异常。

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

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 简短声明

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

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