开发者学堂课程【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,就完成了
//第二种方式
cities := make(map[string]string) //存放很多城市,直接make,存放map 进去,它的 key 为 string,值也为 string,大小默认。
cities[“no1”] = “北京” //第一个城市是北京
cities[“no2”] = “天津” //第二个城市是天津
cities[“no3”] = “上海” //第三个城市是上海
//
可以发现并不受它大小的影响,和数组不一样,直接用就行了。
fmt.Println(cities) //运行
}
打开 cmd.exe 输入以下命令回车:
cd..
cd mapuse
go run main.go
输出:
可以看出这里有no1:北京,no2:天津,no3:上海。也就是说可以直接 make,直接使用。这种方式也用的比较多,和第一种方式比较起来更灵活一点,不拖泥带水。
继续在 func main()函数里写第三种方式:
//第三种方式
//在声明的时候直接赋值了
heroes := map[string]string{ //存放hero,写完后写 key value 值
// :=用了类型推导
“hero1” : “宋江”,
“hero2” : “卢俊义”,
“hero3” : “吴用”,
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:吴用 hero4:林冲]
可以看见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:
//第二种方式
cities := make(map[string]string)
cities[“no1”] = “北京”
cities[“no2”] = “天津”
cities[“no3”] = “上海”
fmt.Println(cities)
//运行
方式3:
//第三种方式
heroes := map[string]string {
“hero1” : “宋江”,
“hero2” : “卢俊义”,
“hero3” : “吴用”,
}
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个,一个是学生的名字,另一个是学生的性别。
代码演示:
studentsMap := make(map[string]map[string]string)
//首先定义一个变量,然后make一个map[string]map[string]string这样的map。
studentsMap[“stu01”] = make(map[string]string, 2) //放第一个学生编号为01,注意它的key是string,但是值是map,所以还需要make一下,至少有2个,因为有名字和性别。
studentsMap[“stu01”][“name”] = “tom” //赋值
studentsMap[“stu01”][“sex”] = “男” //通过key记录了2个信息
studentsMap[“stu01”][“address”] = “北京长安街~”
studentsMap[“stu02”] = make(map[string]string, 3)
//注意:只要使用了 map 一定要 make,如果不 make 就会报 panic 这个错误,它会说这个地方是不能分配的。
studentsMap[“stu02”][“name”] = “mary” //赋值
studentsMap[“stu02”][“sex”] = “女”
studentsMap[“stu02”][“address”] = “上海黄浦江~”
fmt.Println(studentMap)
运行得出:
map[stu01:map[name:tom sex:男 address:北京长安街~] stu02: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 的使用就介绍到这里。





