Golang学习:基础知识篇(三)—— Map(集合)

Golang学习:基础知识篇(三)—— Map集合

  • 前言
  • 什么是Golang?
  • Map集合
    • 定义 Map
    • 综合实例
    • 补充

前言

很久之前就想学Go语言了,但是一直有其他东西要学,因为我学的是Java嘛,所以后面学的东西一直是跟Java相关的。

最近来到公司实习,需要用到Go语言,所以就趁着这个机会把Go学了。
在这里插入图片描述

什么是Golang?

简单来说就是由Google公司的Robert Griesemer,Rob Pike和Ken Thompson设计的一种静态类型、编译型语言。它在2009年正式对外公开,目标是解决大规模软件工程中的问题。Go语言的语法简洁清晰,易于学习和使用,编译速度快,具有垃圾回收功能,并且拥有强大的标准库。

Go语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。Go语言设计最本质的初衷就是简单,希望程序员的工作量最小化,利用Go本身少量的特性,并通过组合的方式去解决实际问题。

Map集合

Map就不用多介绍了吧,跟Java那个是一回事,简单来说就是:

  • Map 是一种无序的键值对的集合。
  • Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
  • Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,遍历 Map 时返回的键值对的顺序是不确定的。
  • 在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 “”。
  • Map 是引用类型,如果将一个 Map 传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对 Map的修改会影响到所有引用它的变量。

(分割线)

推荐学习教程:菜鸟教程 | Go语言

我会更侧重讲一些网上教程没有,或者没讲清楚的一些东西。

定义 Map

可以使用内建函数 make 或使用 map 关键字来定义 Map:

/* 使用 make 函数 */
map_variable := make(map[KeyType]ValueType, initialCapacity)

其中 KeyType 是键的类型,ValueType 是值的类型,initialCapacity 是可选的参数,用于指定 Map 的初始容量。Map 的容量是指 Map 中可以保存的键值对的数量,当 Map 中的键值对数量达到容量时,Map 会自动扩容。如果不指定 initialCapacity,Go 语言会根据实际情况选择一个合适的值。

例如:

// 创建一个空的 Map
m := make(map[string]int)// 创建一个初始容量为 10 的 Map
m := make(map[string]int, 10)

获取元素:

// 获取键值对
v1 := m["apple"]
v2, ok := m["pear"]  // 如果键不存在,ok 的值为 false,v2 的值为该类型的零值

修改元素:

// 修改键值对
m["apple"] = 5

获取 Map 的长度:

// 获取 Map 的长度
len := len(m)

遍历 Map:

// 遍历 Map
for k, v := range m {fmt.Printf("key=%s, value=%d\n", k, v)
}

删除元素:

// 删除键值对
delete(m, "banana")

综合实例

看看菜鸟上面的一个综合实例:

package mainimport "fmt"func main() {var siteMap map[string]string /*创建集合 */siteMap = make(map[string]string)/* map 插入 key - value 对,各个国家对应的首都 */siteMap [ "Google" ] = "谷歌"siteMap [ "Runoob" ] = "菜鸟教程"siteMap [ "Baidu" ] = "百度"siteMap [ "Wiki" ] = "维基百科"/*使用键输出地图值 */ for site := range siteMap {fmt.Println(site, "首都是", siteMap [site])}/*查看元素在集合中是否存在 */name, ok := siteMap [ "Facebook" ] /*如果确定是真实的,则存在,否则不存在 *//*fmt.Println(capital) *//*fmt.Println(ok) */if (ok) {fmt.Println("Facebook 的 站点是", name)} else {fmt.Println("Facebook 站点不存在")}
}

补充

1、还记得上篇文章提到的那个数组切片吗?就是这个:
在这里插入图片描述

但是在Map中,这样子是可以正确赋值的哦,如下:

func main() {myGreeting := make(map[string]string)myGreeting["Tim"] = "Good morning."myGreeting["Jenny"] = "Bonjour."fmt.Println(myGreeting)
}

因为在Go语言中,映射是一种动态数据结构,可以在运行时动态地添加和删除键值对。当您创建一个新的映射时,它是空的,但是我们可以立即向其中添加新的键值对。

