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= 赵六
}
相关推荐
caimouse5 小时前
ReactOS 窗口系统分析(20):光标与图标 — cursoricon.c
c语言·开发语言
JavaGuide6 小时前
84.5K+ Star!这个开源编程 Agent 控制台,能统一管理 Codex、Claude Code,DeepSeek Harness 也能接入
后端·github
swipe6 小时前
RabbitMQ 实战:AI Agent 里异步处理的标配方案(手把手 + 4 种交换机全解析)
后端·面试·langchain
神奇小汤圆6 小时前
30张图,搞懂分布式追踪系统
后端
longxiaozhang66 小时前
C#运算符重载:让对象也能使用“加减乘除”
开发语言·c#
量化小c6 小时前
一行代码查 BTCUSDT 和 AAPL 最新价?QuantDash 统一多市场实时行情接口实战
后端·算法·github
沙盘客7 小时前
AFSIM 官方案例库全景与解读方法论
c++·经验分享·后端
mounter6257 小时前
GCCRS 突破与 Rust 入核:Linux 工具链的重大变革
linux·开发语言·rust·linux kernel·kernel
Buke..7 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(上):Frida 反调试绕过与 unidbg 调用
java·开发语言·爬虫·python·安卓
abcefg_h7 小时前
MCP 实战指南:如何在项目中使用 Model Context Protocol 及其通信原理
开发语言·后端·golang·mcp