比较熟悉 Python 的对于字典肯定不会陌生,在 Go 中 map 就是 Python 中字典的概念,它的基本格式是

map[keyType]valueType 。map 的读取和设置和 slice 比较相似,只不过 map 中是通过 key 操作,而 slice

是通过 index 操作,index 只能是 int 类型,map 的 key 可以是 int 、string等类型。

字典的赋值方式

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

package mainimport "fmt"func main() {// 先声明一个字典,key类型为string value类型为stringvar m1 map[string]string// 只声明不赋值的map,零值为nil,此时不能给map赋值if m1 == nil {// 使用 make 函数对map初始化m1 = make(map[string]string)}if m1 != nil {// 输出 map[]fmt.Println(m1)// 赋值操作m1["name"] = "xiaoming"fmt.Println(m1)}
} 

输出结果

[root@VM_81_181_centos golang]# go run map01.go
map[]
map[name:xiaoming]

2.使用 make 初始化之后再赋值

package mainimport "fmt"func main() {// 使用 make 直接初始化m1 := make(map[string]int)m1["age"] = 23fmt.Println(m1)
} 

输出结果

[root@VM_81_181_centos golang]# go run map02.go
map[age:23]

3.直接初始化赋值

package mainimport "fmt"func main() {m1 := map[string]string{"name":"xiaoming","hobby":"football",}fmt.Println(m1)
}

输出结果

[root@VM_81_181_centos golang]# go run map03.go
map[name:xiaoming hobby:football]

 字典的遍历

字典遍历提供了两种方式,一种是需要携带 value,另一种是只需要 key,需要使用 range 关键字

