Go语言 Map

news/2024/9/24 4:19:06/

基本介绍

Map 是一种无序的键值对的集合。

基本使用

初始化

初始化 Map 可以使用 make 函数,也可以使用字面量的方式直接初始化值。

	// 创建一个空的 Mapm1 := make(map[string]int)// 使用字面量的方式m2 := map[string]int{"apple": 1,"banana": 2,"orange": 3,}fmt.Println(m1) // map[]fmt.Println(m2) // map[apple:1 banana:2 orange:3]

设置元素

使用 Map 名加键名的方式,可以设置一个键值对,如果有值则修改,没有则新建一个键值对。

    // 修改原有的值m2["apple"] = 4fmt.Println(m2) // map[apple:4 banana:2 orange:3]// 设置新的值m2["apple2"] = 5fmt.Println(m2)// map[apple:4 apple2:5 banana:2 orange:3]

获取值

通过键名获取 Map 相对应的键值,获取键值的同时也可以获取键是否存在。

    // 直接获取键值value := m2["apple"]fmt.Println(value) // 4// 获取键值,并获取是否存在value1,ok1 := m2["apple"]fmt.Println(ok1) // truefmt.Println(value1) // 4// 获取键值,并获取是否存在value2,ok2 := m2["apple3"]fmt.Println(ok2) // falsefmt.Println(value2) // 0

获取 Map 元素数量

可以通过 len 函数获取 Map 元素的数量

	m3 := map[string]int{"apple": 1,"banana": 2,"orange": 3,"apple1": 3,"apple2": 3,"apple3": 3,}fmt.Println(len(m3)) //6

删除元素

  1. go 提供了一个用来删除 Map 元素的函数,delete 函数,传递 Map 和需要删除的键名。
  2. go 没有提供清空整个 Map 的方法,需要清空可以将 nil 赋值给 Map
	delete(m3,"apple1")delete(m3,"apple2")delete(m3,"apple3")fmt.Println(m3)// map[apple:1 banana:2 orange:3]// 清空mapm3 = nilfmt.Println(m3) // map[]

遍历 Map

  1. 遍历 map 可以使用 for range 语法来遍历 Map
  2. 不过 map 是无序的,不能保证输出顺序是固定的
	for k,v := range m3{fmt.Printf("Key:%s Result:%d\n",k,v)}

引用类型

map 和切片一样也是引用类型,如果直接用 = 赋值,两者其实指向的 map 是一样的

	m4 := m3fmt.Println(m4) // map[apple:1 banana:2 orange:3]m3["apple"] = 10fmt.Println(m3) // map[apple:10 banana:2 orange:3]fmt.Println(m4) // map[apple:10 banana:2 orange:3]

可以看到把 m3 赋值给 m4 之后,修改了 m3 的某个key ,m4 也一起改动了

注意事项

  1. Map 是引用类型,注意赋值或者传参给函数的时候实际都是相同的 Map。
  2. Map 的键必须是可比较的类型,如整数、字符串和指针等,但是切片、函数和结构体等类型是不可比较的,因此不能用作键。
  3. Map 中的元素是无序的,这意味着遍历 Map 时,元素的顺序可能会随机改变。
  4. Map 的容量是动态变化的,它会自动调整容量以适应新的元素。
  5. 如果使用未初始化的 Map,会导致运行时错误。需要使用 make() 函数来初始化 Map。
  6. Map 在并发环境下不是安全的。如果需要在并发环境下使用 Map,需要使用 sync 包中提供的锁机制来保护 Map。
  7. Map 并发读写会造成致命错误,所以在并发环境中要想清楚使用 Map 的场景,和加锁的地方。

http://www.ppmy.cn/news/1433914.html

相关文章

AIGC时代下,知识管理有点多余了?

尤瓦尔在《今日简史》中曾断言“每过10年,你都要接受再培训,你学过的知识都可能被颠覆。”。而在当今AIGC爆火,AI技能日新月异的情况下,我们所接触、了解到的信息、知识也在不断增多和迭代。这种情况下,作为普通人&…

SpringBoot 3.2.5 引入Swagger(OpenApi)

SpringBoot 3.2.5 引入Swagger(OpenApi) pom文件配置文件启动类Controller 层ApiFox题外话 springdoc-openapi 和 swagger 都可以用,用其中一个就行,不用两个都引入。 这里简单记录以下springdoc-openapi。 springdoc-openapi(J…

2024创业项目新方向,智享无人实景直播配合智能贴图数字人,让直播更简单,帮助商家快速引流客户到店,帮助创业者轻松实现梦想!

随着科技的迅猛发展,直播行业也经历了一次又一次的变革和创新。在2024年,AI实景无人直播成为了这个领域的全新宠儿,为商家和观众带来了前所未有的智能、高效体验。这种革命性的直播方式不仅降低了运营成本,还极大地提升了直播的效…

算法学习系列(五十一):背包模型(一)

目录 引言一、采药二、装箱问题三、宠物小精灵之收服 引言 关于 背包问题 可以参考我之前的博客,由于基础的算法和模板已经学过了,所以现在就是开始学模型了,难点就是阅读理解、抽象模型、代码熟练度、心理素质也就是这几个难点了&#xff0…

Spring源码中的简单工厂模式

Spring 源码中广泛运用了各种设计模式,其中包括简单工厂模式。简单工厂模式在 Spring 中主要用于简化对象的创建过程,将对象的创建逻辑集中管理,从而使得客户端代码无需关心具体的对象创建细节,只需与工厂交互就能获取所需的对象实例。这种设计有助于提高代码的可读性、可维…

什么是关键信息基础设施及其安全保护条例

关键信息基础设施是国家的重要战略资源,涉及到国家的主权、安全和发展利益。这些设施在国家经济和社会服务中承担着重要角色,其安全稳定运行直接关系到国家安全和经济社会健康发展。让我们一起来了解一下什么是关键信息基础设施及其安全保护条例。 一、…

ELK创建仪表盘

创建仪表盘步骤: 一、保存search二、生成饼图三、创建仪表盘 一、保存search 首先保存一段时间内的search,可以添加想要的字段,并保存这个search方便下次直接打开该search,并方便在可视化和仪表盘中使用该search. 二、生成饼图…

【数据库】三、数据库SQL语言命令(基础从入门到入土)

【全文两万多字,涵盖大部分常见情况,建议点赞收藏】 目录 文章目录 目录安装SQL语言1.使用2.DATABASE查看所有库新建数据库修改数据库删除数据库连接数据库 3.TABLE创建表查看库所有表删除表查看表信息重命名表修改表字段(列)表中…