映射的内部实现和基础功能
映射是一种数据结构,用于存储一系列无序的键值对,实现基于键的快速检索数据
文章目录
1.内部实现
映射是一个存储键值对的无序集合
a. 可以使用类是处理数组和切片的方式迭代映射中的元素
b. 映射是无序的,每次迭代映射的顺序都有可能不一致
注:无序的原因是映射的实现使用了散列表
散列表
映射的散列表包含一组桶:
a. 在存储删除或者查找键值对的时候,所有的操作都要选择一个桶。操作时将指定的键传递给映射的散列函数,就能选中对应的桶
散列函数的作用是生成一个索引,并将键值对分布到所有的可用的桶里
随着映射存储的增加,索引分布越均匀,访问键值对的速度就越快
2. 创建和初始化
a. make函数声明映射
// 创建一个键为string值为int的映射
rain_dict := make(map[string]int)
// 输出结果:
// == rain_dict: map[]
b. 字面量声明映射
映射的初始长度很根据初始化时的键值对的数量来确定
1) 映射的键可以使任意值
切片、函数以及包含切片的结构类型,由于具有“引用语义”,不能作为键
2) 值的类型可以是内置的类型,也可以是可以用 == 运算符作比较的 结构类型
// 创建一个映射,并初始化数值
rain_dict_1 :=map[string]string{"china": "BeiJing", "america":"NewYork"}
// 输出结果:
// == rain_dict_1: map[america:NewYork china:BeiJing]
3. 使用映射
a. 映射赋值
// 创建一个空映射
rain_dict_2 := map[string]int{}
// 映射赋值
rain_dict_2["top"] = 5
rain_dict_2["right"] = 6
// 输出结果:
// == rain_dict_2: map[right:6 top:5]
b. nil映射
nil 映射不能存储键值对,否则会发生一个语法错误
// 声明式创建nil映射
var rain_dict_3 map[string]int
// nil 映射赋值
rain_dict_3["msit"] = 2
// 输出结果:
// panic: assignment to entry in nil map
c. 判断键值是否相互匹配
i. 同时获取值与这个值是否存在的标志
// 创建一个映射
rain_dict_4 := map[string]int{"Chinese": 98, "English": 86}
// 同时获取值和是否存在的标志
// value 零值(不存在),key bool
value, key := rain_dict_4["math"]
if key{
fmt.Printf("Both Value: %d", value)
}
d. 迭代映射
使用关键字range迭代映射
// 创建一个映射
rain_ditc_5 := map[string]int{"hight": 120, "width": 45, "kg": 48}
// 迭代打印键值对
for key, value := range rain_dict_5{
fmt.Printf("Key: %s, Value: %d, Key_addr: %X, Value_addr: %X", key, value, &key, &value)
}
// 输出结果:
// Key: hight, Value: 120, Key_addr: C0000521C0, Value_addr: C000066080
// Key: width, Value: 45, Key_addr: C0000521C0, Value_addr: C000066080
// Key: kg, Value: 48, Key_addr: C0000521C0, Value_addr: C000066080
删除一项元素
// 创建一个映射
rain_dict_6 := map[int]int{1:1, 2:2, 3:3}
// 删除key=2的元素
delete(rain_dict_5, 2)
// 输出结果:
// == Rain_dict_6: map[1:1 3:3]
4. 函数间传递映射
在函数间传递映射,并不会 复制映射作为副本
当对这个映射修改时,所有对这个映射的映射都会察觉到这个修改
package main
import "fmt"
func main() {
rain_dict_7 := map[string]int{"Chinese": 98, "English": 86, "Math": 90}
Rain_map_1(rain_dict_7)
Rain_map_2(rain_dict_7)
Rain_map_delete(rain_dict_7, "English")
fmt.Println("== rain_dict_7: ", rain_dict_7)
}
func Rain_map_1(rain map[string]int) {
rain["Physical"] = 71
fmt.Println("== Rain_map_1: ", rain)
}
func Rain_map_2(rain map[string]int) {
rain["Naturl"] = 82
fmt.Println("== Rain_map_2: ", rain)
}
func Rain_map_delete(rain map[string]int, key string){
fmt.Println("== Pre_delete_map: ", rain)
delete(rain, key)
}
// 输出结果:
// == Rain_map_1: map[Chinese:98 English:86 Math:90 Physical:71]
// == Rain_map_2: map[Chinese:98 English:86 Math:90 Naturl:82 Physical:71]
// == Pre_delete_map: map[Chinese:98 English:86 Math:90 Naturl:82 Physical:71]
// == rain_dict_7: map[Chinese:98 Math:90 Naturl:82 Physical:71]