GoLong的学习之路(八)语法之Map

文章目录

  • Map
    • 初始化方式
    • 判断某个键是否存在
    • map的遍历
      • 对value值遍历。
      • 对key值遍历
    • 使用delete()函数删除键值对
    • 按照指定顺序遍历map
    • 元素为map的切片
    • 值为切片类型的map
  • 做个题吧

Map

哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。

在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。

map [ KeyType ] ValueType

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

  • KeyType:表示键的类型。
  • ValueType:表示键对应的值的类型。

map类型的变量默认初始值为nil,需要使用make()函数来分配内存。

make(map[KeyType]ValueType, [cap])

其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。

初始化方式

map中的数据都是成对出现的:

func main() {scoreMap := make(map[string]int, 8)scoreMap["张三"] = 90scoreMap["小明"] = 100fmt.Println(scoreMap)fmt.Println(scoreMap["小明"])fmt.Printf("type of a:%T\n", scoreMap)
}

map也支持在声明的时候填充元素

func main() {userInfo := map[string]string{"username": "沙河小王子","password": "123456",}fmt.Println(userInfo) //
}

判断某个键是否存在

Go语言中有个判断map中键是否存在的特殊写法。
value, ok := map[key]

func main() {scoreMap := make(map[string]int)scoreMap["张三"] = 90scoreMap["小明"] = 100// 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值v, ok := scoreMap["张三"]if ok {fmt.Println(v)} else {fmt.Println("查无此人")}
}

map的遍历

Go语言中使用for range遍历map。

对value值遍历。

func main() {scoreMap := make(map[string]int)scoreMap["张三"] = 90scoreMap["小明"] = 100scoreMap["李四"] = 60for k, v := range scoreMap {fmt.Println(k, v)}
}

对key值遍历

func main() {scoreMap := make(map[string]int)scoreMap["张三"] = 90scoreMap["小明"] = 100scoreMap["李四"] = 60for k := range scoreMap {fmt.Println(k)}
}

遍历map时的元素顺序与添加键值对的顺序无关。

使用delete()函数删除键值对

使用delete()内建函数从map中删除一组键值对。

delete(map, key)

  • map:表示要删除键值对的map
  • key:表示要删除的键值对的键
func main(){scoreMap := make(map[string]int)scoreMap["张三"] = 90scoreMap["小明"] = 100scoreMap["李四"] = 60delete(scoreMap, "小明")//将小明:100从map中删除for k,v := range scoreMap{fmt.Println(k, v)}
}

按照指定顺序遍历map

这里的map,诺是要排序,需要经历三步:

  1. 将map中的值取出来,放进切片(slice)
  2. 然后针对slice使用sort函数排序。
  3. 再然后就是将slice中的值放进map中。此时就排序完成

说实话,这样的操作我开始怀念Java了

func main() {rand.Seed(time.Now().UnixNano()) //初始化随机数种子var scoreMap = make(map[string]int, 200)for i := 0; i < 100; i++ {key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串value := rand.Intn(100)          //生成0~99的随机整数scoreMap[key] = value}//取出map中的所有key存入切片keysvar keys = make([]string, 0, 200)for key := range scoreMap {keys = append(keys, key)}//对切片进行排序sort.Strings(keys)//按照排序后的key遍历mapfor _, key := range keys {fmt.Println(key, scoreMap[key])}
}

元素为map的切片

func main() {var mapSlice = make([]map[string]string, 3)for index, value := range mapSlice {fmt.Println("index:%d value:%v\n", index, value)}// 对切片中的map元素进行初始化mapSlice[0] = make(map[string]string, 10)mapSlice[0]["name"] = "小王子"mapSlice[0]["password"] = "123456"mapSlice[0]["address"] = "沙河"for index, value := range mapSlice {fmt.Printf("index:%d value:%v\n", index, value)}
}

在这里插入图片描述

值为切片类型的map

