Fork me on GitHub

Go语言开发-集合类型-映射

4.3.映射

Go 语言的映射是一个保存键值对的无序的集合,其容量仅受机器内存限制。映射的键是唯一的且其类型必须支持==和!=操作符,所以大部分内置类型都可以作为键来使用(例如,int、float64、rune、string、可比较的数组、结构体和自定义类型,以及指针)。切片、不可比较的数组和结构体(即,其元素不支持==和! =操作符)和自定义类型是不能作为映射的键来使用的。指针、引用类型或任何内置或自定义类型值都可以作为值来使用,也包括映射,因此我们可以很容易地使用它来创建复杂的数据结构。表4.3列出了Go语言中映射支持的操作。

映射是引用类型且传递成本比较低廉(例如,在64位机器上只需传递8个字节,在32位机器上是4个字节),而不管它们保存有多少数据。映射具有较快的查找速度,大大快于线性查找,虽然根据非正式的实验结果,映射比数组或切片的直接索引慢约两个数量级(即100倍)。但是在需要使用映射的地方,这仍然是非常快的,所以在实际使用中是不太可能遇到性能问题的。图4.5展示了map[string]float64类型的映射的示意图。

由于切片不能用作映射的键,所以我们也就不能使用字节切片([]byte)作为键。然而,因为使用转换string([]byte)和[] byte(string)并不会改变原始切片的底层字节,所以我们可以将[]byte切片安全的转换为字符串来作为映射的键,然后再根据需要将它们转换回[]byte切片。

表4.3 映射支持的操作

m[k] = v将值v赋值给映射m的键k;如果键k已存在,则丢弃其之前的值。
delete(m, k)从映射m中删除键k和相应的值,否则什么也不做。
v := m[k]检索映射m中键k对应的值,并将其赋值给v;如果映射m中不存在键k,则将映射值类型的零值赋值给v。
v, found := m[k]检索映射m中键k对应的值,并将其赋值给v,并返回true;如果映射m中不存在键k,则将映射值类型的零值赋值给v,并返回false。
len(m)映射m中元素的个数

20160916

图4.5 键为string类型值为float64类型的映射剖析

映射中所有的键必须具有相同的类型,其值也必须如此,但是键和值的类型可以(通常)不同。映射的键就如同切片的元素一样,在实际使用中其类型并没有限制,这是因为映射的值的类型可以是一个接口,所以我们可以使用所有满足指定接口(即,实现了接口所需的方法)的任何受支持的类型的值。我们甚至可以使用空接口来作为映射的值的类型,这意味着映射可以用来保存任意类型的值,不过,在当我们访问一个值时,就需要使用类型断言或类型开关来判断值的类型。可以使用下面的语法来创建映射:

内置的make()函数可以用于创建切片、映射和通道。当用于创建映射时,实际创建的是一个空的映射,而如果指定了初始容量值,则映射就会被初始化并分配足够的内存来保存给定的元素。如果添加的元素数量大于其初始容量,则映射容量将会自动增长以保存新的元素。第二种和第三种语法是等效的。最后两种语法展示了如何使用复合语法来创建映射,在创建一个空的映射或创建一个具有初始值的映射时都是非常方便的。


目录


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

发表评论

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