10.Go 映射

映射(map)是一种特殊的数据结构,用于存储一系列无序的键值对,映射基于键来存储数据。映射功能强大的地方是,能够基于键快速检索数据。键就像索引一样,指向与该键关联的值。与C++、Java中的映射的不同之处在于,Go语言使用映射不需要引入任何库,而C++、Java需要先引用相应的库,因此,Go语言的映射使用起来更加方便。

1、映射的创建

语法格式:var mapname map[keytype]valuetype

  • mapname为map的变量名。
  • keytype为键类型。
  • valuetype为键对应的值类型

注意:[keytype]和valuetype之间允许有空格。

在声明映射时不需要知道map的长度,因为map是可以动态增长的,未初始化的map的值是nil,使用函数len()可以获取map中键值对的数目。

在Go语言中,最常用的创建并初始化映射的方法有两种:

  • 使用内置的make()函数创建映射。
  • 使用字面量创建映射。
// make() 创建一个映射,键的类型是string,值的类型是int
dict := make(map[string]int)

// 字面量创建一个映射,键和值的类型都是string,使用两个键值对初始化映射
dict := map[string]string{ "red": "#da1337","orange": "#e95a22"}
  • 使用映射字面量是更常用的方法,映射的初始长度会根据初始化时指定的键值对的数量来确定。
  • 映射的键可以是任何值,这个值的类型并不限制,内置的类型或者结构类型都可以,不过需要确定这个值可以使用“==”运算符做比较。
  • 需要注意的是,切片、函数及包含切片的结构类型由于具有引用语义,均不能作为映射的键,使用这些类型会造成编译错误,

  • 可以使用切片作为映射的值
// 创建一个映射,使用字符串切片作为值
dict := map[int][]string {}
2、映射的遍历

map的遍历过程可以通过使用for range循环来完成:

func main() {
	scene := make(map[string]int)
	scene["route"] = 66
	scene["brazil"] = 4
	scene["china"] = 1
	for k, v := range scene {
		fmt.Println(k, v)
	}
    // 只遍历值
	for _, v := range scene {
		fmt.Println(v)
	}	
	// 只遍历键
	for k := range scene {
		fmt.Println(k)
	}
}
  • 只遍历值,将不需要的键修改为匿名变量的形式即可。
  • 只遍历键,无须将值修改为匿名变量的形式。

需要特定顺序的遍历结果,正确的做法是先排序:

func main() {
	scene := make(map[string]int)
	scene["route"] = 66
	scene["brazil"] = 4
	scene["china"] = 1
	var sceneList []string
	for k := range scene {
		sceneList = append(sceneList, k)
	}
	// 对切片进行排序
	sort.Strings(sceneList)
	// 输出
	fmt.Print(sceneList) // [brazil china route]
}
3、映射的删除

Go语言中并没有为map提供任何清空所有元素的函数、方法,清空map的唯一办法就是重新使用make()函数构建一个新的map,不用担心垃圾回收的效率,这是因为Go语言中的并行垃圾回收效率比写一个清空函数要高效得多。

使用delete()内置函数从map中删除一组键值对,delete()函数的语法格式如下:delete(map, 键)

func main() {
	scene := make(map[string]int)
	scene["route"] = 66
	scene["brazil"] = 4
	scene["china"] = 1

	delete(scene, "brazil")
	for k, v := range scene {
		fmt.Println(k, v)
	}
}
4、映射的特性

(1)map的单个键值访问格式为mapName[key],更新某个key的值时mapName[key]放到等号左边,访问某个key的值时mapName[key]放在等号右边。

(2)可以使用range遍历一个map类型变量,但是不保证每次迭代元素的顺序。

(3)删除map中的某个键值,语法如下:delete(mapName,key) delete是内置函数,用来删除map中的某个键值对。

(4)可以使用内置的len()函数返回map中的键值对数量。

(5)Go内置的map不是并发安全的,并发安全的map可以使用标准包sync中的map。

(6)不能直接修改map value内某个元素的值,如果想修改map的某个键值,则必须整体赋值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ECMAScript 的未来:预测 JavaScript 创新的下一个浪潮

以下是简单概括关于JavaScript知识点以及一些目前比较流行的比如:es6 想要系统学习: 大家有关于JavaScript知识点不知道可以去 🎉博客主页:阿猫的故乡 🎉系列专栏:JavaScript专题栏 🎉ajax专栏&…

Cross-Drone Transformer Network for Robust Single Object Tracking论文阅读笔记

Cross-Drone Transformer Network for Robust Single Object Tracking论文阅读笔记 Abstract 无人机在各种应用中得到了广泛使用,例如航拍和军事安全,这得益于它们与固定摄像机相比的高机动性和广阔视野。多无人机追踪系统可以通过从不同视角收集互补的…

一站式指南:第 377 场力扣周赛的终极题解

比赛详情 比赛地址 题目一很简单题目二主要是题目长了点,其实解法很常规(比赛后才意识到)题目三套用Dijkstra算法题目四没时间解答水平还有待提升(其实就是需要灵活组合运用已知的算法,有点类似大模型的Agent) 题解和思路 第一题:最小数字…

