• 原文地址:Part 13: Maps
  • 原文作者:Naveen R
  • 译者:咔叽咔叽 转载请注明出处。

什么是 map

map 是 Go 中的内置类型,它将值与键相关联。可以使用相应的键查找该值。

怎么创建 map

可以指定键和值的类型,然后通过make函数来创建一个 map,语法为make(map[type of key]type of value)

personSalary := make(map[string]int)
复制代码

上面的代码创建了一个叫personSalary的 map,它的键的类型为string,值的类型为int

map 的零值为nil,如果你尝试给空 map 增加元素,运行时将会触发 panic,因此,必须使用make函数初始化 map。

package mainimport (  "fmt"
)func main() {  var personSalary map[string]intif personSalary == nil {fmt.Println("map is nil. Going to make one.")personSalary = make(map[string]int)}
}
复制代码

Run in playground

在上述代码中,personSalary是空的,所以必须用 make 函数初始化。该代码输出map is nil. Going to make one.

给 map 增加元素

给 map 增加元素的语法和数组一样,下面的代码将给personSalary增加新的元素。

package mainimport (  "fmt"
)func main() {  personSalary := make(map[string]int)personSalary["steve"] = 12000personSalary["jamie"] = 15000personSalary["mike"] = 9000fmt.Println("personSalary map contents:", personSalary)
}
复制代码

Run in playground

上面的程序将会输出,personSalary map contents: map[steve:12000 jamie:15000 mike:9000]

map 也可以在初始化的时候添加元素,

package mainimport (  "fmt"
)func main() {  personSalary := map[string]int {"steve": 12000,"jamie": 15000,}personSalary["mike"] = 9000fmt.Println("personSalary map contents:", personSalary)
}
复制代码

Run in playground

上面的程序声明了personSalary,并在声明过程中为它添加了两个元素。之后又添加了一个键为mike的元素。该程序输出

personSalary map contents: map[steve:12000 jamie:15000 mike:9000]
复制代码

键的类型并不仅仅是string。所有可比较的类型,如booleanintegerfloatcomplexstring,...也可以是键。如果你想了解有关类似类型的更多信息,请访问http://golang.org/ref/spec#Comparison_operators

访问 map 的元素

现在我们已经向 map 添加了一些元素,让我们学习如何访问它们。 map[key]是访问 map 元素的语法。


package mainimport (  "fmt"
)func main() {  personSalary := map[string]int{"steve": 12000,"jamie": 15000,}personSalary["mike"] = 9000employee := "jamie"fmt.Println("Salary of", employee, "is", personSalary[employee])
}
复制代码

Run in playground

上述程序非常简单。员工 Jamie 的工资被找到并打印出来。程序输出Salary of jamie is 15000.

如果元素不存在会发生什么?map 将返回该元素类型的零值。在personSalary的例子中,如果我们尝试访问当前不存在的元素,则返回int的零值 0。

package mainimport (  "fmt"
)func main() {  personSalary := map[string]int{"steve": 12000,"jamie": 15000,}personSalary["mike"] = 9000employee := "jamie"fmt.Println("Salary of", employee, "is", personSalary[employee])fmt.Println("Salary of joe is", personSalary["joe"])
}
复制代码

Run in playground

上面的程序将输出,

Salary of jamie is 15000
Salary of joe is 0
复制代码

上面的程序返回了 joe 的工资为 0,我们并没有得到 joe 不存在于personSalary中的信息。

如果我们想知道 map 中是否存在某个键,该怎么办?

value, ok := map[key]
复制代码

上面的语法就是找出 map 中是否存在某个键,如果oktrue的话,那就说明键存在,并且值为value。否则okfalsevalue为空。

package mainimport (  "fmt"
)func main() {  personSalary := map[string]int{"steve": 12000,"jamie": 15000,}personSalary["mike"] = 9000newEmp := "joe"value, ok := personSalary[newEmp]if ok == true {fmt.Println("Salary of", newEmp, "is", value)} else {fmt.Println(newEmp,"not found")}}
复制代码

