您对华为云开发者网站的整体评价?

非常不满意 非常满意

0

1

2

3

4

5

6

7

8

9

10

*您遇到了哪些问题?(最多选三项)
*您感到满意的原因是?(最多选三项)
*请针对您所遇到的问题给出具体的反馈
200/200

Go 语言入门很简单 -- 8. Go Maps #私藏项目实操分享#

举报
宇宙之一粟 发表于 2022/01/14 23:51:55 2022/01/14
1.5k+ 0 0
【摘要】 映射 映射也是 Go 内置的数据结构,用于存储键值对的无序集合。 也被称为关联数组、哈希表或字典。类似与查字典, 映射用于通过关键键查找关联的值。键是唯一的,键对应的值可以通过键来获取、更新或删除。 可以利用映射来检测一个键是否已经存在。值存储后,可以通过引用相关的键来调用映射...

映射

映射也是 Go 内置的数据结构,用于存储键值对的无序集合。

也被称为关联数组、哈希表字典。类似与查字典, 映射用于通过关键键查找关联的值。键是唯一的,键对应的值可以通过键来获取、更新或删除。 可以利用映射来检测一个键是否已经存在。值存储后,可以通过引用相关的键来调用映射的值。

Go 语言入门很简单 -- 8. Go Maps #私藏项目实操分享# _迭代

映射的定义

以下是 Go 中映射的定义:

var x map[string] int
        

映射类型由关键字 map 表示,后跟括号中的类型,最后是类型。

Go 语言入门很简单 -- 8. Go Maps #私藏项目实操分享# _golang_02

映射的散列表包含一组桶。在存储、删除或查找键值对的时候,所有的操作要先选择一个桶。把操作映射时指定的键传给映射的散列函数,就能选中对应的桶。这个散列函数的目的是生成一个索引,这个索引最终将键值对分布到所有可用的桶里。

如上图所示,桶的内部实现。映射使用两个数据结构来存储数据: 

  • 第一个数据结构是一个数组,内部存储的是用于选择桶的散列值的高八位值。这个数组用于区分每个键值对要存在哪个桶里。
  • 第二个数据结构是一个字节数组,用于存储键值对。改字节数组依次存储了这个桶里所有的键,之后一次存储了这个桶里所有的值。

这种键值对的存储方法的目的:减少每个桶里所需的内存

Go 语言入门很简单 -- 8. Go Maps #私藏项目实操分享# _键值对_03

类似于数组和切片,同样可以使用中括号 ​​​​[]​​​​ 来访问映射,

package mainimport "fmt"func main() {    my_map := make(map[string]int)  // 创建一个从string到int的    my_map["小李"] = 18    my_map["老张"] = 50    fmt.Println(my_map)    fmt.Printf("老张今年%d岁.", my_map["老张"])}
        

运行该代码,结果为:

map[小李:18 老张:50]老张今年50.
        

也可以使用 map 字面量来创建一个带初始化键值对元素的映射:

ages := map[string]int{    "小李": 18,    "老张": 30,    "老罗": 45}
        

可以使用内置函数 delete 来从字典中根据键移除一个元素:

​delete(ages, "老张") // 删除 ages["老张"]​​ 

映射遍历

可以使用 ​​for...range​​ 循环来遍历 map 中所有的键和对应的值,就像遍历 slice 一样。在每次迭代中获得键值对,但是每一次遍历可能会不一样,即迭代顺序是随机的。

package mainimport "fmt"func main() {    ages := map[string]int{        "小李": 18,        "老张": 30,        "老罗": 45,    }    for name, age := range ages {        fmt.Println(name, age)    }}
        

运行结果为:

小李 18老张 30老罗 45
        

映射排序

映射中元素的迭代顺序是不固定的,不同的实现方法会使用不同的散列算法,得到不同的元素顺序。如果需要按照某种顺序来遍历映射中的元素,可以显式的给键排序。

像上述的例子中,键是字符串类型,可以使用 sort 包中的 Strings 函数来进行键的排序:

package mainimport (    "fmt"    "sort")func main() {    var names []string    ages := map[string]int{        "小李": 18,        "老张": 30,        "老罗": 45,    }    for name, age := range ages {        fmt.Println(name, age)    }    fmt.Println("--- 排序后 ---")    for name := range ages {        names = append(names, name)    }    sort.Strings(names)    for _, name := range names {        fmt.Printf("%s\t%d\n", name, ages[name])    }}
        

运行后,得到结果:

老罗 45小李 18老张 30--- 排序后 ---小李  18老张  30老罗  45
        

映射是引用类型

映射也是引用类型。 将映射分配给新变量时,它们都引用相同的底层数据结构。 因此,一个变量更改,对另一个变量也会被相应的更改。 例子如下:

package mainimport (    "fmt")func main() {    var my_map = map[int]string{        64: "new Zealand",        3:  "Russia",        44: "UK",        61: "Australia",        81: "Japan",        91: "India",    }    fmt.Println("初始 map: ", my_map)    // 赋值给新 map    new_map := my_map    // 新 map 中进行添加    new_map[86] = "China"    new_map[33] = "France"    fmt.Println("new_map: ", new_map)    fmt.Println("修改后的初始 map: \n", my_map)}
        

运行结果:

初始 map:  map[3:Russia 44:UK 61:Australia 64:new Zealand 81:Japan 91:India]new_map:  map[3:Russia 33:France 44:UK 61:Australia 64:new Zealand 81:Japan 86:China 91:India]修改后的初始 map:  map[3:Russia 33:France 44:UK 61:Australia 64:new Zealand 81:Japan 86:China 91:India]
        

总结

Map 是 Golang 中键值对的无序集合。键在映射中是唯一的,但值可能不是。它被广泛使用,因为它提供了可以在键的帮助下检索、更新或删除的快速查找和值。

在 Golang 中,映射也称为关联数组、哈希表或字典。 映射用于通过其关联的键查找值。

一个映射的零值是 nil 并且一个 nil 映射没有键。 因此,任何将键添加到 nil 映射的尝试都将导致运行时错误。

在 Go 中,您可以使用内置的 make() 函数初始化映射。 它就会返回一个已初始化并可随时使用的映射。

可以使用 Go 编程语言中 for...range 循环的范围形式迭代映射。

在 Golang 中,映射是一个无序集合,因此,不能保证每次迭代时映射的迭代顺序都相同。因此,如果您多次运行任何程序,您将获得不同顺序的结果。

Maps 是 Golang 中的引用类型。 将映射分配给新变量时,它们都引用相同的底层数据结构。 因此,一个变量所做的更改,另一个变量相应会被更改。

Refenrence: 《Go 语言实战》-- 4.3 映射的内部实现和基础功能

文章来源: blog.csdn.net,作者:宇宙之一粟,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/yuzhou_1shu/article/details/122476838

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。