map 三种用法和应用实例|学习笔记

简介: 快速学习map三种用法和应用实例

开发者学堂课程【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

输出:

image.png

可以看出这里有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 回车:

image.png

可以看到hero1:宋江,hero2:卢俊义,hero3:吴用都有了。这种写法要比不用类型推导更简单。

如果不用类型推导:

//这样也是可以的,只是有些麻烦

var heroes map[string]string = map[string]string{  //注意格式

“hero1” : “宋江

hero2” : “卢俊义  //注意逗号,因为即使map在最后一步了也不能少逗号。

fmt.Println(“heroes”, heroes)  

//

输出查看

}

打开 cmd.exe 输入命令 go run main.go 回车:

image.png

可以发现hero1:宋江,hero2:卢俊义都有了。


三、总结

以上就是 map 的3种使用方式,都要去掌握,小建议是一般使用第2种方式,比较清晰;第3种是先需要赋值,有时候容易紊乱。而且第3种方式在做完了以后也可以继续加东西,因为相当于在做了之后已经make空间了,所以在后面仍然可以用传统的方式来给它进行赋值操作。比如在第三种方式后继续添加:

heroes[“hero4”] = “林冲

fmt.Println(“heroes=”, heroes)

输出得:

image.png

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)

运行得出:

image.png

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”])

运行得出:

image.png

map[name:mary sex:address:上海黄浦江~]

可以看见只取出了第2个学生的信息。

如果还想再具体一点也可以,比如再取出第2个学生的地址:

fmt.Println(studentMap[“stu02”][“address”])  

//这样也是可以的,这里就不再去运行了。

关于 map 的课堂练习就讲解到这里了,这里用到了一个相对复杂的 map 结构,就是 key 为 string,而值又是一个 map。

关于 map 的使用就介绍到这里。

相关文章
|
1月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
30 3
【C++】map、set基本用法
|
6月前
|
Java API 容器
Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法
【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。
98 4
|
6月前
|
存储 人工智能 C++
map容器在C++中的具体用法以及相关注意点
map容器在C++中的具体用法以及相关注意点
64 1
|
6月前
|
存储 C++ 容器
【C++】学习笔记——map和set
【C++】学习笔记——map和set
37 0
|
6月前
|
Java API
Map.entry用法详解
Map.entry用法详解
|
7月前
|
分布式计算 JavaScript 前端开发
Stream学习笔记(二)map与reduce
Stream学习笔记(二)map与reduce
|
7月前
|
存储 JavaScript 前端开发
TypeScript 中的 Map 对象定义、基本操作和常见用法
TypeScript 中的 Map 对象定义、基本操作和常见用法
673 7
|
7月前
|
C++
stl中set、map的用法
stl中set、map的用法
|
7月前
|
存储 JavaScript
【ES6系列第二篇】适用JS初学者的Set对象和Map对象学习笔记
【ES6系列第二篇】适用JS初学者的Set对象和Map对象学习笔记
52 0
|
7月前
|
JavaScript 前端开发 索引
【面试题】JS中的map的理解及用法
【面试题】JS中的map的理解及用法