GoLang基础数据类型--->字典(map)详解

yinzhengjie · · 11467 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

                   GoLang基础数据类型--->字典(map)详解

                                            作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

   可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是函数吗?学过python的小伙伴可能会想到map这个函数。其实它就是Golang中的字典。下面跟我一起看看它的特性吧。map 也就是 Python 中字典的概念,它的格式为“map[keyType]valueType”。 map 的读取和设置也类似 slice 一样,通过 key 来操作,只是 slice 的index 只能是`int`类型,而 map 多了很多类型,可以是 int ,可以是 string及所有完全定义了 == 与 != 操作的类型。

 

一.map的赋值方式

1.先的声明再初始化最后赋值

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12     "reflect"
13 )
14 
15 func main() {
16     var yinzhengjie map[string]string //先声明一个字典(map)名字叫做yinzhengjie。其key所对应的数据类型是“string”[字符串],value所对应的数据类型也是“string”。
17     fmt.Printf("判断yinzhengjie字典是否为空:【%v】\n",yinzhengjie == nil)  //声明的字典,默认为空,需要用make进行初始化操作(map是引用类型,未初始化的是指向nil,初始化了以后应该就有自己的内存空间了,所以不是nil。)所以返回值为空。
18     fmt.Printf("第一次查看yinzhengjie字典的值:【%v】\n",yinzhengjie)
19     yinzhengjie = make(map[string]string) //再使用make函数进行初始化创建一个非nil的map,nil map不能赋值,如果直接赋值会报错:“panic: assignment to entry in nil map”
20     fmt.Printf("再次判断yinzhengjie字典是否为空:【%v】\n",yinzhengjie == nil) //你就把它理解为一个指针,没初始化就是nil,make之后分配内存了,一旦分配了内存地址就不为空了
21     fmt.Printf("第二次查看yinzhengjie字典的值:【%v】\n",yinzhengjie)
22     yinzhengjie["name"] = "尹正杰"
23     fmt.Printf("yinzhengjie字典的类型为:【%v】\n",reflect.TypeOf(yinzhengjie))
24     fmt.Printf("第三次查看yinzhengjie字典的值:【%v】\n",yinzhengjie)
25 }
26 
27 
28 
29 #以上代码执行结果如下:
30 判断yinzhengjie字典是否为空:【true】
31 第一次查看yinzhengjie字典的值:【map[]】
32 再次判断yinzhengjie字典是否为空:【false】
33 第二次查看yinzhengjie字典的值:【map[]】
34 yinzhengjie字典的类型为:【map[string]string】
35 第三次查看yinzhengjie字典的值:【map[name:尹正杰]】

 

2.直接make进行初始化之后再赋值

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[string]int) //表示创建一个key为string,value的值为int的数据类型。
14     yinzhengjie["yzj"] = 25
15     fmt.Println(yinzhengjie)
16 }
17 
18 
19 
20 #以上代码执行结果如下:
21 map[yzj:25]

3.直接初始化赋值

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := map[string]int{
14         "尹正杰":18,
15         "饼干":20,
16     }
17     fmt.Println(yinzhengjie)
18 }
19 
20 
21 
22 #以上代码执行结果如下:
23 map[尹正杰:18 饼干:20]

 

二.map的增删改查

1.字典的赋值操作

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         yinzhengjie[k] = v
17     }
18     fmt.Println(yinzhengjie) //注意,字典是无序的哟!
19 }
20 
21 
22 
23 
24 #以上代码执行结果如下:
25 map[7:h 0:a 1:b 2:c 3:d 4:e 5:f 6:g]

