Map声明、元素访问及遍历、⼯⼚模式、实现 Set - GO语言从入门到实战

Map声明、元素访问及遍历 - GO语言从入门到实战

Map 声明的方式
m := map[string]int{"one": 1, "two": 2, "three": 3}  	
//m初始化时就已经设置了3个键值对,所以它的初始长度len(m)是3。m1 := map[string]int{}  
//m1被初始化为一个空的map,然后通过m1["one"] = 1添加了一个键值对,所以它的初始长度len(m1)是1。m2 := make(map[string]int, 10)
//使用make函数创建了一个具有初始容量10的map。这里的初始容量(capacity)并不是map的长度(len),但它决定了map可以在不重新分配内存的情况下存储的键值对的最大数量。也就是说,虽然指定了初始容量为10,但map的实际长度(即存储的键值对的数量)可以为0,并可以随着你添加键值对而增加,直到达到容量限制。欢迎关注云尔Websites CSDN博客
//len(m2)将返回0(因为你还没有向m2中添加任何键值对)。

这块知识一定要多敲代码,运行看看,才能加深理解。
代码示例:

package my_map  import "testing"  func TestInitMap(t *testing.T) {  m1 := map[int]int{1: 2, 2: 3, 3: 4}  if v, ok := m1[2]; ok {  t.Logf("m1[2] = %d", v)  } else {  t.Error("Key 2 does not exist in m1")  }  t.Logf("len m1 = %d", len(m1))  m2 := map[int]int{}  m2[4] = 16  t.Logf("len m2 = %d", len(m2))  m3 := make(map[int]int, 10)  t.Logf("len m3 = %d", len(m3))  
}  
Map 元素的访问

与其他主要编程语⾔的差异
在访问的 Key 不存在时,仍会返回零值,不能通过返回 nil 来判断元素是否存在。欢迎关注云尔Websites CSDN博客
优点: 可以避免在访问不存在的键时发生运行时错误,从而使代码更安全。
缺点: 可能会使代码变得更复杂,因为我们必须显式地检查键是否存在。


func TestAccessNotExistingKey(t *testing.T) {  m := map[string]int{}if v, k := m["four"]; k {t.Logf("m[1] = %d", v)  } else {t.Log("欢迎关注云尔Websites CSDN博客")  }m1 := map[int]int{}  if v, k := m1[1]; k {  t.Logf("m1[1] = %d", v)  } else {  t.Log("Key 1 does not exist in m1")  }  m1[2] = 0  if v, k := m1[2]; k {  t.Logf("m1[2] = %d", v)  } else {  t.Error("Key 2 does not exist in m1")  }  m1[3] = 0  if v, k := m1[3]; k {  t.Logf("Key 3's value is %d", v)  } else {  t.Log("Key 3 does not exist in m1")  }  
}
Map 遍历

遍历在之前文章里面说过,这里简单说下:
可以使用range关键字来遍历map。range会返回两个值:键和值。请注意,遍历map的顺序是不确定的,因为map是无序的数据结构。欢迎关注云尔Websites CSDN博客

package main  import "fmt"  func main() {  m := map[string]int{"one": 1, "two": 2, "three": 3}// 使用range遍历map  for key, value := range m {  fmt.Printf("Key: %s, Value: %d\n", key, value)  }  
}

Map 扩展知识

Map 与⼯⼚模式

Map 的 value 可以是任何类型,包括方法。
与 Go 的 Dock type 接⼝⽅式⼀起,可以⽅便的实现单⼀⽅法对象的⼯⼚模式,可以将一个方法的名称(或其他唯一标识符)映射到一个具体的方法实现上。
代码示例:

package main  import "fmt"  type Calculator interface {  Calculate(int, int) int  
}  type Adder struct{}  func (a Adder) Calculate(x, y int) int {  return x + y  
}  type Subtracter struct{}  func (s Subtracter) Calculate(x, y int) int {  return x - y  
}  type Multiplier struct{}  func (m Multiplier) Calculate(x, y int) int {  return x * y  
}  func main() {  calculators := map[string]Calculator{  "add":     Adder{},  "subtract": Subtracter{},  "multiply": Multiplier{},  }  for operation, calculator := range calculators {  result := calculator.Calculate(5, 3)  fmt.Printf("%s 5 and 3 gives: %d\n", operation, result)  }  
}//在上面的示例中,定义了一个Calculator接口,它包含一个Calculate方法。然后创建了三个结构体(Adder、Subtracter和Multiplier),并为它们分别实现了Calculate方法。接下来创建了一个Map,将字符串映射到实现了Calculator接口的对象。最后使用for循环遍历Map,并根据操作类型执行相应的计算。
通过Map实现 Set

Go 的内置集合中没有 Set 实现, 可以 map[type]bool来写。

  1. 元素的唯⼀性,由于map的键必须是唯一的,所以使用map[type]bool可以确保Set中的元素也是唯一的;
  2. 基本操作:添加元素、判断元素是否存在、删除元素、获取元素个数。
//添加元素:
//创建了一个新的map(如果s尚未创建),并将element添加到Set中。
s := make(map[T]bool)  
s[element] = true//判断元素是否存在:
//检查element是否存在于Set中。如果存在,exists将为true;否则为false。
_, exists := s[element]//删除元素:
//从Set中删除element。
delete(s, element)//元素个数:
//返回Set中的元素个数。
len(s)

通过Map实现 Set 的代码示例:


package map_extimport "testing"// TestMapWithFunValue 测试使用函数作为值的map
func TestMapWithFunValue(t *testing.T) {m := make(map[int]func(op int) int)m[1] = func(op int) int { return op }m[2] = func(op int) int { return op * op }m[3] = func(op int) int { return op * op * op }result1 := m[1](2)result2 := m[2](2)result3 := m[3](2)t.Logf("%d, %d, %d", result1, result2, result3)
}// TestMapForSet 测试使用map实现集合功能
func TestMapForSet(t *testing.T) {mySet := make(map[int]bool)mySet[1] = truen := 3if mySet[n] {t.Logf("%d已存在", n)} else {t.Logf("%d不存在", n)}mySet[3] = truet.Logf("集合长度:%d", len(mySet))delete(mySet, 1)n = 1if mySet[n] {t.Logf("%d已存在", n)} else {t.Logf("%d不存在", n)}
}这里是一些需要注意的点:
1. 使用`make`函数初始化map,以明确其类型。
2. 为函数值定义了一个map,并存储了几个不同的函数。
3. 使用`delete`函数从map中删除一个键值对。

Map声明、元素访问及遍历 - GO语言从入门到实战

学习Go语言主要是多练,多找些代码段写写,不懂可以私聊咨询。

欢迎关注云尔Websites CSDN博客

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

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

相关文章

Docker启动Mysql

如果docker里面没有mysql需要先pull一个mysql镜像 docker pull mysql其中123456是mysql的密码 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 -d mysql可以使用如下命令进入Mysql的命令行界面 docker exec -it mysql bash登录mysql使用如下命令,root是…

数据结构--》探索数据结构中的字符串结构与算法

本文将带你深入了解串的基本概念、表示方法以及串操作的常见算法。通过深入理解串的相关概念和操作,我们将能够更好地应用它们来解决算法问题。 无论你是初学者还是进阶者,本文将为你提供简单易懂、实用可行的知识点,帮助你更好地掌握串在数据…

在PHP8中使用instanceof操作符检测对象类型-PHP8知识详解

在PHP8中使用instanceof操作符可以检测当前对象属于哪个类。语法格式如下: objectName instanceof classname下面我们用一个实例来讲解使用instanceof操作符检测对象类型。 本实例将将创建3个类,其中有两个类是父类和子类的关系,然后实例化…

JAVA学习(5)-全网最详细~

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

leetCode 376.摆动序列 贪心算法

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…

图像拼接后丢失数据,转tiff报错rasterfile failed: an unknown

图像拼接后丢失数据 不仅是数据丢失了,还有个未知原因报错 部分数据存在值不存在的情况 原因 处理遥感数据很容易,磁盘爆满了 解决方案 清理一些无用数据,准备买个2T的外接硬盘用着了。 然后重新做处理

