「GCTT 出品」Go 系列教程13. Maps



 






Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!






 




Go 系列教程是非常棒的一套初学者教程,入门就它了。



「GCTT 出品」Go 系列教程1. 介绍与安装



「GCTT 出品」Go 系列教程2. Hello World



「GCTT 出品」Go 系列教程3. 变量



「GCTT 出品」Go 系列教程4. 类型



「GCTT 出品」Go 系列教程5. 常量



「GCTT 出品」Go 系列教程6. 函数(Function)



「GCTT 出品」Go 系列教程7. 包



Go 系列教程8. if-else 语句



「GCTT 出品」Go 系列教程9. 循环



「GCTT 出品」Go 系列教程10. switch 语句



「GCTT 出品」Go 系列教程11. 数组和切片



「GCTT 出品」Go 系列教程12. 可变参数函数



这是 Golang 系列教程中的第 13 篇。在本章教程中,我们将讨论 Go 语言中 Map。



01 什么是 map ?



map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。



02 如何创建 map ?



通过向 make 函数传入键和值的类型,可以创建 map。make(map[type of key]type of value) 是创建 map 的语法。



personSalary := make(map[string]int)


上面的代码创建了一个名为 personSalary 的 map,其中键是 string 类型,而值是 int 类型。



map 的零值是 nil。如果你想添加元素到 nil map 中,会触发运行时 panic。因此 map 必须使用 make 函数初始化。





 




上面的程序中,personSalary 是 nil,因此需要使用 make 方法初始化,程序将输出 map is nil. Going to make one.。



03 给 map 添加元素



给 map 添加新元素的语法和数组相同。下面的程序给 personSalary map 添加了几个新元素。





 




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



你也可以在声明的时候初始化 map。





 




上面的程序声明了 personSalary,并在声明的同时添加两个元素。之后又添加了键 mike。程序输出:



personSalary map contents: map[steve:12000 jamie:15000 mike:9000]


键不一定只能是 string 类型。所有可比较的类型,如 boolean,interger,float,complex,string 等,都可以作为键。关于可比较的类型,如果你想了解更多,请访问 http://golang.org/ref/spec#Comparison_operators。



04 获取 map 中的元素



目前我们已经给 map 添加了几个元素,现在学习下如何获取它们。获取 map 元素的语法是 map[key] 。





 




上面的程序很简单。获取并打印员工 jamie 的薪资。程序输出 Salary of jamie is 15000。



如果获取一个不存在的元素,会发生什么呢?map 会返回该元素类型的零值。在 personSalary 这个 map 里,如果我们获取一个不存在的元素,会返回 int 类型的零值 0。





 




上面程序输出:



Salary of jamie is 15000
Salary of joe is 0


上面程序返回 joe 的薪资是 0。personSalary 中不包含 joe 的情况下我们不会获取到任何运行时错误。



如果我们想知道 map 中到底是不是存在这个 key,该怎么做:



value, ok := map[key]


上面就是获取 map 中某个 key 是否存在的语法。如果 ok 是 true,表示 key 存在,key 对应的值就是 value ,反之表示 key 不存在。





 




上面的程序中,第 15 行,joe 不存在,所以 ok 是 false。程序将输出:



joe not found


遍历 map 中所有的元素需要用 for range 循环。





 




上面程序输出:



All items of a map
personSalary[mike] = 9000
personSalary[steve] = 12000
personSalary[jamie] = 15000


有一点很重要,当使用 for range 遍历 map 时,不保证每次执行程序获取的元素顺序相同。



05 删除 map 中的元素



删除 map 中 key 的语法是 delete(map, key)。这个函数没有返回值。





 




上述程序删除了键 "steve",输出:



map before deletion map[steve:12000 jamie:15000 mike:9000]
map after deletion map[mike:9000 jamie:15000]


06 获取 map 的长度



获取 map 的长度使用 len 函数。





 




上述程序中的 len(personSalary) 函数获取了 map 的长度。程序输出 length is 3。



07 Map 是引用类型



和 slices 类似,map 也是引用类型。当 map 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。





 




上面程序中的第 14 行,personSalary 被赋值给 newPersonSalary。下一行 ,newPersonSalary 中 mike 的薪资变成了 18000。personSalary 中 Mike 的薪资也会变成 18000。程序输出:



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


当 map 作为函数参数传递时也会发生同样的情况。函数中对 map 的任何修改,对于外部的调用都是可见的。



08 Map 的相等性



map 之间不能使用 == 操作符判断,== 只能用来检查 map 是否为 nil。





 




上面程序抛出编译错误 invalid operation: map1 == map2 (map can only be compared to nil)。



判断两个 map 是否相等的方法是遍历比较两个 map 中的每个元素。我建议你写一段这样的程序实现这个功能 。



我在一个程序里实现了我们讨论过的所有概念。你可以从 github 下载代码。https://github.com/golangbot/maps



这就是 map 。谢谢你的阅读。祝好。





 


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

历史上的今天:03月29日

热门专题

金诺幼儿园(春城路金诺幼儿园)|昆明官渡区幼儿园,幼儿园报名,官渡区幼儿园,春城路幼儿园,幼儿园招生,学前班,昆明幼儿园,金诺幼儿园,环城南路幼儿园,石井路幼儿园
金诺幼儿园(春城路金诺幼儿园)
云南综合高中|云南综合高中
云南综合高中
云南开放大学|云南开放大学报名,云南开放大学报考,云南开放大学,什么是云南开放大学,云南开放大学学历,云南开放大学学费,云南开放大学报名条件,云南开放大学报名时间,云南开放大学学历,云南开放大学专业
云南开放大学
安徽中源管业有限公司|安徽中源管业有限公司,安徽中源管业有限公司介绍,安徽中源管业有限公司电话,安徽中源管业有限公司地址,安徽中源管业有限公司厂家,安徽中源管业有限公司电力管,安徽中源管业有限公司管材
安徽中源管业有限公司
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
开放大学|开放大学报名,开放大学报考,开放大学,什么是开放大学,开放大学学历,开放大学学费,开放大学报名条件,开放大学报名时间,开放大学学历,开放大学专业
开放大学
小程序开发|微信小程序,小程序开发,小程序,小程序制作,微信小程序开发,小程序公司,小程序开发公司,分销,三级分销系统,分销系统
小程序开发
云南高职单招|云南单招,云南单招网,云南高职单招网,云南高职单招,云南单招学校,云南单招培训
云南高职单招

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部