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,一经查实,立即删除!

相关文章

ABP文档翻译--值对象

本人是ABP初学者,在看英文文档和tkb至简 的ABP框架理论研究总结(典藏版)时,发现大神tkb至简中少了对Value Objects的翻译,看文档是新的,大神没时间把,小弟给补充上。   介绍 值对象基类 最佳实践 介绍 “用于描述领…

c++ so 反射_c++如何实现反射功能?

问题主 和 vczh 可以看下我这样弄,是否符合要求?定义类的时候稍微傻一点,但是他既不要求pod, 也没有什么侵入式的基类要求。甚至还允许你把成员定义成private的。连C11都不需要。struct test_type0{DEF_FIELD_BEGIN(test_type0)pr…

知识图谱简史:从1950到2019

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

easyui ajax post,EasyUI框架 使用Ajax提交注册信息的实现代码

EasyUI框架 使用Ajax提交注册信息的实现代码一、服务器代码:ControllerScope("prototype")public class StudentAction extends BaseAction {private static final long serialVersionUID -2612140283476148779L;private Logger logger Logger.getLogge…

PHP文件缓存实现

有些时候,我们不希望使用redis等第三方缓存,使得系统依赖于其他服务。这时候,文件缓存会是一个不错的选择。 我们需要文件缓存实现哪些功能: 功能实现:get、set、has、increment、decrement、delete、flush 能够在较短…

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

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

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

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

ajax 输入不为空,ajax POST响应为空

尝试通过单击按钮发布数据,但作为响应,PHP脚本中将其显示为空这是html这是jqueryvar action 1;$("input").on("click", sendData);function sendData() {if ( action 1 ) {$("#btn").css("background", "…

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

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

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

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

jquery 获取键值对中最大值_jquery属性的操作

HTML示例代码:第一个标题家用电器分类家用电器价格11男:女:第一行第二行第三行第四行第二个标题第一段第二段属性:attr(n|k,v|p|f):设置或返回被选属性的值name:返回所有所选属性的值key,value:以键值对的方式设置所有所选属性的值properties…

python怎么一直循环_python 基础之while无限循环

用户登录程序 username "chenxi" passwed "testki" counter 0 while counter < 3: # 测试3次 user input("输入用户名&#xff1a;") passw input("输入密码&#xff1a;") if user username and passw passwed : print(&qu…

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

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

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

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

java.lang.UnsupportedClassVersionError: Bad version number in .class file异常

java.lang.UnsupportedClassVersionError: Bad version number in .class file异常 部署工程时也出现过因为版本不同引起的问题&#xff0c;那时我们用的IDE的编译器是JDK5.0&#xff0c;而那台Linux装的是JDK6.0&#xff0c;部署后发现很多功能都出错&#xff0c;看来有些东西…

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

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

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

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

ajax实现重新绘图,如何画Flot AJAX更新图

在上一章我们提到了如何画实时更新图,而这一章就要教你们如何利用AJAX去后端抓数据回来做实时更新图.系统负载实时更新图(AJAX)我们直接拿上一章的范例来做修改,在这里只说明有修改到的部份,有任何不清楚的地方,你也可以随时回到上一章去查看.准备资料首先,因为我们画的是系统负…

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

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

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

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