AI时代下,如何看待“算法利维坦”?程序员客栈程序员客栈​

ChatGPT的浪潮从2022年袭来后,至今热度不减,呈现出蓬勃发展的趋势。AI家居、医疗、教育、金融、公益、农业、艺术......AI真的已经走进了生活的方方面面,我们仿佛已经进入了AI时代,势不可挡。人工智能水平如此之高,不禁…

云HIS源码 云HIS解决方案 支持医保功能

云HIS系统重建统一的信息架构体系,重构管理服务流程,重造病人服务环境,向不同类型的医疗机构提供SaaS化HIS服务解决方案。 云HIS作为基于云计算的B/S构架的HIS系统,为基层医疗机构(包括诊所、社区卫生服务中心、乡镇卫…

RPA数据统计与展示

随着企业RPA机器人部署规模越来越庞大,更需要完善精细的管理与规划。这些进行自动化工作的数字员工,就像是传统的真实员工一样,也需要对日常的工作做好管理,对未来的发展做好规划,要实现这点,首先需要对RPA…

图像质量评估方法——结构相似性指数(SSIM)

结构相似性指数(SSIM)是一种全参考图像质量评估方法,用于比较两幅图像的相似性。 SSIM的计算涉及到亮度(Luminance)、对比度(Contrast)和结构(Structure)三个方面的相似性…

NET中使用Identity+CodeFirst+Jwt实现登录、鉴权

目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令 2.如何修改表名 3.如何自定义字段 三、使用Identity实现登录、修改密码 …

【网络奇遇记】揭秘计算机网络的性能指标:速率|带宽|吞吐量|时延

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 速率1.1 数据量1.2 速率 二. 带宽三. 吞吐量四. 时延4.1 发送时延4.2 传播时延…

编解码异常分析

前言 最近在做的项目,有H264解码的需求。部分H264文件解码播放后,显示为绿屏或者花屏。 分析 如何确认是否是高通硬解码的问题 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…

基于JAVA的校园电商物流云平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快递公司模块2.4 物流订单模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 商品表3.2.2 快递公司表3.2.3 物流订单表 四、系统展示五、核心代码5.1 查询商品5.2 查询快递公司5.3 查…

模型稳定性评估 简介

OOT OOT(Out of Time)是在建模过程中用于描述模型在时间维度上的性能变化的术语。当模型在训练时使用的数据集与实际应用场景中的数据分布发生差异,特别是在时间上存在间隔时,就可能出现OOT问题。 OOT通常指的是模型在训练时使用…

nestjs swagger文档调用需要鉴权的接口

目标 nestjs经常需要设置一些鉴权(登录后)才能访问的接口,但是生成的swagger文档可以发起接口请求,文档发起的请求默认是不携带登录token的,所以需要移除swagger文档发起请求的守卫拦截。 nestjs守卫拦截设置见另一篇…

C++力扣题目20--有效的括号

给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

【FPGA】Verilog 实践:优先级编码器 | Priority encoder

0x00 优先级编码器(Priority encoder) "能将多个二进制输入压缩成更少数目输出的电路或算法的编码器" 优先级编码器是一种编码器,它考虑了两个或更多输入位同时变为 1 但没有收到输入的情况。当输入进来时,优先级编码…

直线中点算法

中点算法是基于隐函数方程设计的,使用像素网格中点来判断如何选取距离理想直线最近的像素点,直线的中点算法不仅与 Bresenham 算法产生同样的像素点集,二期还可以推广到圆和椭圆。 原理 直线的隐函数表示 F ( x , y ) y − k x − b 0 F(…

ClickHouse 入门与实战教程

目录 1. ClickHouse 简介 什么是 ClickHouse? ClickHouse 的优势和特点 适用场景 2. 安装 ClickHouse 3. ClickHouse 的基本概念 4. ClickHouse 的基本操作 创建数据库和表、插入和查询数据 使用 MergeTree 引擎处理时序数据 管理分区 创建带有分区的 Mer…

电路设计(6)——彩灯控制器的multism仿真

1.功能设计 使用两个运算放大器、两个计数器芯片,实现了彩灯的循环移位控制。 整体原理图如下所示: 运行效果截图如下: 小灯分为两组,一组十个,在脉冲的驱动下,轮流发光! 2.设计思路 两个运放…

视觉学习(4) —— 添加地址传递数据

Modbus Slave 选择一个地址右键,选择发送的数据类型 视觉软件 一、添加地址 当地址为100时,先将首地址改为100,第0个地址为100,第1个地址为101,往后累加 若想使用100—150的地址,即首地址为100&#xff…

基于Java SSM框架实现电子药品商城系统项目【项目源码+论文说明】

基于java的SSM框架实现电子药品商城系统演示 摘要 随着社会的发展,计算机的优势和普及使得电子商城系统的开发成为必需。电子商城系统主要是借助计算机,通过对信息进行管理。减少管理员的工作,同时也方便广大用户对个人所需信息的及时查询以…