package mainimport "fmt"func main() {fruits := map[string]int{"apple":2,"banana":5,"orange":8,}// 需要携带 valuefor name,score := range fruits{fmt.Println(name, score)}// 只需要keyfor name := range fruits{fmt.Println(name)}}

输出结果

[root@VM_81_181_centos golang]# go run map04.go
apple 2
banana 5
orange 8
#########
apple
banana
orange

在 Go 中没有提供类似 keys() 和 values() 这样的方法,如果我们想获取 key 和 value 的列表需要自己循环

package mainimport "fmt"func main() {fruits := map[string]int{"apple":2,"banana":5,"orange":8,}names := make([]string,0,len(fruits))scores := make([]int,0,len(fruits))for name,score := range fruits{names = append(names,name)scores = append(scores,score)}fmt.Println(names,scores)
}

输出结果

[root@VM_81_181_centos golang]# go run map05.go
[apple banana orange] [2 5 8]

字典的读写

package mainimport "fmt"func main() {fruits := map[string]int {"apple": 2,"banana": 5,"orange": 8,}// 读fmt.Println(fruits["apple"])// 增加或修改fruits["pear"] = 9fmt.Println(fruits)// 删除delete(fruits, "pear")fmt.Println(fruits)
}

输出结果

[root@VM_81_181_centos golang]# go run map08.go
2
map[banana:5 orange:8 pear:9 apple:2]
map[apple:2 banana:5 orange:8]

字典的多态返回值

在上面的实例中已经可以知道通过 val1 = map1[key1] 的方法获取 key1 对应的值 val1。如果 map 中不存在 key1,

val1 就是一个值类型的空值。那么,此时就会出现一个问题 key1 是不存在还是 key1 对应的值就是空值?

下面介绍一种方式判断 map 中 key 是否存在: val1 , isPresent = map1[key1] ,isPresent 返回一个 bool 值:如果

key1 存在,val1 就是 key1 对应的 value 值,并且 isPresent 为 true;如果 key1 不存在,val1 就是一个空值,并且 isPresent

返回 false。

如果只是想判断某个 key 是否存在而不关心它对应的值到底是多少,可以这样做:

_,ok = map1[key1]// 如果 key1 存在,ok == true 否在 ok == false

  或者和 if 混合使用

if _,ok := map1[key1];ok {//....
}

 从 map1 中删除 key1,直接 delete(map1,key1),如果 key1 不存在,该操作也不会报错

package mainimport "fmt"func main() {map1 := make(map[string]int)map1["New Delhi"] = 55map1["Beijing"] = 20map1["Washington"] = 25value,isPresent := map1["Beijing"]if isPresent {fmt.Printf("The value of \"Beijin\" in map1 is: %d\n", value)} else {fmt.Printf("map1 does not contain Beijing")}// 删除元素delete(map1,"Washington")value,isPresent = map1["Washington"]if isPresent {fmt.Printf("The value of \"Washington\" in map1 is: %d\n", value)} else {fmt.Println("map1 does not contain Washington")}
}

输出结果

[root@VM_81_181_centos golang]# go run map09.go
The value of "Beijin" in map1 is: 20
map1 does not contain Washington
[root@VM_81_181_centos golang]# 

字典的排序

   字典默认是无序的,如果想要为 map 排序,需要将 key (或者value) 拷贝至一个切片中,再对切片排序,然后可以使用

切片的 for-range 方法打印所有的 key 和 value

package mainimport ("fmt""sort"
)func main() {barVal := map[string]int{"alpha": 34,"bravo": 56,"charlie": 23,"delta": 87,"echo": 56,"foxtrot": 12,"golf": 34,"hotel": 16,"indio": 87,"juliet": 65,"kili": 43,"lima": 98,}fmt.Println("unsorted:")for key,value := range barVal{fmt.Printf("Key: %v, Value: %v / ", key, value)}// 创建切片keys := make([]string,len(barVal))i := 0for k,_ := range barVal{keys[i] = ki++}sort.Strings(keys)fmt.Println("sorted")for _,k := range keys{fmt.Printf("Key: %v, Value: %v / ", k, barVal[k])}
}

 输出结果

unsorted:
Key: kili, Value: 43 / Key: alpha, Value: 34 / Key: foxtrot, Value: 12 / Key: hotel, Value: 16 / Key: echo, Value: 56 / Key: golf, Value: 34 / Key: indio, Value: 87 / Key: juliet, Value: 65 / Key: lima,
Value: 98 / Key: bravo, Value: 56 / Key: charlie, Value: 23 / Key: delta, Value: 87 / sorted
Key: alpha, Value: 34 / Key: bravo, Value: 56 / Key: charlie, Value: 23 / Key: delta, Value: 87 / Key: echo, Value: 56 / Key: foxtrot, Value: 12 / Key: golf, Value: 34 / Key: hotel, Value: 16 / Key: indi
o, Value: 87 / Key: juliet, Value: 65 / Key: kili, Value: 43 / Key: lima, Value: 98 /

字典的键值对调

这里的键值对调是指调换 key 和 value ,首先能想到的方法就是构造另一个以原 map 的 key 作为 value,以原 map

的 value 作为 key 的 map,然后使用 for-range 遍历原 map 并导入新 map

package mainimport "fmt"func main() {originMap := map[string]int{"a":0,"b":0,"c":2,}fmt.Println(originMap)newMap := make(map[int]string)for key,value := range originMap{newMap[value] = key}fmt.Println(newMap)
}

输出结果

map[a:0 b:0 c:2]
map[2:c 0:b]

看输出结果,会发现上面的代码有一个大问题,如果原 map 的 value 不唯一,就会导致新 map 无法完全包含原 map 的

键值对,对于这个问题我们可以使用多值 map的方法解决:map[int][]string,用切片作为 map 的值

package mainimport "fmt"func main() {originMap := map[string]int{"a":0,"b":0,"c":2,}fmt.Println(originMap)newMap := make(map[int][]string)for key,value := range originMap{newMap[value] = append(newMap[value],key)}fmt.Println(newMap)
}

输出结果

map[b:0 c:2 a:0]
map[0:[a b] 2:[c]]

转载于:https://www.cnblogs.com/leeyongbard/p/10078723.html

Go 字典(Map)相关推荐

  1. python3字典菜鸟教程_Python3 字典(map)

    ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ...

  2. Go 学习笔记(12)— 字典map定义、初始化、读取字典、删除字典、清空字典、map 按 key 进行有序遍历

    Go 中字典也叫做 map , map 是一种无序的键值对的集合. map 最重要的一点是通过 key 来快速检索数据, key 类似于索引,指向数据的值. 1. 字典定义 可以使用内建函数 make ...

  3. golang数据结构初探之字典map

    Map Go语言的map底层使用Hash表实现的 特性预览 操作方式 初始化 map分别支持字面量初始化和内置函数make()初始化 字面量初始化 func MapInit() {m := map[s ...

  4. Set、Map、和WeakSet、WeakMap

    文章目录 集合(Set) Set 实例属性 constructor size Set 实例方法 操作方法 遍历方法 WeakSet 字典 Map Map 的属性 constructor size 操作 ...

  5. python中map函数运行原理_Python中map函数的解释和可视化

    先重温一下迭代(Iteration).迭代器对象(iterable).迭代器(iterator )的概念: Iteration是计算机科学的通用术语,它是指对一组元素执行一项操作,一次执行一个元素.一 ...

  6. python 底层原理_Python字典的核心底层原理讲解

    字典对象的核心是散列表.散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket.每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用.所有 bucket 结构和 ...

  7. python对键和值有没有类型限制_第026课:词典:索引不易使用时2,讲,字典,当,不好...

    测试题 0. Python的字典是否支持一键(Key)多值(Value)? 答:不支持,对相同的键再次赋值会将上一次的值直接覆盖. >>> dict1 = {1:'one', 1:' ...

  8. Go语言的复合数据类型struct,array,slice,map

    1.结构体 struct 定义格式: type 结构体名称 struct {属性1 类型属性2 类型... } 结构体的初始化可以使用new关键词和var关键词,不同的是如果使用new,则返回类型是一 ...

  9. 若依@Excel注解自动获取导出字段,字典解析

    若依系统中实体类导出字段使用了@Execl 若不是若依系统 最后附有excel接口 如导出加上@Excel(name = "字段名") 需要导出数值的中文解析 则加上dictTyp ...

最新文章

  1. 英媒:人工智能终于接近人类智能了吗?
  2. Win7下JDK环境变量设置批处理(转)
  3. jsp 修改的员工select怎么_SpringBoot+Mybatis+Jsp 员工管理系统
  4. 用户自定义一个异常,编程创建并抛出某个异常类的实例。运行该程序并观察执行结果。
  5. 人工智能 | SLAM与Visual Odometry技术综述(浙江大学智能系统和控制研究所)
  6. lixuxmint系统定制与配置(4)-应用安装
  7. 如何激活React的跟踪模式和打开日志记录
  8. java程会释放锁join_关于join() 是否会释放锁的一些思考
  9. Ecstore中的微信支付怎么样配置
  10. 网络通信基础——网络协议
  11. c语言最新标准c22,C++20标准(c++标准手册) 官方最新版PDF
  12. 论文笔记4 --(ReID)Re-ranking Person Re-identification with k-reciprocal Encoding
  13. 电力能耗监测在山东青岛机场的应用
  14. 如何把苍白的一年写成耀眼的年终报告?写完当场加薪的那种
  15. 极客时间《数据分析实战45讲 - 基础篇》学习笔记
  16. Photoshop CC 2017安装
  17. 行人跟踪之身份识别(三)
  18. 【uoj#311】[UNR #2]积劳成疾 dp
  19. 用POI实现word转html,用到的jar包
  20. 深富策略:极限反转 行情反攻开启

热门文章

  1. 帆软报表在已经搭载服务器上开发_史上最全企业数据产品选型对比(含数仓、报表、BI、中台、数据治理)...
  2. 如何安装微信支付证书到服务器,微信支付如何安装操作证书?
  3. 运行c_const 并不能加快 C 代码的运行速度?
  4. nginx .conf
  5. 1.8带有神经网络的梯度消失
  6. 2.5 网络中的网络以及 1×1 卷积
  7. numeric.js
  8. 鸿蒙系统是不是推迟发布了,鸿蒙系统2.0来了,华为Mate40推迟发布
  9. VMware vSAN 技术详解 | 资料
  10. Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题