Go 字典(Map)
比较熟悉 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)相关推荐
- python3字典菜鸟教程_Python3 字典(map)
ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ...
- Go 学习笔记(12)— 字典map定义、初始化、读取字典、删除字典、清空字典、map 按 key 进行有序遍历
Go 中字典也叫做 map , map 是一种无序的键值对的集合. map 最重要的一点是通过 key 来快速检索数据, key 类似于索引,指向数据的值. 1. 字典定义 可以使用内建函数 make ...
- golang数据结构初探之字典map
Map Go语言的map底层使用Hash表实现的 特性预览 操作方式 初始化 map分别支持字面量初始化和内置函数make()初始化 字面量初始化 func MapInit() {m := map[s ...
- Set、Map、和WeakSet、WeakMap
文章目录 集合(Set) Set 实例属性 constructor size Set 实例方法 操作方法 遍历方法 WeakSet 字典 Map Map 的属性 constructor size 操作 ...
- python中map函数运行原理_Python中map函数的解释和可视化
先重温一下迭代(Iteration).迭代器对象(iterable).迭代器(iterator )的概念: Iteration是计算机科学的通用术语,它是指对一组元素执行一项操作,一次执行一个元素.一 ...
- python 底层原理_Python字典的核心底层原理讲解
字典对象的核心是散列表.散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket.每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用.所有 bucket 结构和 ...
- python对键和值有没有类型限制_第026课:词典:索引不易使用时2,讲,字典,当,不好...
测试题 0. Python的字典是否支持一键(Key)多值(Value)? 答:不支持,对相同的键再次赋值会将上一次的值直接覆盖. >>> dict1 = {1:'one', 1:' ...
- Go语言的复合数据类型struct,array,slice,map
1.结构体 struct 定义格式: type 结构体名称 struct {属性1 类型属性2 类型... } 结构体的初始化可以使用new关键词和var关键词,不同的是如果使用new,则返回类型是一 ...
- 若依@Excel注解自动获取导出字段,字典解析
若依系统中实体类导出字段使用了@Execl 若不是若依系统 最后附有excel接口 如导出加上@Excel(name = "字段名") 需要导出数值的中文解析 则加上dictTyp ...
最新文章
- 英媒:人工智能终于接近人类智能了吗?
- Win7下JDK环境变量设置批处理(转)
- jsp 修改的员工select怎么_SpringBoot+Mybatis+Jsp 员工管理系统
- 用户自定义一个异常,编程创建并抛出某个异常类的实例。运行该程序并观察执行结果。
- 人工智能 | SLAM与Visual Odometry技术综述(浙江大学智能系统和控制研究所)
- lixuxmint系统定制与配置(4)-应用安装
- 如何激活React的跟踪模式和打开日志记录
- java程会释放锁join_关于join() 是否会释放锁的一些思考
- Ecstore中的微信支付怎么样配置
- 网络通信基础——网络协议
- c语言最新标准c22,C++20标准(c++标准手册) 官方最新版PDF
- 论文笔记4 --(ReID)Re-ranking Person Re-identification with k-reciprocal Encoding
- 电力能耗监测在山东青岛机场的应用
- 如何把苍白的一年写成耀眼的年终报告?写完当场加薪的那种
- 极客时间《数据分析实战45讲 - 基础篇》学习笔记
- Photoshop CC 2017安装
- 行人跟踪之身份识别(三)
- 【uoj#311】[UNR #2]积劳成疾 dp
- 用POI实现word转html,用到的jar包
- 深富策略:极限反转 行情反攻开启
热门文章
- 帆软报表在已经搭载服务器上开发_史上最全企业数据产品选型对比(含数仓、报表、BI、中台、数据治理)...
- 如何安装微信支付证书到服务器,微信支付如何安装操作证书?
- 运行c_const 并不能加快 C 代码的运行速度?
- nginx .conf
- 1.8带有神经网络的梯度消失
- 2.5 网络中的网络以及 1×1 卷积
- numeric.js
- 鸿蒙系统是不是推迟发布了,鸿蒙系统2.0来了,华为Mate40推迟发布
- VMware vSAN 技术详解 | 资料
- Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题