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= 赵六
}
相关推荐
Dovis(誓平步青云)11 小时前
切换语言后按钮被截断,本地化审计怎样发现长度风险
开发语言·前端·javascript·人工智能·机器学习·华为·harmonyos
打工仔折腾 AI11 小时前
后端部署避坑:吃透IPv4地址、网络接口与CIDR前缀的实际应用
arm开发·人工智能·后端·python·性能优化
小王C语言11 小时前
Qt常用控件:按钮类控件,普通按键、单选、复选
开发语言·qt
街头便衣11 小时前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
老王IT11 小时前
PHP语言基础语法介绍
开发语言·php
独泪了无痕19 小时前
Spring Data Redis 快速上手
spring boot·redis·后端
2501_9445215920 小时前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
行思理20 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
wangchunyu11421 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python