Run in playground

上述程序的第 15 行,由于 joe 不存在,okfalse。因此程序输出

joe not found
复制代码

使用range for可以迭代所有的 map 元素。

package mainimport (  "fmt"
)func main() {  personSalary := map[string]int{"steve": 12000,"jamie": 15000,}personSalary["mike"] = 9000fmt.Println("All items of a map")for key, value := range personSalary {fmt.Printf("personSalary[%s] = %d\n", key, value)}}
复制代码

Run in playground

上述程序输出,

All items of a map
personSalary[mike] = 9000
personSalary[steve] = 12000
personSalary[jamie] = 15000
复制代码

一个重要的事实是,使用range for迭代获取元素的顺序,并不能保证结果每次相同。

删除元素

从 map 中删除一个 key 的语法为delete(map, key),删除函数不返回任何值。

package mainimport (  "fmt"
)func main() {  personSalary := map[string]int{"steve": 12000,"jamie": 15000,}personSalary["mike"] = 9000fmt.Println("map before deletion", personSalary)delete(personSalary, "steve")fmt.Println("map after deletion", personSalary)}
复制代码

Run in playground

上述程序删除 key 为 steve 的元素,程序输出

map before deletion map[steve:12000 jamie:15000 mike:9000]
map after deletion map[mike:9000 jamie:15000]
复制代码

map 的长度

可以使用len函数确定 map 的长度。

package mainimport (  "fmt"
)func main() {  personSalary := map[string]int{"steve": 12000,"jamie": 15000,}personSalary["mike"] = 9000fmt.Println("length is", len(personSalary))}
复制代码

Run in playground

上述程序使用len(personSalary)计算 map 的长度,输出,length is 3

map 是指针传递

和 slice 一样,map 也是指针传递的。将 map 赋值给新变量时,它们都指向相同的内部数据结构。因此修改一个会影响另外一个。

package mainimport (  "fmt"
)func main() {  personSalary := map[string]int{"steve": 12000,"jamie": 15000,}personSalary["mike"] = 9000fmt.Println("Original person salary", personSalary)newPersonSalary := personSalarynewPersonSalary["mike"] = 18000fmt.Println("Person salary changed", personSalary)}
复制代码

Run in playground

在上述代码的第 14 行,personSalary赋值给newPersonSalary。在下一行,mike 的工资被修改为 18000,personSalary中的薪水也会变成 18000。程序输出,

Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[steve:12000 jamie:15000 mike:18000]
复制代码

类似的,如果将 map 作为函数的接收者。当对函数内的 map 进行更改时,调用者将可以看到更改。

map 的等值比较

map 的等值比较不能使用==操作符,==操作符仅仅能用来检查该 map 是否为nil

package mainfunc main() {  map1 := map[string]int{"one": 1,"two": 2,}map2 := map1if map1 == map2 {}
}
复制代码

Run in playground

上述的代码将会抛出编译错误,invalid operation: map1 == map2 (map can only be compared to nil).

检查两个 map 是否相等的方法是逐个比较每个元素是否一样。为此编写一个函数是个不错的方法:)

转载于:https://juejin.im/post/5cb35e5de51d456e811d2688

