c++ map初始化同时赋值_Golang入门教程——map篇

点击上方蓝字,和我一起学技术。

8215949207206634d1dd65ddbf346049.png

今天是golang专题的第7篇文章,我们来聊聊golang当中map的用法。

map这个数据结构我们经常使用,存储的是key-value的键值对。在C++/java当中叫做map,在Python中叫做dict。这些数据结构的名称虽然不尽相同,背后的技术支撑也不一定一样,比如说C++的map是红黑树实现的,Java中的hashmap则是通过hash表。但是使用起来的方法都差不多,除了Java是通过get方法获取键值之外,C++、Python和golang都是通过方括号获取的。

声明与初始化

golang中的map声明非常简单,我们用map关键字表示声明一个map,然后在方括号内填上key的类型,方括号外填上value的类型。

var m map[string] int

这样我们就声明好了一个map。

但是要注意,这样声明得到的是一个空的map,map的零值是nil,可以理解成空指针。所以我们不能直接去操作这个m,否则会得到一个panic。

panic: assignment to entry in nil map

panic在golang当中表示非常严重不可恢复的错误,可以恢复的错误有些类似于Java或者是其他语言当中的异常,当异常出现的时候,我们可以选择handle住它们,让程序不崩溃继续运行。而那些非常严重,无法handle的异常在golang当中称为panic。

golang当中的异常处理机制和其他语言相差很大,整体的逻辑和内核都不太一样。当然这个是一个比较大的话题,我们这里可以简单将它理解成error就行了。

回到map上来,我们声明了一个map之后,想要使用它还需要对它进行初始化。使用它的方法也很简单,就是使用make方法创建出一个实例来。它的用法和之前通过make创建元组非常类似:

m = make(map[string] int)// 我们还可以指定创建出来的map的存储能力的大小
m = make(map[string] int, 100)

我们也可以在声明的时候把初始化也写上:

var m = map[string] int {"abc": 3, "ccd": 4}

当然也可以通过赋值运算符,直接make出一个空的map来:

m := make(map[string] int)

增删改查

map创建好了当然是要用的,整体使用起来和Python当中的dict比较像,比较简单直观,没有太多弯弯绕的东西。我们一个一个来看,首先是map的添加元素。map的添加元素直接用方括号赋值即可:

m["abc"] = 4

同样,我们需要保证这里的m经过初始化,否则也会包nil的panic。如果key值在map当中已经存在,那么会自动替换掉原本的key。也就是说map的更新和添加元素都是一样的,都是通过这种方式。如果不存在就是添加,否则则是更新。

删除元素也很简单,和Python当中类似,通过delete关键字删除

delete(m, "abc")

当我们删除key的时候,如果是其他的语言,我们需要判断这个key值是否存在,否则的话不能删除,或者是会引起异常。在golang当中并不会,对这点做了优化。如果要删除的key值原本就不在map当中,那么当我们调用了delete之后,什么也不会发生。但是有一点,必须要保证传入的map不为nil,否则也会引起panic。

最后,我们看下元素的查找。对于Java和Python来说我们都是通过一些判断语句来进行判断的,比如java的话是containsKey,Python的话用in操作符。在golang当中我们则是直接通过方括号进行查询,那么这就有了一个问题,如果key不在其中怎么办?

如果是其他语言,我们直接访问一个不存在的key是会抛出异常的,但是在golang当中不会触发panic,因为它会额外返回一个bool类型的元素表示元素是否查找到。所以我们可以同时用两个变量去接收,如果第二个变量为True的话,就说明查找成功了。

进一步,我们还可以将这个逻辑和if的初始化操作合在一起:

if val, ok := m["1234"]; ok {
    fmt.Println(val)
}

这里的ok就表示查找是否成功,这也是golang当中map查找的惯用写法。

最后, 我们看一个实际运用map的例子,通过map来生成统计字符串当中单词数量的wordCount:

package mainimport ("golang.org/x/tour/wc""strings"
)func WordCount(s string) map[string]int {
 cnt := make(map[string]int)// 通过Split方法拆分字符串for _, str:= range strings.Split(s){// 直接++即可,golang会自动填充
  cnt[str]++
 }return cnt
}func main() {
 wc.Test(WordCount)
}

总结

到这里,关于golang当中map的使用就算是介绍完了。我们可以发现,map一如既往地体现了golang语法精简的特点。比如通过返回error的操作省略了判断元素是否存在map当中的操作,刚开始的时候会觉得有些不太适应,但是接触多了之后,会发现这些都是有套路的。golang的套路就是精简,能省就省,能简单绝不复杂。

这一点不仅在map上体现,在其他特性上也是一样。在后续的内容当中,我们还会继续感知这一点。

如果喜欢本文,可以的话,请点个关注,给我一点鼓励,也方便获取更多文章。

bab8542cc31d1a9685fbbeedffa8c305.png

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

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

相关文章

知识图谱简史:从1950到2019

来源:专知 地址:http://knowledgegraph.today/paper.html 作者 | Claudio Gutierrez 、 Juan F. Sequeda 编译 | Xiaowen 目录: 知识图谱可以被认为是实现计算机科学的早期愿景,即创建能够大规模集成知识和数据的智能系统。“知识…

影响计算机算法世界的十位大师(上)

来源:数学职业家1、伟大的智者——Don E.Knuth,中文名:高德纳(1938-)算法和程序设计技术的先驱者。Oh,God!一些国外网站这样评价他。一般说来,不知道此人的程序员是不可原谅的。其经典著作《计算机程序设计艺术》更是被誉为算法中…

echars显示折点数据_数据可视化的基础语法

