千家信息网

Go语言映射内部怎么实现及基础功能有哪些

发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,这篇文章主要介绍"Go语言映射内部怎么实现及基础功能有哪些",在日常操作中,相信很多人在Go语言映射内部怎么实现及基础功能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2024年09月21日Go语言映射内部怎么实现及基础功能有哪些

这篇文章主要介绍"Go语言映射内部怎么实现及基础功能有哪些",在日常操作中,相信很多人在Go语言映射内部怎么实现及基础功能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Go语言映射内部怎么实现及基础功能有哪些"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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

映射是一种数据结构,是用于存储一系列无序的键值对。类比Java里的Map,Python里的字典,可以理解为以哈希值做索引,期望索引可以在一定的连续内存范围内的类似数组的数据结构。

映射里基于键来存储值。映射功能强大的地方是,能够基于键快速检索数据。键就像索引一样,指向与该键关联的值。

内部实现

映射是一个集合,可以使用类似处理数组和切片的方式迭代映射中的元素。但映射是无序的集合,无序的原因是映射的实现使用了散列表.

映射的散列表包含一组桶。

在存储、删除或者查找键值对的时候,所有操作都要先选择一个桶。把操作映射时指定的键传给映射的散列函数,就能选中对应的桶。

这个散列函数的目的是生成一个索引,这个索引最终将键值对分布到所有可用的桶里。对 Go 语言的映射来说,生成的散列键的一部分,具体来说是低位(LOB),被用来选择桶。

桶的内部实现。映射使用两个数据结构来存储数据,

第一个是数组,内部存储用于选择桶的散列键的高八位值。用于区分每个键值对要存在桶里的那一项。第二个是字节数组,用于存储键值对。该字节数组先依次存储了这个桶里所有的键,之后依次存储了这个桶里所有的值。实现这种键值对的存储方式目的在于减少每个桶所需的内存。

映射存储的增加,索引分布越均匀,访问键值对的速度就越快,随着映射存储的增加,索引分布越均匀,访问键值对的速度就越快。映射通过合理数量的桶来平衡键值对的分布

创建和初始化

Go 语言中有很多种方法可以创建并初始化映射,可以使用内置的make 函数,也可以使用映射字面量。

