Go 映射

映射的内部实现和基础功能

映射是一种数据结构,用于存储一系列无序的键值对,实现基于键的快速检索数据

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]

参考:

Go语言程序设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值