go语言之map

 1.map认识       

        哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或者删除对用的value。

        在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应的key和value。map中所有的key都是相同的类型,所有的value也是相同的类型,但是key和value之间可以是不同的数据类型。其中K对应的key必须是支持==比较运算符的数据类型,所以map可以通过测试key是否相等来判断是否已经存在。

 2.map的创建       

        内置的make函数可以创建一个map:

ages := make(map[string]int) // mapping from strings to ints

        我们也可以用map字面值的语法创建map,同时还可以指定一些最初的key/value:

package mainimport "fmt"func main() {ages := map[string]int{"alice":   31,"charlie": 34,}fmt.Println(ages)
}map[alice:31 charlie:34]

        也可以用下列来创建map:

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34fmt.Println(ages)
}map[alice:31 charlie:34]

        因此,另一种创建空的map的表达式是 map[string]int{} 。

3.map的引用

        Map中的元素通过key对应的下标语法访问:

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34fmt.Println(ages["alice"])
}31

        我们也可以用内置的delete函数可以删除元素:

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34delete(ages, "alice")fmt.Println(ages["alice"])fmt.Println(ages)
}0
map[charlie:34]

        所有这些操作是安全的,即使这些元素不在map中也没有关系;如果一个查找失败将返回 value类型对应的零值,例如,即使map中不存在“bob”下面的代码也可以正常工作,因为 ages["bob"]失败时将返回0。

        

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34ages["bob"] = ages["bob"] + 1fmt.Println(ages)
}map[alice:31 bob:1 charlie:34]

        而且 x += y 和 x++ 等简短赋值语法也可以用在map上,所以上面的代码可以改写成

ages["bob"] += 1

        更简单的写法

ages["bob"]++

        但是map中的元素并不是一个变量,因此我们不能对map的元素进行取址操作:

_ = &ages["bob"] // compile error: cannot take address of map element

        禁止对map元素取址的原因是map可能随着元素数量的增长而重新分配更大的内存空间,从而 可能导致之前的地址无效。要想遍历map中全部的key/value对的话,可以使用range风格的for循环实现,和之前的slice遍历语法类似。下面的迭代语句将在每次迭代时设置name和age变量,它们对应下一个键/值对:

package mainimport "fmt"func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34ages["bob"] = ages["bob"] + 1fmt.Println(ages)for name, age := range ages {fmt.Printf("%s\t%d\n", name, age)}
}map[alice:31 bob:1 charlie:34]
charlie	34
bob	1
alice	31

        Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的,每一次遍历的顺序都不相同。这是故意的,每次都使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现。如果要按顺序遍历key/value对,我 们必须显式地对key进行排序,可以使用sort包的Strings函数对字符串slice进行排序。下面是 常见的处理方式:

package mainimport ("fmt""sort"
)func main() {ages := make(map[string]int)ages["alice"] = 31ages["charlie"] = 34var names []stringfor name := range ages {names = append(names, name)}sort.Strings(names)for _, name := range names {fmt.Printf("%s\t%d\n", name, ages[name])}}alice	31
charlie	34

        因为我们一开始就知道names的最终大小,因此给slice分配一个合适的大小将会更有效。下 面的代码创建了一个空的slice,但是slice的容量刚好可以放下map中全部的key:

names := make([]string, 0, len(ages))

        在上面的第一个range循环中,我们只关心map中的key,所以我们忽略了第二个循环变量。 在第二个循环中,我们只关心names中的名字,所以我们使用“_”空白标识符来忽略第一个循 环变量,也就是迭代slice时的索引。 map类型的零值是nil,也就是没有引用任何哈希表。

        在向map存数据前必须先创建map。 通过key作为索引下标来访问map将产生一个value。如果key在map中是存在的,那么将得到 与key对应的value;如果key不存在,那么将得到value对应类型的零值,正如我们前面看到的 ages["bob"]那样。这个规则很实用,但是有时候可能需要知道对应的元素是否真的是在map 之中。例如,如果元素类型是一个数字,你可以需要区分一个已经存在的0,和不存在而返回 零值的0,可以像下面这样测试:

age, ok := ages["bob"]
if !ok { /* "bob" is not a key in this map; age == 0. */ }
或者
if age, ok := ages["bob"]; !ok { /* ... */ }

        在这种场景下,map的下标语法将产生两个值;第二个是一个布尔值,用于报告元素是否真 的存在。布尔变量一般命名为ok,特别适合马上用于if条件判断部分。 和slice一样,map之间也不能进行相等比较;唯一的例外是和nil进行比较。要判断两个map是 否包含相同的key和value,我们必须通过一个循环实现:

func equal(x, y map[string]int) bool {if len(x) != len(y) {return false}for k, xv := range x {if yv, ok := y[k]; !ok || yv != xv {return false}}return true
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XSKY CTO 在英特尔存储技术峰会的演讲:LLM 存储,架构至关重要

5 月 17 日,英特尔存储技术峰会在北京顺利举办。作为英特尔长期的合作伙伴,星辰天合受邀参加了此次峰会。星辰天合 CTO 王豪迈作为特邀嘉宾之一,作了主题为《LLM 存储:架构至关重要》的演讲,分享了大语言模型&#xff…

2024年中国金融行业网络安全案例集

随着科技的飞速发展,金融行业与信息技术的融合日益加深,网络安全已成为金融行业发展的生命线。金融行业作为国家经济的核心支柱,正在面临着日益复杂严峻的网络安全挑战。因此,深入研究和探讨金融行业的网络安全问题,不仅关乎金融行业的稳健运…

Jtti:如何在Linux服务器上查看系统日志?

在美国的Linux服务器上查看系统日志是系统管理员常见的任务之一。系统日志可以帮助你诊断和解决服务器上的问题。以下是如何在Linux服务器上查看系统日志的详细教程: 1. 连接到服务器 首先,通过SSH连接到你的Linux服务器。如果你在本地终端使用SSH&#…

MIPI竖屏解决方案,普立晶POL8901升级POL8903 两PORT LVDS桥接到MIPI,加旋转

POL8903描述: 系统: •采用高性能MIPS 32位CPU内核; •高性能DSP内核图像处理单元; •16 KB指令Cache;16 KB数据Cache; •96 KB SRAM;内置DDR 3控制器; LVDS输入: …

Python代码:十七、生成列表

1、题目 描述: 一串连续的数据用什么记录最合适,牛牛认为在Python中非列表(list)莫属了。现输入牛牛朋友们的名字,请使用list函数与split函数将它们封装成列表,再整个输出列表。 输入描述: …

取代或转型?人工智能对软件测试的影响(内附工具推荐)

在当今快速发展的数字环境中,从移动App到基于Web的平台,软件已成为我们日常生活和工作不可或缺的一部分。然而,随着软件系统变得越来越复杂,如何确保其质量和可靠性已成为开发人员和测试人员所面临的一大重要挑战。 这就是软件测…

从0开始学统计

1.什么是统计学?统计学主要研究哪些问题? 统计学是一门科学,主要研究数据的收集、分析、解释和呈现方法。它涉及收集数据的方法,如调查和实验设计,以及通过数学和计算方法来分析和解释数据的过程。统计学的主要目标是…

(九)Python3 接口自动化测试,Jenkins调度执行

(九)Python3 接口自动化测试,Jenkins调度执行 Jenkins配置在远程服务器上执行Shell来运行Python(通过SSH免密方式执行) 说明:Jenkins部署在ServerA:10.1.1.74上,要运行的程序在ServerB:10.1.1.196 分两步 第一步:Linux Centos7配置SSH免密登录 Linux Centos7配置SSH…

长沙客户忠诚度调查

本文由群狼调研(长沙员工满意度调查)出品,欢迎转载,请注明出处。员工满意度调查是衡量员工对公司或组织的工作环境、待遇、领导力和管理的满意程度的一种方法。这项调查对于组织和公司非常重要,因为它可以提供有关员工…

Autoware 软件功能(二)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务,并且需要GPU资源,可以考虑使用Compshare的GPU算力云平台。他们提供高性价比的4090 GPU,按时收费每卡2.6元,月卡只需要1.7元每小时,并附带200G…

【好物推荐】给大家安利一个静态网站生成器框架搜集

你一定好奇很多文档网站是用什么框架写的,或者你听说过 vue press,Git Book,其实这类优秀的网站很多,有个网站统计了所有框架的热度,大家有兴趣的可以去看看。 传送门:https://jamstack.org/generators/ 比…

UE5 使用外置摄像头进行拍照并保存到本地

连接外置摄像头功能:https://docs.unrealengine.com/4.27/zh-CN/WorkingWithMedia/IntegratingMedia/MediaFramework/HowTo/UsingWebCams/ 核心功能:UE4 相机拍照功能(图片保存)_ue 移动端保存图片-CSDN博客 思路是: …

万博智云×华为云 | HyperBDR云容灾上架,开启联营联运新篇章

日前,万博智云HyperBDR云容灾正式入驻华为云云商店,成为华为云基础软件领域联营联运合作伙伴。通过联营联运,双方将进一步加深在产品、解决方案、渠道拓展等多方面的强强联合,为企业提供更加安全、高效的数据保护解决方案&#xf…

vue-table的使用,解决懒加载展开列,数据量过大,造成的卡顿问题

场景 有需求,使用懒加载的展开列,当加载的数据量过大,如大于1000条以上,浏览器可能卡死挂了 分析 大量的dom的渲染绘制,导致了浏览器处理不过来 解决 虚拟列表 vue-table 虚拟列表的使用 vue-table官网 <vxe-table border resizable height="100%" r…

重量and体积,不要在傻傻的花冤枉钱寄快递了!

寄快递时有没有遇到过明明不重却被按体积收费的情况&#xff1f;别急&#xff0c;今天就来给大家揭秘快递收费的奥秘&#xff01; 实际重量和体积重量&#xff01; 首先&#xff0c;我们要明白两个概念&#xff1a;实际重量和体积重量。实际重量就是你看到的物品重量&#xf…

JVM为什么要进行分代呢?

Java 虚拟机&#xff08;JVM&#xff09;的内存管理是 Java 性能优化的核心部分&#xff0c;而分代思想&#xff08;Generational Garbage Collection&#xff09;是其关键机制之一。理解 JVM 的分代思想对于优化 Java 应用的性能、减少垃圾收集的停顿时间至关重要。本文将详细…

angr使用学习(持续更新)

首先我是直接在kali中安装的&#xff0c;也是边练边学的。 嗯&#xff0c;要在纯净python环境&#xff0c;所以是在 virtualenv 虚拟环境里&#xff0c;也不是特别会用这个&#xff0c;按照教程一步步做的 source venv/bin/activate 进入了对应环境 退出是 deactivate en,ipy…

DataGrip软件执行已将创建好的sql文件步骤

一、在需要导入sql文件上右击找到SQLScript &#xff0c;然后点击 Run SQL Script 二、找到sql文件&#xff0c;点击OK就可以了

Day01-01-git

Day01-01-git Content List0. 运维发展过程1. ci-cd-co基础1.1 软件的生命周期1&#xff09;软件的声明周期&#xff1a;软件从0-->1-->0过程2&#xff09;ci/cd3&#xff09;Devops4) 小结 1.2 什么是环境1.3 什么是代码部署1.4 代码发布方式 3. DevSecOpt之Git极速入门…