Go基础语法:map
9 map
Go 语言中提供的映射关系容器为 map ,其内部使用 散列表(hash) 实现。它是一种无序的基于 key-value 的数据结构。
Go 语言中的 map 是引用类型,必须初始化之后才能使用。
9.1 map 定义
Go 语言中 map 的定义语法为:map[keyType]valueType,其中:
- keyType 表示键的类型
- valueType 表示值的类型
map 类型变量默认初始值为 nil (引用类型的默认初始值都为 nil), 需要使用 make() 函数来分配内存,语法格式为:
make(map[keyType]valueType , cap )
上述格式中,cap 表示 map 的容量,不是必须的,map 可以动态扩容。但我们通常会在初始化的时候就指定一个合适的容量,因为这样会比动态扩容的执行效率高。
package mainimport "fmt"func main() {// 声明一个键为 string 类型,值为 int 类型的 mapvar b map[string]int// truefmt.Println(nil == b)// 通过 make 初始化 map, 并指定其长度为 10。 map 可以自动扩容,但不如声明时指定容量的执行效率高。b = make(map[string]int, 10)b["aa"] = 100b["bb"] = 100//map[aa:100 bb:100]fmt.Println(b)
}
9.2 map 的基本使用
9.2.1 增值和取值
package mainimport "fmt"func main() {var b map[string]int// truefmt.Println(nil == b)b = make(map[string]int, 10)b["aa"] = 100b["bb"] = 100// 获取键对应的值时,使用 map名称[键名] 的格式fmt.Println(b["aa"])// 不确定是否存在某个键时,使用这种方式获取其值。ok 表示是否有该键,v 表示如果有该键时的值v, ok := b["cc"]if !ok {fmt.Println("b 中不存在键 cc")} else {fmt.Println("cc对应的值为:", v)}
}
9.2.1 删除某个键值对
删除时使用内置函数 delete, 该函数的定义如下:
func delete(m map[Type]Type1, key Type)
如果被删除的键存在,直接删除,不存在,则不执行任何操作。
package mainimport ("fmt"
)func main() {scoreMap := make(map[string]int, 10)scoreMap["张三"] = 93scoreMap["李四"] = 94scoreMap["王五"] = 95delete(scoreMap, "张三")
}
9.3 map 的遍历
9.3.1 for-range 遍历
package mainimport "fmt"func main() {scoreMap := make(map[string]int, 10)scoreMap["张三"] = 93scoreMap["李四"] = 94scoreMap["王五"] = 95for k, v := range scoreMap {fmt.Println(k, v)}
}
9.3.2 只遍历 key
package mainimport ("fmt"
)func main() {scoreMap := make(map[string]int, 10)scoreMap["张三"] = 93scoreMap["李四"] = 94scoreMap["王五"] = 95for k := range scoreMap {fmt.Println(k, scoreMap[k])}
}
9.3.3 只遍历 value
package mainimport ("fmt"
)func main() {scoreMap := make(map[string]int, 10)scoreMap["张三"] = 93scoreMap["李四"] = 94scoreMap["王五"] = 95for _, v := range scoreMap {fmt.Println(v)}
}
9.3.4 按照指定顺序遍历
Go 语言中没有 map 专用的排序,需要借助切片的排序实现。
package mainimport ("fmt""math/rand""sort""time"
)func main() {//初始化随机种子rand.Seed(time.Now().UnixNano())scoreMap := make(map[string]int, 150)for i := 0; i < 100; i++ {// 生成 stu 开头的字符串.此处的 %2d 表示使用两位数表示,不足两位则左边补0key := fmt.Sprintf("stu%02d", i)// 生成 0-99 的随机整数value := rand.Intn(100)scoreMap[key] = value}// 取出 map 中的所有 key 存入切片keys := make([]string, 0, 200)for k := range scoreMap {keys = append(keys, k)}// 对切片进行排序sort.Strings(keys)// 对排序后的切片进行遍历,并取 map 中的值for _, k := range keys {fmt.Println(k, scoreMap[k])}
}
9.4 其他相关
9.4.1 元素为 map 的切片
package mainimport ("fmt"
)func main() {// 构建一个切片,容量为 3,元素为 map[string]stringvar mapSlice = make([]map[string]string, 3)for index, v := range mapSlice {fmt.Printf("index:%d, value:%v \n", index, v)}fmt.Println()// 对切片中的元素进行初始化, 不初始化会报错——map、slice、channel 使用前必须初始化mapSlice[0] = make(map[string]string, 10)mapSlice[0]["name"] = "张三"mapSlice[0]["password"] = "123456"mapSlice[0]["address"] = "济南"for index, v := range mapSlice {fmt.Printf("index:%d, value:%v\n", index, v)}
}
运行结果如下:
index:0, value:map[]
index:1, value:map[]
index:2, value:map[] index:0, value:map[address:济南 name:张三 password:123456]
index:1, value:map[]
index:2, value:map[]
9.4.2 值为切片类型的 map
package mainimport "fmt"func main() {// 构建一个 map, 容量为 3,元素类型为 []string 切片var sliceMap = make(map[string][]string, 3)// map[]fmt.Println(sliceMap)k := "中国"value, ok := sliceMap[k]if !ok {value = make([]string, 0, 2)}value = append(value, "北京", "上海")sliceMap[k] = value// map[中国:[北京 上海]]fmt.Println(sliceMap)
}
package mainimport "fmt"func main() {// 构建一个 map, 容量为 3,元素类型为 []string 切片var sliceMap = make(map[string][]int, 3)sliceMap["北京"] = []int{1, 2, 3, 4, 5}// map[北京:[1 2 3 4 5]]fmt.Println(sliceMap)
}
9.5 作业
9.5.1 判断字符串中汉字的数量
思路:
- 依次获取每个字符
- 判断字符是不是汉字
- 把汉字出现的次数累加
package mainimport ("fmt""unicode"
)func main() {s1 := "我是 CnPeng,我在济南"var count intfor _, c := range s1 {// 判断是不是汉字if unicode.Is(unicode.Han, c) {count++}}fmt.Println(count)
}
9.5.2 统计单词出现的次数:
package mainimport ("fmt""strings"
)func main() {s1 := "how do you do "strSlice := strings.Split(s1, " ")strMap := make(map[string]int, 10)for _, w := range strSlice {if _, ok := strMap[w]; !ok {strMap[w] = 1} else {strMap[w]++}}for k, v := range strMap {fmt.Println(k, v)}
}
9.5.2 回文判断
一个字符串从左向右读和从右向左读含义一致,就称为回文。如:
“上海自来水来自海上”、“山西运煤车煤运西山”、“黄山落叶松叶落山黄”
package mainimport "fmt"func main() {s1 := "山西运煤车煤运西山"// 规律:s1[0]==s[len(ss)-1]// s1[1]==s[len(ss)-1-1]// s1[2]==s[len(ss)-1-2]// s1[3]==s[len(ss)-1-3]// 。。。s1[i]==s[len(ss)-1-i]// 将字符串转换成 rune 切片r := make([]rune, 0, len(s1))for _, c := range s1 {r = append(r, c)}// 只比较前面一半和后面一个就可以for i := 0; i < len(r)/2; i++ {if r[i] != r[len(r)-1-i] {fmt.Println("不是回文")return}}
}
相关文章:
Go基础语法:map
9 map Go 语言中提供的映射关系容器为 map ,其内部使用 散列表(hash) 实现。它是一种无序的基于 key-value 的数据结构。 Go 语言中的 map 是引用类型,必须初始化之后才能使用。 9.1 map 定义 Go 语言中 map 的定义语法为&…...
开发板TFTP调试
问题描述 开发板和host(此处指虚拟机linux)可以平通,但是通过uboot tftp下载请求时一直显示T T T, 即超时 使用wireshark抓包也显示超时 措施 关闭windows和linux的防火墙 重新进行下载成功...
MySQL---优化日志
目录 一、MySQL优化 3、mysql server上的优化 3.1、MySQL查询缓存 3.2、索引和数据缓存 3.2、线程缓存 二、MySQL日志 2.1、redo log 重做日志 2.2、undo log 回滚日志 2.3、错误日志 2.4、查询日志 2.5、二进制日志 2.5.1、基于binlog数据恢复实践操作 六、慢查…...
【送面试题】深入解析Cookie和Session的请求区别及使用场景
AI绘画关于SD,MJ,GPT,SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI…...
010_第一代软件开发(二)
第一代软件开发(二) 文章目录 第一代软件开发(二)项目介绍界面布局功能完善快照功能获取可用串口播放按键提示音 关键字: Qt、 Qml、 QSerialPort、 QPixmap、 QSoundEffect 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QMLÿ…...
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(四)
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 上一节说到待办系统的监听器TaskCreateListener,需要在flowable全局监听配置里加入配置 1、Glo…...
RestTemplate:简化HTTP请求的强大工具
文章目录 什么是RestTemplateRestTemplate的作用代码示例 RestTemplate与HttpClient 什么是RestTemplate RestTemplate是一个在Java应用程序中发送RESTful HTTP请求的强大工具。本文将介绍RestTemplate的定义、作用以及与HttpClient的对比,以帮助读者更好地理解和使…...
【数据结构】什么是数据结构?
数据结构(Data Structure)是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 这么讲可能有些抽象,放一张图大家可能好理解一点: 上图依次是数据结构中逻辑结构中的:集合结构,线性结构,树形结构,图形结构. 而: 数据结构是一门研究非数值计算的程…...
c++源码编译过程(翻译阶段)的若干细节概要
c程序的编译主要包含两个阶段:源码编译(翻译阶段)和目标文件链接。 源码编译过程主要有如下这些阶段: 阶段1: 翻译源码文本字符 阶段2: 逻辑源码行标准化处理 阶段3: 文法处理,分解为不同的源码文本类型序列。例如分解为注释、预处理指…...
Go内置函数make和new的区别?
首先纠正一下make 和 new 是内置函数,不是关键字。 变量初始化,一般分为2步,变量声明变量内存分配,var 关键字就是用来声明变量的,new和make 函数主要是用来分配内存的。 var 声明值类型的变量时,系统会默…...
动手学深度学习(pytorch版)第二章-2.3线性代数Note-linear-algebra
类型 标量:仅包含一个数值被称为标量 向量:向量可以被视为标量值组成的列表 矩阵:正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。 A torch.arange(20).reshape(5, 4) A.T //转置 张量:是描述具有…...
Docker CMD指令如何覆写
在Dockerfile里,CMD指令是可以被覆盖的。 在构建镜像时,可以通过docker build命令的–cmd选项覆盖Dockerfile的CMD: 例如: FROM ubuntu CMD ["echo","hello"]构建时覆盖CMD: docker build -t test --cmd "echo world" .在创建容器时,可以通过…...
动手吧,vue单独使用的复选框
单独使用的复选框可以用在两个状态之间的切换,如是否阅读协议、记住账号等场景。 效果: 1、template部分 <template><label class"v-checkbox-single"><span class"v-checkbox_input" :class"{ disabled }&qu…...
升级iOS17后可以降级吗?iOS17退回iOS16方法教程分享
iOS 17已上线几天,从网上用户的反馈和媒体机构的报告来看,iOS17系统对旧机型来说并不友好,除了电池续航下降以外,占用大量储存空间,BUG也不少。 苹果于 9 月 7 日发布了 iOS 16.6.1 版本,如果升级iOS17后发…...
基于STM32和LORA组网的养老院智能控制系统设计(第十八届研电赛)
一、整体功能 数据采集从机1采集烟雾浓度,PM2.5浓度,甲醛浓度;从机2采集温湿度,光照强度,噪声强度,老人体感温度;从机3收集厨房饮用水的TDS值。3个数据采集从机将采集到的数据显示在本地OLED屏…...
关于Qt适配不同分辨率和缩放率时可能遇到的问题和解决方案
如果没有特殊的处理,Qt的UI窗口在不同的分辨率和缩放率下,其显示效果可能会出现问题,常见的有: 子控件堆叠,无法显示完整 窗口尺寸变大,超出屏幕的显示范围 控件变形,长宽比不合理 界面模糊 …...
第1篇 目标检测概述 —(1)目标检测基础知识
前言:Hello大家好,我是小哥谈。目标检测是计算机视觉领域中的一项任务,旨在自动识别和定位图像或视频中的特定目标,目标可以是人、车辆、动物、物体等。目标检测的目标是从输入图像中确定目标的位置,并使用边界框将其标…...
Discuz论坛网站标题栏Powered by Discuz!版权信息如何去除或是修改?
当我们搭建好DZ论坛网站后,为了美化网站,想把标题栏的Powered by Discuz!去除或是修改,应该如何操作呢?今天飞飞和你分享,在操作前务必把网站源码和数据库都备份到本地或是网盘。 Discuz的版权信息存在两处…...
springboot整合aop,实现日志操作
前言: 整合之前,我们要明白aop是什么,为什么要用aop,aop能帮我们做什么。 答:AOP是面向切面编程(Aspect-Oriented Programming)的简称,它是一种编程思想,旨在在面向对象…...
openjdk和oracle jdk的区别
OpenJDK 和 Oracle JDK 都是 Java Development Kit (JDK) 的不同实现,用于开发和运行 Java 应用程序。它们有一些区别,但也有很多相似之处。以下是它们之间的主要区别: 开源性质: OpenJDK 是开源的,由一个社区维护和开…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