然而,切片不同。虽然切片背后的数组可以动态地增长和缩小,但是不能直接访问未初始化的元素。切片中如果你想要向空切片中添加元素,应该使用 append 函数。

2、还需要注意的地方就是key是区分大小写的哈,记得。

3、再补充一个if语句和Map的搭配使用

func main() {myGreeting := map[int]string{0: "Good morning!",1: "Bonjour!",2: "Buenos dias!",3: "Bongiorno!",}fmt.Println(myGreeting)if val, exists := myGreeting[3]; exists {delete(myGreeting, 3)//why can this place still take out the value?//because 这个操作删除了键 3 及其对应的值,但是它并不影响已经被赋值的 val 和//exists 变量。所以,即使你已经从 map 中删除了键 3,当你打印 val 和 exists 的值时,它们仍然保持着初始化时的值。fmt.Println("val: ", val)fmt.Println("exists: ", exists)} else {fmt.Println("That value doesn't exist.")fmt.Println("val: ", val)fmt.Println("exists: ", exists)}fmt.Println(myGreeting)
}

4、补充一个循环语句遍历Map的例子:

func main() {myGreeting := map[int]string{0: "Good morning!",1: "Bonjour!",2: "Buenos dias!",3: "Bongiorno!",}for key, val := range myGreeting {fmt.Println(key, " - ", val)}
}

那么以上就是本次的内容了,在学习的过程中,可以多去敲敲代码,熟悉一下。也可以去菜鸟教程上面多看看,对新人挺友好的,也是我的公司同事推荐的教程网站。

后续也会不定期更新学习记录和一些学习实验。🤠

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

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

相关文章

[MySQL]BLOB/TEXT column ‘xxx‘ used in key specification without a key length

报错信息: SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column xxx used in key specification without a key length 原因: MySQL的唯一索引不支持text类型的字段!

对代码感兴趣 但不擅长数学怎么办——《机器学习图解》来救你

目前,该领域中将理论与实践相结合、通俗易懂的著作较少。机器学习是人工智能的一部分,很多初学者往往把机器学习和深度学习作为人工智能入门的突破口,非科班出身的人士更是如此。当前,国内纵向复合型人才和横向复合型人才奇缺;具有…

网络安全分析——蠕虫病毒动态分析视图

蠕虫病毒(Worm Virus)是一种自我复制的恶意软件,通过网络或系统漏洞传播,感染其他计算机并利用其资源。与其他病毒不同,蠕虫病毒无需依赖于宿主文件,并可以自动在网络中传播,因此具有高度传染性…

公司如何防止源代码外泄,保护开发部门代码安全呢?

在智能制造业中,研发人员的开发环境,大多数采用c#开发语言svn 或c#git进行软件系统的开发,但是c#语言如何来防泄密保护呢?德人合科技针对于制造类企业制定了安全稳定的源代码防泄密方案,不影响员工的正常工作&#xff…

前端HTML要了解的知识,DOCTYPE 声明究竟是做什么的、作用是什么?

🌟🌟🌟 专栏详解 🎉 🎉 🎉 欢迎来到前端开发之旅专栏! 不管你是完全小白,还是有一点经验的开发者,在这里你会了解到最简单易懂的语言,与你分享有关前端技术和…

Excel冻结窗格

1、冻结表格首行 点击菜单栏中的“视图”,选择“窗口”选项卡中的“冻结窗格”下的小三角,再选择“冻结首行”; 2.冻结表格首列 点击菜单栏中的“视图”,选择“窗口”选项卡中的“冻结窗格”下的小三角,再选择“冻结…

外汇天眼:澳大利亚拟规范数字资产中介与交易所!

澳大利亚政府,通过财政部,宣布正在努力引入一项监管框架,针对为澳大利亚居民和澳大利亚企业提供数字资产访问和持有服务的实体,将包括对所有数字资产中介的许可要求。 这些改革旨在解决已经确定的消费者风险,并支持数…

通过这个技术,浏览器可以运行Node.js、Rust、Python、PHP、C++、Java代码了!

近日,WebContainers 发布重要更新,WASI(WebAssembly 系统接口)已全面集成到 WebContainers 中。这是一个重要里程碑,它扩大了可以使用浏览器执行的操作,是 Web 开发的全新范例,允许运行大量原生…

应用在红外线遥控领域中的心率传感信号接收芯片

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机和手机系统中。 红外线…

探讨Acrel-1000DP分布式光伏系统的设计与应用-安科瑞 蒋静

摘 要:分布式光伏发电特指在用户场地附近建设,运行方式以用户侧自发自用、余电上网,且在配电系统平衡调节为特征的光伏发电设施,是一种新型的、具有广阔发展前景的发电和能源综合利用方式,它倡导就近发电,就…

视频太大怎么压缩变小?三分钟学会视频压缩

随着科技的不断发展,视频已经成为了我们日常生活中不可或缺的一部分,然而,大尺寸的视频文件常常会给我们带来诸多困扰,例如发送不便、存储空间不足等等,那么,如何将这些过大的视频文件压缩变小呢&#xff1…

新一代开源语音库CoQui TTS冲到了GitHub 20.5k Star

Coqui TTS 项目介绍 Coqui 文本转语音(Text-to-Speech,TTS)是新一代基于深度学习的低资源零样本文本转语音模型,具有合成多种语言语音的能力。该模型能够利用共同学习技术,从各语言的训练资料集转换知识,来…

2023年中国熔盐储能装机量、新增装机量及行业投资规模分析[图]

熔盐储能是一种可以传递能量、长时间(6-8h)、大容量储能的技术路径,作为传热介质可以实现太阳能到热能的转换,作为储能介质可以实现将热能和电能的双向转换,可以很好的适应和解决以上两大矛盾。因此,熔盐储…

基于SVM+Webdriver的智能NBA常规赛与季后赛结果预测系统——机器学习算法应用(含python、ipynb工程源码)+所有数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Jupyter Notebook环境PyCharm环境MATLAB环境 模块实现1. 数据预处理1)常规赛数据处理2)季后赛数据处理 相关其它博客工程源代码下载其它资料下载 前言 本项目使用了从NBA官方网站获得的数…

