遍历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是否包含相同的key和value,我们必须通过一个循环实现。有时候,我们需要一个map的key是slice类型,但是map的key必须是可比较的类型,但是slice并不满足这个条件。我们可以通过两个步骤绕过这个限制。第一步,定义一个辅助函数k,将slice转为map对应的string类型的key,确保只有x和y相等时,k(x)==k(y)才成立。然后创建一个key为string类型的map,在每次对map操作时,先用k辅助函数将slice转化为string类型。
7 不能对映射元素取址操作
map中的元素并不是一个变量,不能对map元素进行取址操作。禁止对map元素取址的原因是map可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址无效。slice元素可以取址操作。
fmt.Println(&myMap3["str1"])//错误,不能取址操作
8 nil值映射
map上的大部分操作,包括查找、删除、len和range循环都可以安全工作在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 简短声明