func main() {var sliceMap = make(map[string][]string, 3)fmt.Println(sliceMap)fmt.Println("after init")key := "中国"value, ok := sliceMap[key]if !ok {value = make([]string, 0, 2)}value = append(value, "北京", "上海")sliceMap[key] = valuefmt.Println(sliceMap)
}

在这里插入图片描述

做个题吧

写一个程序,统计一个字符串中每个单词出现的次数。比如:“how do you do"中how=1 do=2 you=1。

func main() {str := "how do you do"mapstr := make(map[string]int)n := 0for i := 0; i < len(str); i++ {if str[i] == ' ' {mapstr[str[n:i]] += 1i++n = i}}if len(str) > n {mapstr[str[n:len(str)]] += 1}for k, v := range mapstr {fmt.Println(k, v)}
}

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

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

相关文章

【十四】记一次MySQL宕机恢复过程,MySQL INNODB 损坏恢复

记一次MySQL宕机恢复过程 简介&#xff1a;一个业务数据库疏于运维管理&#xff0c;突然在今天崩溃宕机了&#xff0c;真是让人抓狂&#xff0c;上面也不知道积累了多久的数据&#xff0c;平时也没有定期做好备份&#xff0c;这下岂不是瞎了啊&#xff0c;经过不断的收集信息和…

什么是网络API以及用例

什么是API&#xff1f; API&#xff08;application programming interface&#xff0c;应用程序编程接口&#xff09;可使不同的应用程序通过一套机制和协议相互通信。同样&#xff0c;网络 API 可实现网络与应用程序、网络浏览器和数据库之间的通信。 使用表征状态传输&…

LeetCode977——有序数组的平方

LeetCode977——有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求新数组也按 非递减顺序 排序。 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&…

面试算法36:后缀表达式

题目 后缀表达式是一种算术表达式&#xff0c;它的操作符在操作数的后面。输入一个用字符串数组表示的后缀表达式&#xff0c;请输出该后缀表达式的计算结果。假设输入的一定是有效的后缀表达式。例如&#xff0c;后缀表达式["2", "1", "3", &q…

javaScript 使用indexOf 撸一下模糊查询

说明&#xff1a;把代码直接粘到HTML文件用浏览器打开即可体验 body的数据 <input class"keyWord" type"text" placeholder"查询关键字"><button class"searchBtn">查询</button><div><ul class"res…

【Spring Boot】Spring Boot集成RabbitMQ

一、发送和接收消息 Spring Boot提供了`spring-boot-starter-amqp`组件,只需要简单地配置即可与Spring Boot无缝集成。下面通过示例演示集成RabbitMQ实现消息的接收和发送。 步骤01 配置pom包。 创建Spring Boot项目并在pom.xml文件中添加spring-bootstarter-amqp等相关组件…

跟着NatureMetabolism学作图:R语言ggplot2转录组差异表达火山图

论文 Independent phenotypic plasticity axes define distinct obesity sub-types https://www.nature.com/articles/s42255-022-00629-2#Sec15 s42255-022-00629-2.pdf 论文中没有公开代码&#xff0c;但是所有作图数据都公开了&#xff0c;我们可以试着用论文中提供的数据…

用长tree方式做等长线

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: 用set_data_check的方式做等长线 前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。 1)写一个sdc,把等长线的起点设置成clock source,用于创建create_…

项目结束需要经历的5个关键步骤

项目结束是项目管理不可或缺的一部分。这是项目的最后阶段&#xff0c;根据关键绩效指标和范围对交付成果进行测试&#xff0c;收尾&#xff0c;总结经验教训&#xff0c;完成交接&#xff0c;并签署项目。 项目结束与启动会议和一样重要。管理人员应为此留出时间&#xff0c;…

前端CodeReivew实践 | 京东云技术团队

