14、做中学 | 初二上期 Golang集合Map

一、认识Map

1. 会议室

会议室来了一群人,他们根据桌子上的名字,进行对号入座、、、

如果把会议室比作Map,桌子上的名字比作key、开会的人对应value,是不是就可以清晰一些!

2. Map概念

知道了map是通过key,去对应value的一种数据结构,知道了大概意思,接下来看下Map介绍!

Map是一种key-value无序的数据结构,又称为字段或者关联数组。 其中key为索引,value为指向的数据。比如在会议室里,你根据纸牌上的名字问李白,李白会进行回复!

3. 声明Map

Map和其它数据一样,先进行声明后使用

声明格式如下

go 复制代码
var 命令名称 map[keyType]valueType

keyType可以有哪些类型

  1. 字符串 string
  2. 数字
  3. bool
  4. 指针
  5. channel
  6. 接口
  7. 结构体
  8. 数组

通常keyType为:int、string

PS: slice切片、map集合、function方法不可以作为keyType,因为这几个没法用==进行判断

valueType类型基本和keyType类似,通常为:数字(整数、浮点数)、string、struct

Map声明举例

go 复制代码
var num [string]int

var name [string]string

PS:声明不会分配内存,初始化需要make(),分配内存后才能赋值和使用。

二、使用Map

了解了Map大概含义,又学会了如何进行声明Map,那么可以使用Map进行操作数据了!

1. 初始化Map

初始化Map有三种方式,具体如下

go 复制代码
package main

import "fmt"

func main() {
	// 方式一 创建map 无指定容量,容量为0,根据存储元素自动扩容
	var cities1 map[string]string = make(map[string]string)
	cities1["C1"] = "北京"
	fmt.Println(cities1)
	// map[C1:北京]

	// 方式二 创建map 指定容量,容量为5
	var cities2 map[string]string = make(map[string]string, 5)
	cities2["C2"] = "上海"
	fmt.Println(cities2)
	// map[C2:上海]

	// 方式三 创建map 直接进行赋值
	var cities3 map[string]string = map[string]string{
		"C3": "广州",
	}
	fmt.Println(cities3)
	// map[C3:广州]
}

2. 操作Map数据

新增key的时候,如果Map里没有这个key,则进行新增,已经有这个key,则按最新的进行修改。

go 复制代码
package main

import "fmt"

func main() {
	// 方式一 创建map 无指定容量,容量为0,根据存储元素自动扩容
	var cities1 map[string]string = make(map[string]string)
	cities1["C1"] = "北京"
	fmt.Println(cities1)
	// map[C1:北京]

	// 无则添加  有则修改

	// 修改
	cities1["C1"] = "上海"
	fmt.Println(cities1)
	// map[C1:上海]

	// 添加
	cities1["C2"] = "深圳"
	fmt.Println(cities1)
	// map[C1:上海 C2:深圳]

	// 删除 根据key进行删除
	delete(cities1, "C2")
	fmt.Println(cities1)
	// map[C1:上海]
}

3. 遍历Map

遍历的时候使用for-range结构

go 复制代码
package main

import "fmt"

func main() {
	// 方式一 创建map 无指定容量,容量为0,根据存储元素自动扩容
	var cities1 map[string]string = make(map[string]string)
	cities1["C1"] = "北京"
	fmt.Println(cities1)
	// map[C1:北京]

	// 添加
	cities1["C2"] = "深圳"
	fmt.Println(cities1)
	// map[C1:上海 C2:深圳]

	// 添加
	cities1["C3"] = "上海"
	fmt.Println(cities1)
	// map[C1:上海 C2:深圳]

	for key, value := range cities1 {
		fmt.Println(key, value)
	}
	// C3 上海
	// C1 北京
	// C2 深圳

	// map的key是无序的

}

三、Map切片

还记得上篇的切片内容吗?切片是一种引用类型,存储的是切片内容的地址!

PS: 切片类型,可以理解变体的数组,存储的是切片的逻辑地址。(数组、地址)

go 复制代码
package main

import "fmt"

func main() {
	// map切片
	var mapSlice []map[string]string = make([]map[string]string, 2)
	mapSlice[0] = make(map[string]string)
	mapSlice[0]["C1"] = "北京"
	mapSlice[0]["C2"] = "深圳"

	mapSlice[1] = make(map[string]string)
	mapSlice[1]["C1"] = "北京"
	mapSlice[1]["C2"] = "深圳"

	fmt.Println(mapSlice)
	// [map[C1:北京 C2:深圳] map[C1:北京 C2:深圳]]
}

本篇进行学习Map内容,Map为key-value数据结构,key为无序键,通过key进行检索和删除对应的value!

请存储"十二中学,二班张三、李四,三班王五、赵六同学",并进行遍历

go 复制代码
package main

import "fmt"

func main() {
	// 存储"十二中学,二班张三、李四,三班王五、赵六同学",并进行遍历

	// 声明学校Map 需求为存储俩个班级,初始化长度为2
	var school map[string]map[string]string = make(map[string]map[string]string, 2)

	// 声明班级Map 需求为存储俩个学生,初始化长度为2
	// 二班
	var classTwo map[string]string = make(map[string]string, 2)
	classTwo["xs_001"] = "张三"
	classTwo["xs_002"] = "李四"

	school["class_002"] = classTwo

	// 三班
	var classThree map[string]string = make(map[string]string, 2)
	classThree["xs_001"] = "王五"
	classThree["xs_002"] = "赵六"

	school["class_003"] = classThree

	// 输出学校、班级、学生信息
	for classKey, classValue := range school {
		fmt.Println("班级编号classKey=", classKey)
		for studentKey, studentValue := range classValue {
			fmt.Println("\t学生编号studentKey=", studentKey, "\t学生姓名studentValue=", studentValue)
		}
	}

	// 班级编号classKey= class_002
	//    学生编号studentKey= xs_001 	学生姓名studentValue= 张三
	//    学生编号studentKey= xs_002 	学生姓名studentValue= 李四
	// 班级编号classKey= class_003
	//    学生编号studentKey= xs_001 	学生姓名studentValue= 王五
	//    学生编号studentKey= xs_002 	学生姓名studentValue= 赵六
}
相关推荐
陈老师还在写代码3 小时前
springboot 打包出来的 jar 包的名字是在哪儿决定的
spring boot·后端·jar
m0_748240257 小时前
Windows编程+使用C++编写EXE加壳程序
开发语言·c++·windows
兮兮能吃能睡8 小时前
R语言模型分析(一)(1)
开发语言·r语言
wuk99810 小时前
基于有限差分法的二维平面热传导模型MATLAB实现
开发语言·matlab·平面
熊小猿11 小时前
在 Spring Boot 项目中使用分页插件的两种常见方式
java·spring boot·后端
paopaokaka_luck11 小时前
基于SpringBoot+Vue的助农扶贫平台(AI问答、WebSocket实时聊天、快递物流API、协同过滤算法、Echarts图形化分析、分享链接到微博)
java·vue.js·spring boot·后端·websocket·spring
初见无风12 小时前
2.5 Lua代码中string类型常用API
开发语言·lua·lua5.4
做运维的阿瑞12 小时前
用 Python 构建稳健的数据分析流水线
开发语言·python·数据分析
左师佑图12 小时前
综合案例:Python 数据处理——从Excel文件到数据分析
开发语言·python·数据分析·excel·pandas