[Java]0.1+0.2不等于0.3 !!一分钱问题与解决方案

一、原因 原因很简单,计算机存储和计算数组都是用二进制, 而大部分小数转二进制的时候,就丢失精度了。 0.1、0.2、0.3这些小数在二进制里都是循环小数,计算机不可能存储无限循环小数,所以只能截取一部分,导…

中文连续视觉语音识别挑战赛

视觉语音识别,也称唇语识别,是一项通过口唇动作来推断发音内容的技术。该技术在公共安全、助老助残、视频验真等领域具有重要应用。当前,唇语识别的研究方兴未艾,虽然在独立词、短语等识别上取得了长足进展,但在大词表…

从创业者的角度告诉你AI问答机器人网页的重要性

在数字化时代,创业者面临着越来越多的挑战。而AI问答机器人网页正成为创业者们的必备工具。它可以提供即时客户支持、降低运营成本,并实现全天候服务。接下来,我将从创业者的角度阐述一下,AI问答机器人网页为什么那么重要&#xf…

快速自动化处理JavaScript渲染页面的方法

目录 一、使用无头浏览器 二、使用JavaScript渲染引擎 三、使用前端框架工具 随着互联网技术的不断发展,JavaScript已经成为Web开发中不可或缺的一部分。然而,在自动化处理JavaScript渲染页面方面,却常常让开发者感到头疼。本文将介绍一些快…

Nessus已激活,New Scan按钮不可点击

刷新后会给出下面的提示 Plugins are compiling. Nessus will be limited until compilation is complete. 因为插件编译中,所以扫描功能被禁用了。 查看编辑进度,鼠标放到两个循环箭头上即可查看。

6.4 图的存储结构

思维导图: 前言: --- **6.4 图的存储结构** - **核心问题**:由于图的结构复杂性,我们不能仅仅依赖于元素在存储区的物理位置来表示它们之间的关系。 - **邻接矩阵**: - **基本思路**:虽然图没有顺序存…