把Code Review变成一种开发文化而不仅仅是一种制度 把Code Review 作为开发流程的必选项后&#xff0c;不代表Code Review这件事就可以执行的很好&#xff0c;因为Code Review 的执行&#xff0c;很大部分程度上依赖于审查者的认真审查&#xff0c;以及被审查者的积极配合&…

求解仿射变换矩阵

仿射变换是图形学中经常用到的方法&#xff0c;通常但是仿射变换的系数是未知的&#xff0c;需要找到变换前后的三对对应点进行求解。 from affine import Affine import numpy as np参考文献 矩阵最小二乘法求解仿射变换矩阵 def solve_affine(init_points, goal_points) -&…

位置式PID

// 单环PID参数 float Position_KP 0.0180, Position_KI 0.0013, Position_KD 0.11425; /* 位置式PID系数 */ /*************************************************************************** brief 位置式PID控制器* param 实际位置reality&#xff0c;目标位置target…

【CCF】Z字形扫描

这题的关键是将整个扫描的过程&#xff0c;拆分成很多次斜着操作数组的过程。 而且这个过程中可以建立如下规律&#xff1a; &#xff08;1&#xff09;一斜线上的元素个数与切换到下一条斜线这一操作之间建立规律。 先讨论左上部分的数组&#xff1a; 1&#xff09;当元素个…

小记java正则表达式中matcher.find() 和 matcher.matches() 的区别

matcher.find() 顾名思义&#xff0c;find为查找&#xff0c;其功能为查找字符串中是否有符合条件的字串&#xff08;包含本身&#xff09;&#xff0c;当查找到时即返回true&#xff0c;更多地与matcher.group(int i) 配合使用&#xff0c;用于从字符串中取出特定字串。 mat…

linux 装机教程(自用备忘)

文章目录 安装 pyenv 管理多版本 python 环境安装使用使用 pyenv 和 virtualenv 管理虚拟 python 环境 sshvscode 连接远程服务器tmux 美化zsh 安装 pyenv 管理多版本 python 环境 安装 &#xff08;教程参考&#xff1a;https://www.modb.pro/db/155036&#xff09; sudo a…

2023 uniapp( vue3 + TS )使用canvas生成海报并保存,taro/微信小程序也适用

有段时间没写vue了&#xff0c;有点生疏了...... 1、代码有注释&#xff0c;完整代码如下 <template><view class"page"><canvas class"canvas" v-if"isShow" :style"{width:${canvasWidth}px,height:${canvasHeight}px}&…

React之引入css的方式

一、是什么 组件式开发选择合适的css解决方案尤为重要 通常会遵循以下规则&#xff1a; 可以编写局部css&#xff0c;不会随意污染其他组件内的原生&#xff1b;可以编写动态的css&#xff0c;可以获取当前组件的一些状态&#xff0c;根据状态的变化生成不同的css样式&#…

SpringCloud-Sentinel

一、介绍 &#xff08;1&#xff09;提供界面配置配置服务限流、服务降级、服务熔断 &#xff08;2&#xff09;SentinelResource的blockHandler只处理后台配置的异常&#xff0c;运行时异常fallBack处理&#xff0c;且资源名为value时才生效&#xff0c;走兜底方法 二、安装…

Anaconda创建新的虚拟环境及Jupyter Notebok中、PyCharm中环境的使用

Anaconda创建新的虚拟环境 在windows开始菜单中【徽标键】&#xff0c;查找Anaconda文件夹并打开【Anaconda Prompt】 查看已有虚拟环境 conda env list1.创建 conda create --name mytest python3.7 # 创建一个名称为mytest&#xff0c;python版本为3.7的虚拟环境输入【…

济南双软认定办理流程,软件企业认定申报材料

具体流程及需要材料&#xff1a; 第一步&#xff1a;软件着作权 材料&#xff1a;源代码前后各30页&#xff0c;软件说明书&#xff0c;企业营业执照公章、软件着作权的申请表。统一提交中国版权中心?? 第二步&#xff1a;软件测评 材料&#xff1a;软件操作手册、说明书…