package mainimport (        "fmt")func main() {        // 创建一个映射,键的类型是 string,值的类型是 int        dict := make(map[string]int)        // 创建一个映射,键和值的类型都是 string        // 使用两个键值对初始化映射        dict_ := map[string]string{"Red": "#da1337", "Orange": "#e95a22"}        fmt.Println(dict)        fmt.Print(dict_)}======map[]map[Orange:#e95a22 Red:#da1337]

创建映射时,更常用的方法是使用映射字面量。映射的初始长度会根据初始化时指定的键值对的数量来确定。

映射的键可以是任何值。这个值的类型可以是内置的类型,也可以是结构类型,只要这个值可以使用==运算符做比较

切片、函数以及包含切片的结构类型由于具有引用语义,不能作为映射的键,使用这些类型会造成编译错误

package mainimport (        "fmt")func main() {        // 创建一个映射,使用字符串切片作为映射的键        dict := map[[]string]int{}        fmt.Println(dict)}====[Running] go run "d:\GolandProjects\code-master\demo\hello.go"# command-line-argumentsdemo\hello.go:10:45: duplicate key "Red" in map literal        previous key at demo\hello.go:10:28[Done] exited with code=2 in 0.902 seconds

声明一个存储字符串切片的映射

// 创建一个映射,使用字符串切片作为值dict := map[int][]string{}

使用映射

键值对赋值给映射,是通过指定适当类型的键并给这个键赋一个值来完成的

为映射赋值

// 创建一个空映射,用来存储颜色以及颜色对应的十六进制代码colors := map[string]string{}// 将 Red 的代码加入到映射colors["Red"] = "#da1337"

可以通过声明一个未初始化的映射来创建一个值为nil的映射,不能用于存储键值对.

// 创建一个空映射,用来存储颜色以及颜色对应的十六进制代码colors := map[string]string{}// 将 Red 的代码加入到映射colors["Red"] = "#da1337"

从映射取值时有两个选择:

第一个选择是,可以同时获得值,以及一个表示这个键是否存在的标志,

从映射获取值并判断键是否存在

// 获取键 Blue 对应的值value := colors["Blue"]// 这个键存在吗?if value != "" {fmt.Println(value)}

另一个选择是,只返回键对应的值,然后通过判断这个值是不是零值来确定键是否存在

从映射获取值,并通过该值判断键是否存在

// 获取键 Blue 对应的值value := colors["Blue"]// 这个键存在吗?if value != "" {fmt.Println(value)}

在Go语言里,通过键来索引映射时,即便这个键不存在也总会返回一个值。在这种情况下,返回的是该值对应的类型的零值

迭代映射里的所有值和迭代数组或切片一样,使用关键字 range

使用range 迭代映射

// 创建一个映射,存储颜色以及颜色对应的十六进制代码colors := map[string]string{"AliceBlue": "#f0f8ff","Coral": "#ff7F50","DarkGray": "#a9a9a9","ForestGreen": "#228b22",}// 显示映射里的所有颜色for key, value := range colors {fmt.Printf("Key: %s Value: %s\n", key, value)}// 创建一个映射,存储颜色以及颜色对应的十六进制代码colors := map[string]string{"AliceBlue": "#f0f8ff","Coral": "#ff7F50","DarkGray": "#a9a9a9","ForestGreen": "#228b22",}// 显示映射里的所有颜色for key, value := range colors {        fmt.Printf("Key: %s Value: %s\n", key, value)}

想把一个键值对从映射里删除,就使用内置的delete 函数

从映射中删除一项

// 删除键为 Coral 的键值对delete(colors, "Coral")// 显示映射里的所有颜色for key, value := range colors {fmt.Printf("Key: %s Value: %s\n", key, value)}// 删除键为 Coral 的键值对delete(colors, "Coral")// 显示映射里的所有颜色for key, value := range colors {        fmt.Printf("Key: %s Value: %s\n", key, value)}

在函数间传递映射

在函数间传递映射并不会制造出该映射的一个副本。实际上,当传递映射给一个函数,并对这个映射做了修改时,所有对这个映射的引用都会察觉到这个修改,这个特性和切片类似,保证可以用很小的成本来复制映射

package mainimport ("fmt")func main() {// 创建一个映射,存储颜色以及颜色对应的十六进制代码colors := map[string]string{"AliceBlue": "#f0f8ff","Coral": "#ff7F50","DarkGray": "#a9a9a9","ForestGreen": "#228b22",}// 显示映射里的所有颜色for key, value := range colors {fmt.Printf("Key: %s Value: %s\n", key, value)}fmt.Println("调用函数来移除指定的键")// 调用函数来移除指定的键removeColor(colors, "Coral")// 显示映射里的所有颜色for key, value := range colors {fmt.Printf("Key: %s Value: %s\n", key, value)}}// removeColor 将指定映射里的键删除func removeColor(colors map[string]string, key string) {delete(colors, key)}package mainimport (        "fmt")func main() {        // 创建一个映射,存储颜色以及颜色对应的十六进制代码        colors := map[string]string{                "AliceBlue":   "#f0f8ff",                "Coral":       "#ff7F50",                "DarkGray":    "#a9a9a9",                "ForestGreen": "#228b22",        }        // 显示映射里的所有颜色        for key, value := range colors {                fmt.Printf("Key: %s Value: %s\n", key, value)        }        fmt.Println("调用函数来移除指定的键")        // 调用函数来移除指定的键        removeColor(colors, "Coral")                // 显示映射里的所有颜色        for key, value := range colors {                fmt.Printf("Key: %s Value: %s\n", key, value)        }}// removeColor 将指定映射里的键删除func removeColor(colors map[string]string, key string) {        delete(colors, key)}
[Running] go run "d:\GolandProjects\code-master\demo\hello.go"Key: Coral Value: #ff7F50Key: DarkGray Value: #a9a9a9Key: ForestGreen Value: #228b22Key: AliceBlue Value: #f0f8ff调用函数来移除指定的键Key: AliceBlue Value: #f0f8ffKey: DarkGray Value: #a9a9a9Key: ForestGreen Value: #228b22[Done] exited with code=0 in 1.419 seconds

映射的增长没有容量或者任何限制。同时内置函数 len可以用来获取切片或者映射的长度。但是内置函数 cap只能用于切片。

到此,关于"Go语言映射内部怎么实现及基础功能有哪些"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

颜色 存储 函数 类型 代码 索引 语言 功能 十六进制 数组 选择 基础 数据 结构 学习 两个 字符 字符串 数据结构 方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机二级网络安全素质教育题库 mysql查看数据库的表数据 乐尚软件开发有限公司靠谱 免费手机代理服务器 金铲铲此服务器证书无效 网络安全审计工作在开展中 网络安全审核规定 网络安全词猜灯谜 网络安全保卫工作如何 微信公众号网络安全防护 三级网络技术学习资料免费 网络安全管理的必要性及意义 武汉国际网络安全维护收费标准 上海工程软件开发维修 关于网络安全的单位 软件开发必知必会 快速搭建https服务器 保护数据库_防止 加强业务网络安全管理的通知 山西发展软件开发设计 厦门软件开发培训机构排名 教育科学出版社网络技术 网络安全主题课程观后感 软件开发的内聚耦合特性 联通网络技术大会原名 应用软件开发定制公司 原神天空岛数据库进不去 河南大学数据库 网络安全知识小报怎么画 汽车自动驾驶怎么连接网络安全
0