go make function_「GCTT 出品」Go 系列教程——13. Maps

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

1c71acd8c17270696680fba4f9bdea96.png

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 函数初始化。

00e96c888dd7e67c45fee52e1b15dd96.png

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

03 给 map 添加元素

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

cda46d70daea55d2d2eef7c4c0ba48a0.png

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

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

b5fbafab722d49d40bf755b9984e5f91.png

上面的程序声明了 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] 。

058328fb584771f927d7c8db1228cee0.png

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

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

b33bd8c70ee5cb774cb188e954ef4f3b.png

上面程序输出:

Salary of jamie is 15000Salary of joe is 0

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

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

value, ok := map[key]

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

92b9b5fb9296751825e1ef1d5e39f593.png

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

joe not found

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

58bf7baea024d8b7d1f89915aaf99c5d.png

上面程序输出:

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

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

05 删除 map 中的元素

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

2d10f8f16cdfefbb86b8bcc6bc2e5d07.png

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

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

06 获取 map 的长度

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

e887e9bdb5ed87ad2e4015f15bc708da.png

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

07 Map 是引用类型

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

478a72f8ab795445f2268cad2a0e0b45.png

上面程序中的第 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。

2315acec4673202378c23b77a10970a0.png

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

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

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

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

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

下一教程 - 字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值