2.字典的删除操作

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         //fmt.Println(k,v)
17         yinzhengjie[k] = v
18     }
19     fmt.Println(yinzhengjie) //注意,字典是无序的哟!
20 
21     for i:=0;i<4 ;i++  {
22         delete(yinzhengjie,i)  //删除字典中key所对应的value.1
23     }
24     fmt.Println(yinzhengjie)
25 
26     for k := range yinzhengjie{
27         delete(yinzhengjie,k) //删除整个字典的数据
28     }
29     fmt.Println(yinzhengjie)
30     fmt.Println(yinzhengjie==nil) //字典的“壳子”还在,空字典也是有地址的。所以返回值是false!
31 }
32 
33 
34 
35 #以上代码执行结果如下:
36 删除之前的样子:【map[5:f 6:g 7:h 0:a 1:b 2:c 3:d 4:e]】
37 第一次删除之后的样子:【map[5:f 6:g 7:h 4:e]】
38 第二次删除之后的样子:【map[]】
39 字典被清空之后是否为空:【false】

 3.字典的修改操作

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         //fmt.Println(k,v)
17         yinzhengjie[k] = v
18     }
19     fmt.Printf("修改之前的样子:【%v】\n",yinzhengjie)
20     yzj := yinzhengjie //map是一种引用类型,如果两个map同时指向一个底层,那么一个改变,另一个也相应的改变。
21     yzj[0] = "尹正杰"  //修改字典下标所对应的值。
22     yzj[1] = "yinzhengjie"
23     fmt.Printf("修改之后的样子:【%v】\n",yinzhengjie)//注意,字典是无序的哟!
24 }
25 
26 
27 
28 #以上代码执行结果如下:
29 修改之前的样子:【map[0:a 1:b 2:c 3:d 4:e 5:f 6:g 7:h]】
30 修改之后的样子:【map[7:h 0:尹正杰 1:yinzhengjie 2:c 3:d 4:e 5:f 6:g]】

4.字典的查询方式

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         yinzhengjie[k] = v
17     }
18     fmt.Println(yinzhengjie) //注意,字典是无序的哟!我下面之所以通过循环遍历,是因为的确存在哪些key哟!
19 
20     for i,j := range yinzhengjie{  //遍历key和value。
21         fmt.Println("key=",i,"value=",j)
22     }
23 
24     for i := range yinzhengjie{ //只遍历key
25         fmt.Println(i)
26     }
27 }
28 
29 
30 
31 
32 #以上代码执行结果如下:
33 map[3:d 4:e 5:f 6:g 7:h 0:a 1:b 2:c]
34 key= 6 value= g
35 key= 7 value= h
36 key= 0 value= a
37 key= 1 value= b
38 key= 2 value= c
39 key= 3 value= d
40 key= 4 value= e
41 key= 5 value= f
42 3
43 4
44 5
45 6
46 7
47 0
48 1
49 2

 

三.map的常用技巧

1.判断map键值是否存在

 

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         yinzhengjie[k] = v
17     }
18     fmt.Printf("字典中的值为:【%v】\n",yinzhengjie) //注意,字典是无序的哟!
19     if v, ok := yinzhengjie[1]; ok {
20         fmt.Println("存在key=",v)
21     }else {
22         fmt.Println("没有找到key=",v)
23     }
24 
25     v ,ok := yinzhengjie[1]
26     if ok {
27         fmt.Println("再一次确认,已经存在key=",v)
28     }else {
29         fmt.Println("再一次确认,没有找到key=",v)
30     }
31 }
32 
33 
34 
35 
36 #以上代码执行结果如下:
37 字典中的值为:【map[3:d 4:e 5:f 6:g 7:h 0:a 1:b 2:c]】
38 存在key= b
39 再一次确认,已经存在key= b

 

2.map的排序

  我们都知道字典的默认都是无需的,但是我们可以借用标准库的包来进行基于字母或数字的顺序来排序,从而达到我们想要的结果,我们就以2016全球计算机语言排行前十的案例来展示吧:

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12     "sort"
13 )
14 
15 func main() {
16     var ProgramingLanguage = map[string]int{
17         "Java":                    0,
18         "C":                         1,
19         "C++":                           2,
20         "Python":                   3,
21         "C#":                          4,
22         "PHP":                       5,
23         "JavaScript":             6,
24         "Visual Basic.NET":         7,
25         "Perl":                       8,
26         "Assembly language":       9,
27         "Ruby":                      10,
28     }
29     var SortString []string
30     for k := range ProgramingLanguage {
31         SortString = append(SortString, k)
32     }
33     sort.Strings(SortString)  //会根据字母的顺序进行排序。
34     for _, k := range SortString {
35         fmt.Println("Key:", k, "Value:", ProgramingLanguage[k])
36     }
37 }
38 
39 
40 
41 #以上代码执行结果如下:
42 Key: Assembly language Value: 9
43 Key: C Value: 1
44 Key: C# Value: 4
45 Key: C++ Value: 2
46 Key: Java Value: 0
47 Key: JavaScript Value: 6
48 Key: PHP Value: 5
49 Key: Perl Value: 8
50 Key: Python Value: 3
51 Key: Ruby Value: 10
52 Key: Visual Basic.NET Value: 7

3.map的嵌套

 

4.二维字典用法展示

 

 

 

四.map的进阶知识

 


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:yinzhengjie

查看原文:GoLang基础数据类型--->字典(map)详解

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

11467 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传