【Golang】第七弹----map

article/2025/8/15 20:50:17

 笔上得来终觉浅,绝知此事要躬行

🔥 个人主页:星云爱编程

🔥 所属专栏:Golang

🌷追光的人,终会万丈光芒  

 🎉欢迎大家点赞👍评论📝收藏⭐文章

  

1基本介绍

Go语言中的 map 是一种无序的键值对集合,类似于其他语言中的字典或哈希表。它通过键(key)来快速查找对应的值(value),键必须是唯一的,而值可以重复。

2.map的基本特性

  1. 键值对存储 :存储的数据是键值对形式, key: value
  2. 无序性 :遍历map时,顺序是不固定的
  3. 动态大小 :map的大小可以动态增长
  4. 引用类型 :map是引用类型,传递时传递的是引用

3.map的声明

基本语法:

var map变量名 map[keyType]ValueType

说明:

1.key可以是什么类型?

key可以为多种类型:整数型,浮点型,bool型,string,指针,channel,还可以是只包含前面几种类型的接口,结构体,数组;key一般为int,string

注意:slice,map和function不能用作key的类型,因为它们无法用==来判断

2.value可以是什么类型

value的类型和key的类型基本一样,通常为数字(整数、浮点数),string,map,struct

3.声明举例

	var a map[int]stringvar b map[string]stringvar c map[string]int

注意:声明是不会分配内存的,初始化需要make分配内存后才能赋值和使用

如下诉代码将会报错:

	var m map[string]intm["jack"]=10fmt.Println(m)

 说明:

  • map在使用前一定要make
  • map的key是不能重复的,如果重复了,则以覆盖的形式更换对应的value
  • map的value是可以相同的
  • map的key-value是无序的

4.map的使用

第一种方式:

var a map[string]string
a=make(map[string]string,10)
a["name"]="jack"
a["age"]="111"

第二种方式:

stu:=make(map[string]string)
stu["stu1"]="jack"
stu["stu2"]="tom"

第三种方式:

var stu map[string]string=map[string]string{"stu1":"jack","stu2":"tom",
}
 stu :=map[string]string{"stu1":"jack","stu2":"tom",
}

5.map的增删查改操作

1.map增加和更新

map["key"]=value

说明:如果key不存在,就是增加,如果key存在即是修改

2.map删除

delete(map,"key")

说明:

  • delete是一个内置函数,如果key存在,就删除该key-value;若key不存在,则不进行操作,也不会报错
  • 如果我们要删除map的所有值,没有一个专门的方法一次删除,可以遍历map,逐个删除;或者map=make(...),make一个新的,让原来的成为垃圾,被gc回收

3.map查找

value, exists := m[key]

说明:如果m[key]存在,则exists为true,反之为false

4.案例

package mainimport "fmt"func main() {// 创建一个 mapm := make(map[string]int)// 1. 增加元素m["apple"] = 1m["banana"] = 2fmt.Println("增加元素后:", m)// 2. 查找元素value, exists := m["apple"]if exists {fmt.Println("查找元素: apple ->", value)} else {fmt.Println("未找到元素: apple")}// 3. 修改元素m["banana"] = 3fmt.Println("修改元素后:", m)// 4. 删除元素delete(m, "banana")fmt.Println("删除元素后:", m)
}

6.map的遍历

在 Go 语言中, map 的遍历操作可以通过 for- range 实现。

案例:

package mainimport "fmt"func main() {// 创建一个 mapm := map[string]int{"apple":  1,"banana": 2,"cherry": 3,}// 遍历 mapfor key, value := range m {fmt.Printf("Key: %s, Value: %d\n", key, value)}
}

说明:

  • for range 语法 : for key, value := range m 用于遍历 map , key 是键, value 是值。
  • map 的遍历顺序是随机的,因为 map 是无序的。
  •  如果只需要键或值,可以使用 _ 忽略不需要的部分。

7.map的长度

在 Go 语言中, map 的长度可以通过内置函数 len 来获取。

案例:

package mainimport "fmt"func main() {// 创建一个 mapm := map[string]int{"apple":  1,"banana": 2,"cherry": 3,}// 获取 map 的长度length := len(m)fmt.Println("map 的长度:", length)
}

说明:

  • len 函数 : len(m) 返回 map 中键值对的数量。
  • 空 map :如果 map 为空, len(m) 返回 0 。
  • nil map :如果 map 是 nil , len(m) 也返回 0 。
  • 并发安全 : len 函数在并发环境下是安全的,但如果在遍历或修改 map 的同时调用 len ,可能会导致数据竞争,需要使用同步机制(如 sync.Mutex )来保护。 
  • 性能 : len 函数的时间复杂度是 O(1),因为它只是返回 map 的内部计数器。

