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= 赵六
}
相关推荐
兩尛34 分钟前
c++知识点2
开发语言·c++
fengfuyao98539 分钟前
海浪PM谱及波形的Matlab仿真实现
开发语言·matlab
xiaoye-duck1 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Hx_Ma162 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode3 小时前
原子操作类LongAdder
java·开发语言
lly2024064 小时前
C 语言中的结构体
开发语言
JAVA+C语言4 小时前
如何优化 Java 多主机通信的性能?
java·开发语言·php
青岑CTF5 小时前
攻防世界-Ics-05-胎教版wp
开发语言·安全·web安全·网络安全·php
Li emily5 小时前
如何通过外汇API平台快速实现实时数据接入?
开发语言·python·api·fastapi·美股
APIshop6 小时前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库