Skip to content

Go map详解和实战

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

春招打卡第8天第11篇。

今天继续为大家更新Go语言学习记录的文章。

声明map

和切片的定义一样,我们定义map未进行初始化时,map==nil。 map和切片一样,也是引用类型,不是值类型。

go
var m1 map[string]int  //声明 fmt.Println(m1 == nil) //返回true

没有初始化,说明没有在内存中开辟空间,没有内存地址

初始化

map的初始化一定要先声明,再初始化;不能直接初始化,否则会报错:undefined

go
var m1 map[string]int m1 = make(map[string]int, 10) //要估算好map的容量,避免在程序运行期间在动态扩容(动态扩容会影响程序运行效率) m1["lucky"] = 18 m1["jason"] = 24 fmt.Println(m1)

打印结果:

image.png

注意:要估算好map的容量,避免在程序运行期间再动态扩容(动态扩容会影响程序运行效率)

也可以使用:=简化,代表声明并初始化。

我们把上面的代码简化一下:

go
//简化 := 表示声明并初始化 m1 := make(map[string]int,10) m1["lucky"] = 18 m1["jason"] = 24 fmt.Println(m1)

打印结果:

image.png

我们发现结果是一样的。

开发过程中我们根据场景来判断使用哪种方式来进行声明、初始化操作。

取值

取值非常简单 map[key] 的方式就能取值了,例如

go
fmt.Println(m1["jason"]) fmt.Println(m1["jason1"]) //map查询不存在的key也不会报错 返回了空值

打印结果:

image.png

注意:map查询不存在的key不会报错的,返回了空值。

取值判断

上面提到了map查询不存在的key值也不会报错,而是返回了空值。

我们如何判断取到的值是否为空值呢?

建议大家map取值的时候这么写

go
value,ok := m1["jason1"] if ok {    fmt.Println(value) }else {    fmt.Println("不存在") }

打印结果:

image.png

遍历取值

取出键值对

go
for k, v := range m1 {    fmt.Println(