iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Go语言映射内部怎么实现及基础功能有哪些
  • 676
分享到

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

2023-06-29 14:06:14 676人浏览 薄情痞子
摘要

这篇文章主要介绍“Go语言映射内部怎么实现及基础功能有哪些”,在日常操作中,相信很多人在Go语言映射内部怎么实现及基础功能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言映射内部怎么实现及基础功能

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

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

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

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

内部实现

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

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

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

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

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

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

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

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

创建和初始化

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

package mainimport ("fmt")func main() {// 创建一个映射,键的类型是 string,值的类型是 intdict := 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 literalprevious 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{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->"AliceBlue": "#f0f8ff","Coral": "#ff7F50","DarkGray": "#a9a9a9","ForestGreen": "#228b22",}// 显示映射里的所有颜色for key, value := range colors {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->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 {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->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() {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->// 创建一个映射,存储颜色以及颜色对应的十六进制代码colors := map[string]string{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->"AliceBlue": "#f0f8ff","Coral": "#ff7F50","DarkGray": "#a9a9a9","ForestGreen": "#228b22",}// 显示映射里的所有颜色for key, value := range colors {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->fmt.Printf("Key: %s Value: %s\n", key, value)}fmt.Println("调用函数来移除指定的键")// 调用函数来移除指定的键removeColor(colors, "Coral")// 显示映射里的所有颜色for key, value := range colors {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->fmt.Printf("Key: %s Value: %s\n", key, value)}}// removeColor 将指定映射里的键删除func removeColor(colors map[string]string, key string) {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->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语言映射内部怎么实现及基础功能有哪些

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

--结束END--

本文标题: Go语言映射内部怎么实现及基础功能有哪些

本文链接: https://www.lsjlt.com/news/325346.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言映射内部怎么实现及基础功能有哪些
    这篇文章主要介绍“Go语言映射内部怎么实现及基础功能有哪些”,在日常操作中,相信很多人在Go语言映射内部怎么实现及基础功能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言映射内部怎么实现及基础功能...
    99+
    2023-06-29
  • Go语言映射内部实现及基础功能实战
    目录写在前面映射的内部实现和基础功能内部实现创建和初始化使用映射在函数间传递映射 写在前面 嗯,学习GO,所以有了这篇文章博文内容为《GO语言实战》读书笔记之一主要涉及映射相关知识 ...
    99+
    2024-04-02
  • go语言实现的常用功能有哪些
    这篇“go语言实现的常用功能有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言实现的常用功能有哪些”文章吧。一、G...
    99+
    2023-07-05
  • 利用Go语言可以实现哪些功能?
    go 语言的优势:并发性: goroutine 提供轻量级并发,提高多核 cpu 性能。网络编程: net/http 库 упрощает 构建 web 服务器和客户端。数据结构: 内置...
    99+
    2024-04-03
    编程语言 go语言 docker 网络编程
  • JavaScript基础语法有哪些及怎么用
    本篇内容主要讲解“JavaScript基础语法有哪些及怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript基础语法有哪些及怎么用”吧!JavaScript 基本语法JS 与 ...
    99+
    2023-06-27
  • Go语言怎么实现均衡器功能
    这篇文章主要介绍了Go语言怎么实现均衡器功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言怎么实现均衡器功能文章都会有所收获,下面我们一起来看看吧。负载均衡负载均衡器就是一个能够对请求流量通过算法将请求...
    99+
    2023-07-06
  • go语言有哪些类型及怎么表示
    本篇内容主要讲解“go语言有哪些类型及怎么表示”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言有哪些类型及怎么表示”吧!go语言的类型有布尔型(bool)、整型(int8、byte、int...
    99+
    2023-07-04
  • Go语言中怎么实现tail命令的功能
    这篇文章主要讲解了“Go语言中怎么实现tail命令的功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中怎么实现tail命令的功能”吧!在 Go 语言中,我们可以使用 os 包和 b...
    99+
    2023-07-06
  • 怎么使用Go语言实现数据转发功能
    这篇文章主要介绍“怎么使用Go语言实现数据转发功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Go语言实现数据转发功能”文章能帮助大家解决问题。首先,我们需要考虑数据实体的格式。在许多情况...
    99+
    2023-07-06
  • C语言怎么实现单链表的基本功能
    本篇内容主要讲解“C语言怎么实现单链表的基本功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么实现单链表的基本功能”吧!首先简单了解一下链表的概念:要注意的是链表是一个结构体实现的一种...
    99+
    2023-06-21
  • 有哪些优秀的 Go 语言二维码生成库可以实现索引功能?
    随着移动互联网的普及,二维码已经成为了信息传递的重要方式之一。在很多场景下,我们需要生成二维码,并且将其与特定的信息进行关联,以便于用户扫描二维码后能够直接获取相关信息。在这种情况下,二维码的索引功能变得尤为重要,因为它能够帮助我们快速地找...
    99+
    2023-08-27
    二维码 索引 接口
  • 微信小程序常用功能有哪些及怎么实现
    本文小编为大家详细介绍“微信小程序常用功能有哪些及怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序常用功能有哪些及怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。微信小程序 getApp(...
    99+
    2023-07-04
  • 掌握Go语言的多功能性:适合实现哪些应用场景?
    掌握Go语言的多功能性:适合实现哪些应用场景? 随着信息技术的不断发展,编程语言也层出不穷。Go语言作为一种相对年轻的编程语言,其简洁高效的特点吸引了越来越多的开发者。Go语言诞生于2...
    99+
    2024-04-02
  • Android应用中怎么实现一个切换内置语言功能
    这篇文章给大家介绍Android应用中怎么实现一个切换内置语言功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、需求有时候应用需要在内部切换语言但又不影响系统的语言,比如是应用现在是中文的,系统语言也是中文的,我把...
    99+
    2023-05-31
    android roi
  • Go语言中的数据类型有哪些及类型间怎么转换
    这篇“Go语言中的数据类型有哪些及类型间怎么转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中的数据类型有哪些及类...
    99+
    2023-06-30
  • Android开发中怎么在App中实现一个内语言切换功能
    这期内容当中小编将会给大家带来有关Android开发中怎么在App中实现一个内语言切换功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代码实现:布局文件(Data-Binding模式),很简单就是两行文...
    99+
    2023-05-31
    app android pp
  • PHP怎么实现类似于C语言的文件读取及解析功能
    这篇文章主要介绍了PHP怎么实现类似于C语言的文件读取及解析功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP怎么实现类似于C语言的文件读取及解析功能文章都会有所收获,下面我们一起来看看吧。具体如下:$l...
    99+
    2023-06-08
  • 利用Go语言开发上门做菜系统的配送员位置实时监控功能有哪些创新之处?
    利用Go语言开发上门做菜系统的配送员位置实时监控功能有哪些创新之处?随着移动互联网的发展,外卖行业正变得日益兴盛。顾客不再愿意等待漫长的送餐时间,他们期望能够准确知道配送员的位置以提前安排好自己的时间。因此,在开发上门做菜系统时,添加配送员...
    99+
    2023-11-01
    实时监控 Go语言开发 配送员位置
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作