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的进阶知识
有疑问加站长微信联系(非本文作者)