Map介绍
Map介绍
- 在Go中,map是哈希表的引用,是一种key-value数据结构。map类型写作map[K]V,其中K和V分别对应key和value的类型。
- map中所有的key都是相同的类型,所有的value也是相同的类型,但key和value可以是不同的类型,value通常使用自定义类型。
- map内部需要通过判断两个key是否相等以确保每个键的唯一性,因此key的数据类型必须是可比较,如果key是自定义类型,则要求自定义类型中的所有字段是可比较的。
map的示意图如下:
map中仅包含一个指向底层哈希表的指针,属于引用类型,当map类型变量进行赋值或传参时,本质就是将map中指向哈希表的指针的值进行拷贝,因此最终两个map变量底层指向的是同一个哈希表,其中一个变量对哈希表修改会影响到另一个map变量。如下:
Map的定义方式
方式一:make map
在定义map时,可以通过make创建指定初始容量的map。如下:
package main
import (
"fmt"
"unsafe"
)
func main() {
// 方式一:make map
var m = make(map[string]string, 10)
fmt.Printf("m = %v\n", m) // m = map[]
fmt.Printf("m len = %v\n", len(m)) // m len = 0
fmt.Printf("m size = %d\n", unsafe.Sizeof(m)) // m size = 8
}
说明一下:
- map定义后需要先通过make函数分配内存空间,然后才能使用。make是Go中的内建函数,可以用于分配并初始化一个map,其第一个参数表示map的类型,第二个参数表示初始容量,第二个参数若省略则使用默认的初始容量。
- 在调用make函数创建map时提供初始容量,以便底层哈希表开辟足够多的哈希桶,这样可以避免后续在插入键值对时哈希表的频繁扩容(重新哈希),从而提高性能。
- 通过len函数可以获取map中键值对的数量,但无法通过cap函数获取map的容量,map底层的哈希表会自动扩容以适应需要存储的键值对数量。
方式二:指定具体的键值对
在定义map时,也可以直接指定具体的键值对。如下:
package main
import (
"fmt"
)
func main() {
// 方式二:指定具体的键值对
var m = map[string]string{
"四川省": "川",
"陕西省": "陕",
"广东省": "粤",
}
fmt.Printf("m = %v\n", m) // m = map[四川省:川 广东省:粤 陕西省:陕]
fmt.