Fork me on GitHub

Go语言开发-集合类型-创建和填充映射

4.3.1.创建和填充映射

下面的例子演示了如何创建并填充一个键为string类型值为float64类型的映射。

对于元素个数较少的映射,是否指定其初始容量无关紧要,但是对于元素数量比较多的映射,指定合适的容量可以提高性能。如果我们知道其容量的话最好指定它(即使是近似值)。

与数组和切片一样,映射也是使用[]索引操作符,但是不同之处在于映射的索引和键的类型相同,而不必是int类型的,例如,上面的例子中使用的string类型的键。

我们使用fmt.Println()函数将映射打印到控制台;这里使用了v%格式指令以“键:值”对的形式将映射输出,且元素之间用空格分隔。映射是无序的,所以在不同的环境中打印出的元素顺序可能和这里展示的不一样。

如前文所述,指针可被用作映射的键。接下来我们将介绍一个例子来演示以*Point类型来作为映射的键,Point定义如下:

Point结构体含有三个int型字段,并有一个String()方法,这就保证了当我们要打印*Point时Go语言会使用该String()方法而不是简单打印出*Point的内存地址。

顺便说一下,我们可以使用%p格式指令强制Go语言来打印一个内存地址。

这里我们创建了一个具有初始容量的映射,并使用指针类型的键和字符串类型的值进行填充。每个Point都使用复合语法创建并使用&操作符,这样键的类型就为*Point而不是Point类型的值。得益于Point.String() 方法的使用,我们可以以人类易读的形式打印出*Point的值。

使用指针作为映射的键意味着我们可以添加两个相同的Point,只需分别创建它们即可(所以具有不同的地址)。但是如果我们希望映射只保存特定位置的坐标集中的一个Point,我们可以通过保存Point的值而不是指向Point的指针来做到这一点;毕竟,Go语言允许使用结构体作为映射的键,只要该结构体中所有字段的类型支持==和!=操作。下面是一个例子。

映射nameForPoint的主键Point是唯一的,但是我们可以随时修改其对应的值。

作为本小结中的最后一个例子,我们使用复合语法创建了一个映射。当使用for … range循环遍历一个映射时,每一次遍历都会返回映射的键和值这两个变量,直到遍历结束或遇到break退出。如果我们在遍历时仅要返回一个变量,该变量应该是映射的键。因为映射是无序的,所以我们无法知道要遍历的映射中的元素的排列顺序。在大多数情况下,我们只是希望遍历映射中的所有元素并更新它们,所以其顺序也就无关紧要。但是,如果我们希望遍历时按键排序,接下来我们将会看到我们可以很容易的做到这一点。


目录


作者:Johnson
原创文章,版权所有,转载请保留原文链接。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注