例如:

package mainimport "fmt"func main() {// 创建一个空 mapm := make(map[string]int)fmt.Println("空 map 的长度:", len(m)) // 输出: 0// 添加元素m["apple"] = 1m["banana"] = 2fmt.Println("添加元素后 map 的长度:", len(m)) // 输出: 2// 删除元素delete(m, "apple")fmt.Println("删除元素后 map 的长度:", len(m)) // 输出: 1// nil mapvar nilMap map[string]intfmt.Println("nil map 的长度:", len(nilMap)) // 输出: 0
}

8.map切片

在 Go 语言中, map 切片是指一个切片,其中每个元素都是一个 map 。这种数据结构常用于需要存储多个 map 的场景。

使用案例:

package mainimport "fmt"func main() {// 定义一个 map 切片var mapSlice []map[string]int// 初始化 map 切片mapSlice = make([]map[string]int, 3) // 创建一个长度为 3 的切片for i := range mapSlice {mapSlice[i] = make(map[string]int) // 初始化每个 map}// 添加元素mapSlice[0]["apple"] = 1mapSlice[1]["banana"] = 2mapSlice[2]["cherry"] = 3// 遍历 map 切片for i, m := range mapSlice {fmt.Printf("mapSlice[%d]: %v\n", i, m)}
}
package main
import "fmt"func main(){var Stu []map[string]stringStu=make([]map[string]string,2)//增加学生信息if Stu[0]==nil{Stu[0]=make(map[string]string,2)Stu[0]["name"]="欣欣"Stu[0]["age"]="19"}if Stu[1]==nil{Stu[1]=make(map[string]string,2)Stu[1]["name"]="依依"Stu[1]["age"]="18"}fmt.Println(Stu)}

说明:

  • 定义 map 切片 : var mapSlice []map[string]int 定义了一个 map 切片,其中每个元素都是一个 map[string]int 。
  • 初始化 map 切片 :使用 make([]map[string]int, 3) 创建一个长度为 3 的切片,然后遍历切片,为每个元素初始化一个 map 。
  • 添加元素 :通过 mapSlice[i][key] = value 向每个 map 中添加键值对。
  • 遍历 map 切片 :使用 for range 遍历 map 切片,并输出每个 map 的内容。

注意事项:

  • 初始化 : map 切片中的每个 map 需要单独初始化,否则会引发运行时错误( nil map )。
  • 动态扩展 : map 切片可以动态扩展,使用 append 添加新的 map 。
  • 并发安全 :如果多个 goroutine 同时操作 map 切片,需要使用同步机制(如 sync.Mutex )来保护。

动态扩展:

package mainimport "fmt"func main() {// 定义一个 map 切片var mapSlice []map[string]int// 动态添加 mapnewMap := map[string]int{"orange": 4}mapSlice = append(mapSlice, newMap)// 遍历 map 切片for i, m := range mapSlice {fmt.Printf("mapSlice[%d]: %v\n", i, m)}
}

9.map排序

介绍:

(1)Go 中没有专门的方法对map的key进行排序;

(2)Go 中的map默认是无序的,每次遍历输出的顺序是随机的;

(3)Go 中map的排序,是先将key进行排序,然后根据key值遍历输出。

案例:对键排序

package mainimport ("fmt""sort"
)func main() {m := map[string]int{"apple":  3,"banana": 1,"cherry": 2,}// 获取所有键keys := make([]string, 0, len(m))for k := range m {keys = append(keys, k)}// 对键排序sort.Strings(keys)// 按排序后的键输出for _, k := range keys {fmt.Printf("%s: %d\n", k, m[k])}
}

说明:

  • 提取 map 的所有键到切片中。
  • 使用 sort.Strings 对键排序。
  • 按排序后的键输出对应的值。

案例2:对值排序

package mainimport ("fmt""sort"
)func main() {m := map[string]int{"apple":  3,"banana": 1,"cherry": 2,}// 定义一个结构体用于存储键值对type kv struct {Key   stringValue int}// 将 map 转换为切片var kvs []kvfor k, v := range m {kvs = append(kvs, kv{k, v})}// 对值排序sort.Slice(kvs, func(i, j int) bool {return kvs[i].Value < kvs[j].Value})// 按排序后的值输出for _, kv := range kvs {fmt.Printf("%s: %d\n", kv.Key, kv.Value)}
}

说明:

  • 定义一个结构体 kv 存储键值对。
  • 将 map 转换为 kv 切片。
  • 使用 sort.Slice 对值排序。
  • 按排序后的值输出对应的键。

10.map的使用细节

(1)map是引用类型,遵守引用类型传递的机制,在一个函数接受map并修改后,会直接修改原来的map;

例子:

package mainimport "fmt"// 修改 map 的函数
func modifyMap(m map[string]int) {m["apple"] = 10m["banana"] = 20
}func main() {// 创建一个 mapm := map[string]int{"apple":  1,"banana": 2,}fmt.Println("修改前:", m)modifyMap(m)fmt.Println("修改后:", m)
}

(2)map的容量满后,继续往map中添加元素,map会自动扩容,并不会发生panic,也就是说map能动态地增长键值对;

案例:

package mainimport "fmt"func main() {// 创建一个初始容量较小的 mapm := make(map[int]int, 2)// 添加元素,观察 map 的动态扩容for i := 0; i < 10; i++ {m[i] = i * 10fmt.Printf("添加元素: %d -> %d, map 长度: %d\n", i, m[i], len(m))}
}

(3)map的value经常使用struct类型,更适合管理复杂的数据。

结语

感谢您的耐心阅读,希望这篇博客能够为您带来新的视角和启发。如果您觉得内容有价值,不妨动动手指,给个赞👍,让更多的朋友看到。同时,点击关注🔔,不错过我们的每一次精彩分享。若想随时回顾这些知识点,别忘了收藏⭐,让知识触手可及。您的支持是我们前进的动力,期待与您在下一次分享中相遇!

路漫漫其修远兮,吾将上下而求索。


http://www.hkcw.cn/article/WghGeJiJwR.shtml

相关文章

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃? 2.2、从汇编代码的角度去理解多线程的执行细节,去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析dump时先从崩溃的那条汇…

基于谐波线性化方法的跟网型GFL并网变流器/VSC宽频序阻抗建模及扫频(Matlab/Simulink平台)及文献复现

目录 1、课程及模型介绍 2、谐波线性化方法介绍 3、跟网型及构网型并网变流器的特点 4、跟网型变流器/VSC拓扑及控制结构 5、不同坐标系下VSC序阻抗建模推导过程 5.1 abc三相坐标系下的VSC序阻抗建模 5.2 d-q旋转坐标系下的VSC序阻抗建模 5.2.1 Park变换及频率偏移效应…

C++“STL之String”

​ 🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:C++入门 目录 ​编辑 前言 一、STL简介 1.1 STL是什么? 1.2 STL的版本(这个不是很重要了解即可) 1.3 STL的六大组件 二、 String类 2.1为什么要学习String类? 2.1.1 C语言中的字符串…

C++之多态

开始新的征程啦———多态&#xff0c;它也是C的三大特性之一。 文章目录 一、多态的概念二、多态的定义和实现2.1多态的定义2.2 实现动态多态所需要的条件&#xff08;2个&#xff09;2.3 虚函数的定义2.4 虚函数的重写/覆盖2.5 虚函数重写中的问题2.5.1 协变2.5.2 析构函数的…

【第十六届蓝桥杯省赛】比赛心得与经验分享(PythonA 组)

文章目录 一、我的成绩二、我的备赛经历三、如何备赛&#xff08;个人观点&#xff09;1. 基础语法2. 数据结构3. 算法4. 数学 四、做题技巧与注意事项五、我的题解试题A 偏蓝 &#x1f3c6;100%试题B IPV6 &#x1f3c6;0%试题C 2025图形 &#x1f3c6;100%试题D 最大数字 &am…

21天Python计划:零障碍学语法(更新完毕)

文章目录 前言Python 部分MySQL 部分目录结语资料截图 前言 此技术博客专栏围绕 Python 编程和 MySQL 数据库展开了系统且循序渐进的知识讲解&#xff0c;共包含 21 篇文章。 Python 部分 从基础入门逐步深入到高级应用。首先介绍了 Python 的下载和开发工具&#xff0c;为后续…

JavaScript--js基础(详细 全面)

目录 前言: JavaScript 是什么&#xff1f;JavaScript 简介 1.JavaScript历史 2.JavaScript 具有以下特点 第一个JavaScript程序 1.在脚本文件中编写JavaScript代码 2.JavaScript代码执行顺序 基本语法 1.变量 2.数据类型 3.算术运算符 4.赋值运算 5.字符串运算符 6…

Java识别图片或扫描PDF中的文字

目录 使用工具 Java识别图片中的文字 Java识别扫描PDF中的文字 注意事项 图片和扫描文件通常以非文本格式存在&#xff0c;这使得其中的文字信息难以直接编辑、搜索或复制。为了解决这个问题&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术应运而生。OCR通过分析…

【C++】C++11新特性详解:可变参数模板与emplace系列的应用

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…

使用宝塔面板快速部署SpringBoot+Vue项目(Java + Node)

使用宝塔面板快速部署SpringBootVue项目&#xff08;Java Node&#xff09; 项目主要技术栈准备工作1. 一台云服务器&#xff08;阿里云、腾讯云等&#xff09;&#xff0c;我这里使用的是阿里云的服务器&#xff08;2核2G&#xff09;2. 已安装宝塔面板3. 已开发完成的Spring…

一文弄懂 | YOLOv8网络结构解读 、yolov8.yaml配置文件详细解读与说明、模型训练参数详细解析 | 通俗易懂!入门必看系列!

看这一篇就够了。本文内含YOLOv8网络结构图 yaml配置文件详细解读与说明 训练教程 训练参数设置参数解析说明等一些有关YOLOv8的内容&#xff01; YOLOv8v10专栏订阅链接&#xff1a;YOLOv10 创新改进高效涨点持续改进300多篇永久免费答疑 &#xff08;订阅的小伙伴&#xf…

[C++][第三方库][ODB]详细讲解

目录 1.介绍2.安装1.安装 build22.安装 odb-compiler3.安装 ODB 运行时库4.安装MySQL和客户端开发包5.安装 boost profile 库6.总体操作7.测试样例 3.ODB 常见操作1.ODB 类型映射2.ODB 编程1.指令2.示例 4.类与接口5.使用 1.介绍 ODB框架&#xff1a;数据库ORM框架 --> 对象…

【Python】解决Python报错:ERROR: Could not find a version that satisfies the requirement

成功解决Python报错&#xff1a;ERROR: Could not find a version that satisfies the requirement。ERROR: Could not find a version that satisfies the requirement 是 Python 的包管理工具 pip 在安装包时可能遇到的错误。这通常意味着 pip 没有找到与给定版本要求匹配的包…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷五)

目录 1. sizeof 和 strlen的区别 1.1 sizeof 1.2 strlen 2. 数组和指针习题解析 2.1 一维数组 2.2 字符数组 代码1&#xff1a; 代码2&#xff1a; 代码3: 代码4&#xff1a; 代码5&#xff1a; 代码6&#xff1a; 2.3 二维数组 3. 指针运算笔试题解析 3.1 3.…

【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)