数据可视化的基础语法可视化主要是以图像来展示数据间的关系,常见的图形种类有折线图,散点图,条形图,直方图,饼图。此外在接下来课程中还会用到箱线图,热力图,蜘蛛图,表示二元变量分布和成对关系的视图。今…

cad快捷键文件路径_办公格式转太难不会看这里!CAD、PDF、Word、Excel、TXT教你玩转...

办公格式转,你遇到最难解决的问题是哪些?办公格式转,最让你头疼的文件格式是哪些?办公格式转,你最想要学习转换格式有哪些?我:Word、Excel、PPT、TXT、CAD、PDF、JPG统统都想要进行解决&#xf…

80x86汇编—分支循环程序设计

文章目录 查表法: 实现16进制数转ASCII码显示计算AX的绝对值判断有无实根地址表形成多分支从100,99,...,2,1倒序累加输入一个字符,然后输出它的二进制数大小写转换大写转小写小写转大写 冒泡排序剔除空格 查表法: 实现16进制数转ASCII码显示 题目要求: …

织梦服务器系统win10,WIN服务器爆破DEDECMS后台目录

利用脚本python:#!/usr/bin/env python/** author Mochazz* team 红日安全团队* env pyton3**/import requestsimport itertoolscharacters "abcdefghijklmnopqrstuvwxyz0123456789_!#"back_dir ""flag 0url "http://192.168.1.9/t…

人工智能技术对专利制度的挑战与应对

来源:上海市法学会内容摘要人工智能技术作为人类的一项发明创造,本身具备了一定的创造力。无论是专利法治实践还是理论研究均无法否认,在弱人工智能时代,人工智能技术兼具发明创造工具和发明创造方案的提供者的双重身份。由此导致…

网络推广恶意点击js_做好网络推广,是做好网络营销的必要条件

互联网社会里网络无处不在,商机无处不在,企业通过网络营销,能有效的避免线下竞争激烈的市场,做好网络推广,是做好网络营销的必要条件。一个优秀的网络推广团队不但能实现提高企业的知名度的目的,还能帮助企…

css盒子模型_css的盒子模型是什么

CSS盒子模型就是在网页设计中经常用到的CSS技术所使用的一种思维模型。css盒子模型又称为框模型 (Box Model) ,包含了元素内容(content)、内边距(padding)、边框(border)、外边距(margin)几个要素组成了盒子模型。图中最内部的框是元素的实际内容,也就是…

6G应用场景有哪些?首份6G报告给你揭晓

来源: 5G产业圈导 读中国移动研究院无线与终端技术研究所所长丁海煜介绍称,按照移动通信产业“使用一代、建设一代、研发一代”的发展节奏,业界预期6G将于2030年左右实现商用。“创新、协调、绿色、开放、共享”应成为5G向6G演进的新发展理念…

linux python 图形界面开发_python在linux制作图形界面(snack)

snack是一个用于在linux制作图形界面(GUI)的模块,该模块由c编写,而且redhat的系统都自带这个模块。 1.获取模块 虽然redhat系统会自带这个模块,但是直接去import snack会提示找不到模块,一个原因是我们重装…

虚拟搭建局域网模拟器_巧用虚拟局域网,快速搭建私有云,一步就能搞定

前段时间公司一直在使用局域网来进行文件共享,用一台电脑把某个文件夹在局域网里共享出来,其他电脑远程访问,但是这样使用太麻烦,要是主电脑忘记开机,其它人就用不了。再就是,一旦离开公司之后,…

5个层级带你看清一颗芯片的内部结构

来源:北京物联网智能技术应用协会导 读在我们阐明半导体芯片之前,我们先应该了解两点。其一半导体是什么,其二芯片是什么。

python使用shell命令_python 调用shell命令的方法

在python程序中调用shell命令,是件很酷且常用的事情…… 1. os.system(command) 此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的退出状态,如果command有执行内容,会在标准输出显示。这实际上…

java中必检异常有哪些_Java面试题经典面试题220道(附答案)

Java基础:1.JDK 和 JRE 有什么区别?2. 和 equals 的区别是什么? 解读3. 两个对象的 hashCode() 相同, 那么 equals() 也一定为 true吗?4. final 在 Java 中有什么作用?5. Java 中的 Math. round(-1. 5) 等…

11项关键先进制造技术解读!

来源:中国指挥与控制学会图片:来源于网络上届美国总统奥巴马非常重视制造业。其发起成立的“先进制造业合作委员会”,Advanced Manufacturing Partnership,就未来制造业的发展做出了展望,重点规划11个技术领域&#xf…

网站程序数据库怎么上传到服务器上,网站的数据库怎么上传到服务器

网站的数据库怎么上传到服务器 内容精选换一换通常在将数据导入数据库前,即将入库的数据已经在相关主机上了。我们称这种保存着待入库数据的服务器为数据服务器。此时,只需检测以确认数据服务器和GaussDB(for openGauss)集群能够正常通信,并查…

知道接口地址 如何传数据_数据不知道如何可视化?一款工具推荐给大家

之前我们介绍过 Python 里面的一些数据分析和可视化工具,比如 Pandas、Modin、Dash 等。今天要介绍一款标星 12.1K 的数据可视化工具 bokeh,优雅、简洁、高性能的交互式可视化库,同时支持大数据量和流式数据。其中 PyPI 和 Conda 每月安装超过…

c# 从一组数中随机抽取一定个数_Python随机模块22个函数详解

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也会用到。random模块,用于生成伪随机数,之所以称之为伪随…

读书人:人机融合中的深度态势感知

雅典学院(拉斐尔)来源:人机与认知实验室“你现在的气质里,藏着你走过的路,读过的书和爱过的人。"— 电影《卡萨布兰卡》里的一句话《追问人工智能》--刘伟 - 读书人视频如下:https://www.bilibili.com…