开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:map三种用法和应用实例】与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9657
map三种用法和应用实例
内容介绍:
一、map的使用方式
二、使用方式的案例演示
三、总结
四、课堂练习
一、map的使用方式
map 的使用方式和数组有些是相似的,但是也有不一样的地方,这里总结了map的使用方式,一共有三种方式:
1. 方式1
//声明,这时map=ni1
var cities map[string]string
//make(map[string]string, 10)分配一个map
cities = make(map[string]string,10)
2. 方式2
//声明,就直接 make
var cities = make(map[string]string)
3. 方式3
//声明,直接赋值
var cities map[string]string = map[string]string {
“no4”:“成都",
}
cities[“no1”]=”北京”
第一种方式是先声明,再 make,make 完了之后再赋值。
第二种方式是在声明的时候直接 make 一个空间,然后直接就赋值了。
第三种方式是在声明的时候也不 make,直接就赋值,但实际上底层也用make了。怎么实现呢,这里比如先声明一个 map,在声明过后 map[string]string直接给值了,这样也可以。
这三种方式将来在做开发的时候,在看到有些使用的不是这里讲解的方式,也应该要有所反应。
二、使用方式的案例演示
第一个是map的使用,map在后面写项目的时候会用到很多,它的 key value 可以解决很多项目上的实际问题。
在 chapter09内新建一个文件夹叫 mapuse,新建一个文件叫 main.go,从上一份文件里粘贴一份通用的代码过来,代码如下:
package main
import (
“fmt”
)
func main() {
}
在主函数中写第一种使用方式,由于第一种方式已经讲过了,所以这里直接引用过来,代码如下:
func main() {
//第一种使用方式
var a map[string]string
//在使用 map 前,需要先 make , make 的作用就是给 map 分配数据空间
a = make(map[string]string, 10)
a[“no1”] = “宋江” //ok?
a[“no2”] = “吴用” //ok?
a[“no1”] = “武松” //ok?
a[“no3”] = “吴用” //ok?
fmt.Println(a)
//直接声明再make,就完成了
//第二种方式
c
ities := make(map[string]string)
//存放很多城市,直接make,存放map 进去,它的 key 为 string,值也为 string,大小默认。
cities[“no1”] = “
北京
”
//第一个城市是北京
cities[“no2”] = “
天津
”
//第二个城市是天津
cities[“no3”] = “
上海
”
//第三个城市是上海
//
可以发现并不受它大小的影响,和数组不一样,直接用就行了。
fmt
.Println(cities)
/
/
运行
}
打开 cmd.exe 输入以下命令回车:
cd
..
c
d mapuse
g
o run main.go
输出:
可以看出这里有no1:北京,no2:天津,no3:上海。也就是说可以直接 make,直接使用。这种方式也用的比较多,和第一种方式比较起来更灵活一点,不拖泥带水。
继续在 func main()函数里写第三种方式:
//第三种方式
//在声明的时候直接赋值了
heroes := map[string]string{
//存放hero,写完后写 key value 值
// :=用了类型推导
“hero1” : “
宋江
”
,
“
hero2” : “
卢俊义
”
,
“
hero
3” : “
吴用
”
,
fmt
.Println(“heroes”, heroes)
}
打开 cmd.exe 输入命令 go run main.go 回车:
可以看到hero1:宋江,hero2:卢俊义,hero3:吴用都有了。这种写法要比不用类型推导更简单。
如果不用类型推导:
//这样也是可以的,只是有些麻烦
var
heroes map[string]string = map[string]string{
//注意格式
“hero1” : “
宋江
”
,
“
hero2” : “
卢俊义
”
,
//注意逗号,因为即使map在最后一步了也不能少逗号。
fmt
.Println(“heroes”, heroes)
//
输出查看
}
打开 cmd.exe 输入命令 go run main.go 回车:
可以发现hero1:宋江,hero2:卢俊义都有了。
三、总结
以上就是 map 的3种使用方式,都要去掌握,小建议是一般使用第2种方式,比较清晰;第3种是先需要赋值,有时候容易紊乱。而且第3种方式在做完了以后也可以继续加东西,因为相当于在做了之后已经make空间了,所以在后面仍然可以用传统的方式来给它进行赋值操作。比如在第三种方式后继续添加:
heroes
[“hero4”] = “
林冲
”
fmt
.Println(“heroes=”, heroes)
输出得:
heroes
=
map[hero1:
宋江
hero2:
卢俊义
hero3:
吴用
hero
4:
林冲
]
可以看见hero4:林冲也输出出来了。
这3种方式都要去掌握。
方式1:
//第一种使用方式
var a map[string]string
//在使用 map 前,需要先 make , make 作用就是给 map 分配数据空间
a = make(map[string]string, 10)
a[“no1”] = “宋江” //ok?
a[“no2”] = “吴用” //ok?
a[“no1”] = “武松” //ok?
a[“no3”] = “吴用” //ok?
fmt.Println(a)
方式2:
/
/
第二种方式
c
ities := make(map[string]string)
cities[“no1”] = “
北京
”
cities[“no2”] = “
天津
”
cities[“no3”] = “
上海
”
fmt
.Println(cities)
//运行
方式3:
//第三种方式
heroes := map[string]string {
“hero1” : “
宋江
”
,
“
hero2” : “
卢俊义
”
,
“
hero
3” : “
吴用
”
,
}
heroes
[“hero4”] = “
林冲
”
fmt
.Println(“heroes”, heroes)
这样map的使用方式就讲解完了。
四、课堂练习
接下来看一个应用实例:
课堂练习:演示一个 key-value 的 value 是 map 的案例,比如:我们要存放3个学生信息,每个学生有 name 和 sex 信息 。
思路:这个 map 是什么结构比较好呢,因为如果学生信息只放一个名字,那么挺简单的,就定义 key 为 string,名字 name 也为 string 就完成了。但是这里是既有名字也有性别,也就是说1个学生有2个信息。那么应该是:
map
[string]
map
[string]string
//string假设是学生的学号,map[string]string里可以写2个,一个是学生的名字,另一个是学生的性别。
代码演示:
students
M
ap
:= make(map[string]map[string]string)
//首先定义一个变量,然后make一个map[string]map[string]string
这样的map。
s
tudentsMap[“stu01”] =
make
(map[string]string, 2)
//放第一个学生编号为01,注意它的key是string,但是值是map,所以还需要make一下,至少有2个,因为有名字和性别。
students
M
ap[
“stu01”][“name”] = “tom”
//赋值
students
M
ap[
“stu01”][“sex”] = “
男
”
//通过key记录了2个信息
students
M
ap[
“stu01”][“
address
”] = “
北京长安街~
”
s
tudentsMap[“stu02”] =
make
(map[string]string, 3)
//注意:只要使用了 map 一定要 make,如果不 make 就会报 panic 这个错误,它会说这个地方是不能分配的。
students
M
ap[
“stu02”][“name”] = “
mary
”
/
/
赋值
students
M
ap[
“stu02”][“
sex
”] = “
女
”
students
M
ap[
“stu02”][“
address
”] = “
上海黄浦江~
”
fmt.
Println(studentMap)
运行得出:
map
[stu01:map[name:tom sex:
男
address:
北京长安街~
]
stu
02:map[name:mary sex:
女
address:
上海黄浦江~
]]
可以看到信息完全正确,第1个学生的 key 是 stu01,它这里面有个 map,记录三个信息;第2个学生的 key 是 stu02,它里面有个 map,记录三个信息。
也可以分开打印,比如只想取出第2个学生的信息:
fmt
.Println(studentMap[“stu02”])
运行得出:
map
[name:mary sex:
女
address:
上海黄浦江~
]
可以看见只取出了第2个学生的信息。
如果还想再具体一点也可以,比如再取出第2个学生的地址:
fmt
.Println(studentMap[“stu02”]
[
“address”])
//这样也是可以的,这里就不再去运行了。
关于 map 的课堂练习就讲解到这里了,这里用到了一个相对复杂的 map 结构,就是 key 为 string,而值又是一个 map。
关于 map 的使用就介绍到这里。