[Linux] 4.常用初级指令

pwd:显示当前文件路径 ls:列出当前文件夹下有哪些文件 mkdir空格文件名:创建一个新的文件夹 cd空格文件夹名:进入文件夹 cd..:退到上一层文件夹 ls -a:把所有文件夹列出来 .代表当前文件夹 ..代表上层文件夹 用…

【Vue】Vuex详解,一文读懂并使用Vuex

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…

【15】c++设计模式——>抽象工厂模式

在海贼世界中,位于水之都的弗兰奇一家是由铁人弗兰奇所领导的以拆船为职业的家族,当然了他们的逆向工程做的也很好,会拆船必然会造船。船是海贼们出海所必备的海上交通工具,它由很多的零件组成,从宏观上看它有这么几个…

智慧财务管家,记录分析收支明细,轻松掌握财务情况并随时打印保存!

在日常的财务管理中,准确记录和分析收支明细是掌握财务情况、制定科学预算和实现财务目标的重要一环。然而,繁琐的手动记录和分析过程常常让我们感到头痛。现在,让我们向您推荐一款智慧财务管家,帮助您轻松记录和分析收支明细&…

仿函数的学习

仿函数 也叫 函数对象 仿函数是什么东西? 当你第一眼看到下面的代码的时候,你会觉得它是一个函数的调用: bool result less(a, b);但是我如果告诉你,less 是一个我自定义的一个类的对象呢? class Less { public:bo…

Interference Signal Recognition Based on Multi-Modal Deep Learning

系统结构 基于决策的融合实际上是用损失函数监督融合模型 其中 N N N是训练样本的数量 体会 作者未解释公式4的 t i t_i ti​的含义且不公布代码

elment以及elementPlus选中组件出现黑框问题解决!!

目录 问题: 图示: 解决方案: 问题: 使用elementPlus的按钮组件,点击按钮后会出现黑框,除非点击其他地方才能取消掉(之前使用elment-ui其它组件时也出现过) 图示: 解决方案…

Day-07 修改 Nginx 配置文件

至此: 简单的 Docker 安装 Nginx并启动算是成功了! ps: 如何修改 Nginx的配置、更改nginx 的资源文件? eg: 1、可以将容器中的目录和本机目录做映射。 2、达到修改本机目录文件就影响到容器中的文件。 1.本机创建实例文件夹 新建目录&#x…

【机器学习-黑马程序员】人工智能、机器学习概述

文章目录 前言一、人工智能概述二、什么是机器学习二、机器学习算法分类三、机器学习开发流程 前言 本专栏文章为观看黑马程序员《python机器学习》所做笔记,课程地址在这。如有侵权,立即删除。 一、人工智能概述 机器学习和人工智能、深度学习的关系 机…

即时通讯软件

通信协议 发送消息可以是个struct 客户端分两个线程:读取服务器,给服务器发(否则会导致阻塞) read和write的第二个参数类型是:void *buf——————不仅仅是一个字符串,也可以是一个结构体等等&#xf…

获取沪深300的所有个股列表

脚本: import requests from bs4 import BeautifulSoupurl "https://q.stock.sohu.com/cn/bk_4444.shtml" response requests.get(url) soup BeautifulSoup(response.text, "html.parser")# 找到包含class为e1的元素 elements soup.find_a…

NodeMCU ESP8266硬件开发板的熟悉

文章目录 硬件开发环境的熟悉基础介绍什么是 ESP8266 NodeMCU?NodeMCU芯片ESP12-E 模组开发板 ESP8266 版本引脚图Power GND I2CGPIOADCUARTSPIPWMControl 总结 硬件开发环境的熟悉 基础介绍 什么是 ESP8266 NodeMCU? ESP8266是乐鑫开发的一款低成本 …

阿里云服务器搭建网站(图文新手教程)

使用阿里云服务器快速搭建网站教程,先为云服务器安装宝塔面板,然后在宝塔面板上新建站点,阿里云服务器网以搭建WordPress网站博客为例,来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程: …

TempleteMethod

TempleteMethod 动机 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因 (比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如…