当前位置: 首页 > news >正文

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 &#xff0c;其内部使用 散列表&#xff08;hash&#xff09; 实现。它是一种无序的基于 key-value 的数据结构。 Go 语言中的 map 是引用类型&#xff0c;必须初始化之后才能使用。 9.1 map 定义 Go 语言中 map 的定义语法为&…...

开发板TFTP调试

问题描述 开发板和host(此处指虚拟机linux)可以平通&#xff0c;但是通过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_第一代软件开发(二)

第一代软件开发(二) 文章目录 第一代软件开发(二)项目介绍界面布局功能完善快照功能获取可用串口播放按键提示音 关键字&#xff1a; Qt、 Qml、 QSerialPort、 QPixmap、 QSoundEffect 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff…...

基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(四)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 上一节说到待办系统的监听器TaskCreateListener&#xff0c;需要在flowable全局监听配置里加入配置 1、Glo…...

RestTemplate:简化HTTP请求的强大工具

文章目录 什么是RestTemplateRestTemplate的作用代码示例 RestTemplate与HttpClient 什么是RestTemplate RestTemplate是一个在Java应用程序中发送RESTful HTTP请求的强大工具。本文将介绍RestTemplate的定义、作用以及与HttpClient的对比&#xff0c;以帮助读者更好地理解和使…...

【数据结构】什么是数据结构?

数据结构(Data Structure)是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 这么讲可能有些抽象,放一张图大家可能好理解一点: 上图依次是数据结构中逻辑结构中的:集合结构,线性结构,树形结构,图形结构. 而: 数据结构是一门研究非数值计算的程…...

c++源码编译过程(翻译阶段)的若干细节概要

c程序的编译主要包含两个阶段&#xff1a;源码编译(翻译阶段)和目标文件链接。 源码编译过程主要有如下这些阶段&#xff1a; 阶段1: 翻译源码文本字符 阶段2: 逻辑源码行标准化处理 阶段3: 文法处理&#xff0c;分解为不同的源码文本类型序列。例如分解为注释、预处理指…...

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数&#xff0c;不是关键字。 变量初始化&#xff0c;一般分为2步&#xff0c;变量声明变量内存分配&#xff0c;var 关键字就是用来声明变量的&#xff0c;new和make 函数主要是用来分配内存的。 var 声明值类型的变量时&#xff0c;系统会默…...

动手学深度学习(pytorch版)第二章-2.3线性代数Note-linear-algebra

类型 标量&#xff1a;仅包含一个数值被称为标量 向量&#xff1a;向量可以被视为标量值组成的列表 矩阵&#xff1a;正如向量将标量从零阶推广到一阶&#xff0c;矩阵将向量从一阶推广到二阶。 A torch.arange(20).reshape(5, 4) A.T //转置 张量&#xff1a;是描述具有…...

Docker CMD指令如何覆写

在Dockerfile里,CMD指令是可以被覆盖的。 在构建镜像时,可以通过docker build命令的–cmd选项覆盖Dockerfile的CMD: 例如: FROM ubuntu CMD ["echo","hello"]构建时覆盖CMD: docker build -t test --cmd "echo world" .在创建容器时,可以通过…...

动手吧,vue单独使用的复选框

单独使用的复选框可以用在两个状态之间的切换&#xff0c;如是否阅读协议、记住账号等场景。 效果&#xff1a; 1、template部分 <template><label class"v-checkbox-single"><span class"v-checkbox_input" :class"{ disabled }&qu…...

升级iOS17后可以降级吗?iOS17退回iOS16方法教程分享

iOS 17已上线几天&#xff0c;从网上用户的反馈和媒体机构的报告来看&#xff0c;iOS17系统对旧机型来说并不友好&#xff0c;除了电池续航下降以外&#xff0c;占用大量储存空间&#xff0c;BUG也不少。 苹果于 9 月 7 日发布了 iOS 16.6.1 版本&#xff0c;如果升级iOS17后发…...

基于STM32和LORA组网的养老院智能控制系统设计(第十八届研电赛)

一、整体功能 数据采集从机1采集烟雾浓度&#xff0c;PM2.5浓度&#xff0c;甲醛浓度&#xff1b;从机2采集温湿度&#xff0c;光照强度&#xff0c;噪声强度&#xff0c;老人体感温度&#xff1b;从机3收集厨房饮用水的TDS值。3个数据采集从机将采集到的数据显示在本地OLED屏…...

关于Qt适配不同分辨率和缩放率时可能遇到的问题和解决方案

如果没有特殊的处理&#xff0c;Qt的UI窗口在不同的分辨率和缩放率下&#xff0c;其显示效果可能会出现问题&#xff0c;常见的有&#xff1a; 子控件堆叠&#xff0c;无法显示完整 窗口尺寸变大&#xff0c;超出屏幕的显示范围 控件变形&#xff0c;长宽比不合理 界面模糊 …...

第1篇 目标检测概述 —(1)目标检测基础知识

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测是计算机视觉领域中的一项任务&#xff0c;旨在自动识别和定位图像或视频中的特定目标&#xff0c;目标可以是人、车辆、动物、物体等。目标检测的目标是从输入图像中确定目标的位置&#xff0c;并使用边界框将其标…...

Discuz论坛网站标题栏Powered by Discuz!版权信息如何去除或是修改?

当我们搭建好DZ论坛网站后&#xff0c;为了美化网站&#xff0c;想把标题栏的Powered by Discuz&#xff01;去除或是修改&#xff0c;应该如何操作呢&#xff1f;今天飞飞和你分享&#xff0c;在操作前务必把网站源码和数据库都备份到本地或是网盘。 Discuz的版权信息存在两处…...

springboot整合aop,实现日志操作

前言&#xff1a; 整合之前&#xff0c;我们要明白aop是什么&#xff0c;为什么要用aop&#xff0c;aop能帮我们做什么。 答&#xff1a;AOP是面向切面编程&#xff08;Aspect-Oriented Programming&#xff09;的简称&#xff0c;它是一种编程思想&#xff0c;旨在在面向对象…...

openjdk和oracle jdk的区别

OpenJDK 和 Oracle JDK 都是 Java Development Kit (JDK) 的不同实现&#xff0c;用于开发和运行 Java 应用程序。它们有一些区别&#xff0c;但也有很多相似之处。以下是它们之间的主要区别&#xff1a; 开源性质&#xff1a; OpenJDK 是开源的&#xff0c;由一个社区维护和开…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...