文章目录 PyQt5入门级超详细教程前言第4部分&#xff1a;事件处理与信号槽机制4.1 什么是信号与槽&#xff1f;4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解&#xff1a; 4.4 处理不同的信号代码详解&#xff1a; 4.5 自定义信号与槽代码详解&#xff1a; 4.6 信号槽…

MathType的安装与word嵌入

博主近期在写论文&#xff0c;发现word编辑公式好像只能用MathType&#xff0c;于是就去下载安装&#xff0c;然后遇到了蛮多问题总结一下&#xff0c;希望能帮到有相同问题的大家~ 一.MathType的下载 博主是在官网直接下载的&#xff0c;个人觉得没啥问题&#xff0c;下的也…

matlab:二维绘图篇——plot绘图命令

目录 1.plot绘图命令 &#xff08;1)plot(x) 实例——实验数据曲线 实例——窗口分割 实例——随机矩阵 (2).plot(x,y) 实例——摩擦系数变化曲线 &#xff08;3&#xff09;plot(x1,y1,x2,y2,...) 实例——正弦图形 实例——正弦余弦图形 &#xff08;4&#xff09…

Python的包管理工具pip安装

Python的包管理工具pip安装 一、安装步骤1.检查 pip是否已安装2.安装 pip方法一&#xff1a;通过 ​ensurepip​ 模块安装(推荐)方法二&#xff1a;通过 ​get-pip.py​ 脚本安装&#xff08;经常应为网络域名问题连接不上&#xff09; 3.验证pip安装4.创建别名5.更新pip 二、常…

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇&#xff1a;1-3部分&#xff1a;PyQt5基础与常用控件第1部分&#xff1a;初识 PyQt5 和安装1.1 什么是 PyQt5&#xff1f;1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…

C++第四十五弹---深入理解包装器:提升代码复用性与安全性的利器

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 包装器 1.1、function包装器 1.2、bind 1 包装器 1.1、function包装器 function包装器 也叫作适配器。C中的function本质是一个类模板&…