[译] part 13: golang 映射 map相关推荐

  1. golang 映射 map 简介

    映射是一种数据结构,用于存储一系列无序的键值对,它基于键来存储值.映射的特点是能够基于键快速检索数据.键就像是数组的索引一样,指向与键关联的值. 与 C++.Java 等编程语言不同,在 Golang ...

  2. Go开发 之 容器(数组Array、切片slice、映射map、列表list)

    文章目录 0.唠唠叨叨 1.数组-Array 1.1.什么是数组 1.1.1.数组的声明 1.1.2.比较两个数组是否相等 1.1.3.示例 1.1.3.1.通过索引下标访问元素 1.1.3.2.数组 ...

  3. golang对map的理解

    一.map的基本介绍 map 是 key-value 数据结构,又称为字段或者关联数组.类似其它编程语言的集合 二.map的声明 var map 变量名 map[keytype]valuetyp ma ...

  4. 2021年大数据常用语言Scala(二十二):函数式编程 映射 map

    目录 映射 | map 用法 案例一 案例二 映射  map 集合的映射操作是将来在编写Spark/Flink用得最多的操作,是我们必须要掌握的.因为进行数据计算的时候,就是一个将一种数据类型转换为另 ...

  5. 元组Tuple、数组Array、映射Map

    一.元组Tuple 元组Tuple是不同类型的值的聚集,元组的值将单个的值包含在圆括号中来构成,元组可以包含一个不同类型的元素 如 val riple = (100, "Scala" ...

  6. golang 中 map 转 struct

    golang 中 map 转 struct package mainimport ("fmt""github.com/goinggo/mapstructure" ...

  7. golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的

    Golang中Map的底层结构 其实提到Map,一般想到的底层实现就是哈希表,哈希表的结构主要是Hashcode + 数组. 存储kv时,首先将k通过hashcode后对数组长度取余,决定需要放入的数 ...

  8. Golang笔记——map

    map 的基本介绍 map 是 key-value 数据结构,又称为字段或者关联数组.类似其它编程语言的集合, 在编程中是经常使用到 map 的声明 基本语法 var map 变量名 map[keyt ...

  9. js中数据结构数组Array、映射Map、集合Set、对象、JSON

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js中数据结构 js中原生自带的数据结构比较简单,主要有数组Array.映射Map.集合Set.我们可以根据这三个基本数据结构实 ...

最新文章

  1. EasyPusher实现Android手机屏幕桌面直播,实时推送操作画面,用于手游直播等应用
  2. java事件驱动模型_Spring事件驱动模型详解
  3. 由手机上网带来病毒引发的三大疑问?
  4. [NewLife.XCode]实体类详解
  5. linux 安装libcurl4-gnutls-dev,curl / curl.h,libcurl,libcurl4-openssl-dev,libcurl4-nss-dev库之间的区别?...
  6. 用易拉罐做机器人教程_不会c4d就做不出3d设计?用ps照样可以,教程在这里
  7. 深入了解STL中set与hash_set,hash表基础
  8. ROOT友华PT921G光猫
  9. typecho插件仓库集合版,非常方便的使用插件
  10. 多种Map简单使用和测试
  11. 第十七届全国大学生智能汽车竞赛创意组-百度智慧交通(丝绸之路)
  12. MacBook怎样装Win10 双系统玩转Win10
  13. linux服务器无法识别u盘,linux系统下不能识别U盘
  14. 2017 年度读书总结
  15. 阿里妈妈站长全国群英会SEO演讲PPT下载
  16. 回顾RHCE——虚拟主机
  17. API开放赋能,打造DING功能快速抢占上亿用户
  18. 腾讯、阿里、百度等互联网巨头究竟如何布局元宇宙的?
  19. [导入]古龙快哭了——传说中的北京市高考作文第一名
  20. python爬虫爬取pdf_Python 爬虫:爬取教程生成 PDF

热门文章

  1. 扩散模型探索:DDIM 笔记与思考
  2. 东东助手显示无法连接服务器,《东东助手》模拟器常见问题及解决办法
  3. 缺陷管理工具--Mantis
  4. linux下进程管理的原理,Linux进程管理:supervisor和nohup原理及使用
  5. 数据分析师的能力和目标的个人总结
  6. 在Linux安装Kafka监控系统EFAK
  7. 安装Xp和Win7双系统方法(图文教程)
  8. 理财线下转账交易SQL加合计行
  9. 设置Chrome忽略网站证书错误
  10. 51系列单片机采用脉冲宽度调制(PWM)