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

Golang map笔记

map定义

三种方式

package mainimport "fmt"func main() {// map 的基本定义// 第一种方式 使用make分配数据空间var map1 map[string]stringmap1 = make(map[string]string, 3)map1["no1"] = "北京"map1["no2"] = "天津"map1["no3"] = "上海"fmt.Println("map1=", map1)// 第二种方式map2 := make(map[string]string)map2["no1"] = "宋江"map2["no2"] = "卢俊义"map2["no3"] = "吴用"fmt.Println("map2=", map2)// 第三中方式,使用类型推导map3 := map[string]string{"no1": "刘备","no2": "关羽","no3": "张飞",}fmt.Println("map3=", map3)// 套娃方式map4 := map[string]map[string]string{"no1": {"name": "张三", "gender": "男", "address": "北京"},"no2": {"name": "李四", "gender": "女", "address": "天津"},"no3": {"name": "王五", "gender": "男", "address": "上海"},}
}

map删除

删除单个key

delete(map, "key"),delete是内置函数。如果key存在,就删除key-value,如果key不存在,也不会报错。

delete(map1, "no2")

删除全部key

  1. Golang没有提供一次性全部删除的函数,只能遍历全部删除

for i, _ := range map1 {delete(map1, i)
}
  1. make一个新的空间

map1 = make(map[string]string)

判断某个key是否存在

val, exists := map1["no4"] // exists返回布尔值,存在为true,不存在为false
if exists {fmt.Println("exists")
} else {fmt.Println("nonexistence")
}
fmt.Printf("val=%v,exists=%v\n", val, exists)

map遍历

使用 for range遍历即可,多层map,for range多次即可

map 长度

使用len函数

map 切片的使用

package mainimport "fmt"func main() {// map 切片的使用map1 := make([]map[string]string, 2)if map1[0] == nil {map1[0] = make(map[string]string, 2)map1[0]["name"] = "宋江"map1[0]["age"] = "45"}if map1[1] == nil {map1[1] = make(map[string]string, 2)map1[1]["name"] = "卢俊义"map1[1]["age"] = "40"}// 由于切片只分配了2个空间,再追加map的话需使用append函数mapValue := map[string]string{"name": "吴用","age":  "44",}map1 = append(map1, mapValue)fmt.Println(map1)}

运行结果:

[map[age:45 name:宋江] map[age:40 name:卢俊义] map[age:44 name:吴用]]

map 细节

  1. map是引用类型,遵守引用类型传递的机制,在一个函数中接受map,修改后,会直接修改原来的map

package mainimport "fmt"func modifyMap(map1 map[int]int) {map1[10] = 200
}func main() {// map 函数值传递的演示map1 := map[int]int{1:  11,2:  22,10: 100,}fmt.Println(map1)modifyMap(map1) // 调函数后,会修改原下标10的值fmt.Println(map1)
}
  1. map可以自动扩容,并不会报panic,这点和切片不同(切片超过容量必须使用append)

package mainimport "fmt"func main() {// map 自动扩容的演示map1 := make(map[int]int, 2) // 定义2个容量map1[1] = 11map1[2] = 22map1[3] = 33 // 超过2个容量会自动扩容,不会报panicmap1[4] = 44fmt.Println(map1)
}
  1. map的value经常使用结构体struct类型,更灵活,也更适合管理复杂的数据

package mainimport "fmt"type Stu struct {Name  stringAge   intScore float32
}func main() {// map struct类型的演示stuents := make(map[string]Stu)stu1 := Stu{"宋江", 18, 67.00}stu2 := Stu{"卢俊义", 19, 50.50}stu3 := Stu{"吴用", 20, 99.00}stuents["no1"] = stu1stuents["no2"] = stu2stuents["no3"] = stu3for i, v := range stuents {fmt.Printf("学生编号:%v,名字:%v,年龄:%v,分数:%v\n", i, v.Name, v.Age, v.Score)}
}

课堂练习

要求:

  1. 使用map[string]map[string]string类型

  1. key是唯一的,不可以重复

  1. 如果某个用户存在,修改他的密码为:888888;如果不存在新增用户

package mainimport "fmt"func modifyPwd(users map[string]map[string]string, name string) {exists := falsefor i, v := range users {if v["name"] == name {users[i]["pwd"] = "888888"exists = true}}if !exists {users["no3"] = map[string]string{"name": name,"pwd":  "888888",}}
}func main() {users := make(map[string]map[string]string)user1 := map[string]string{"name": "tom","pwd":  "123456",}user2 := map[string]string{"name": "mary","pwd":  "987654",}users["no1"] = user1users["no2"] = user2modifyPwd(users, "lily")fmt.Println(users)
}

运行结果:

map[no1:map[name:tom pwd:123456] no2:map[name:mary pwd:987654] no3:map[name:lily pwd:888888]]

相关文章:

Golang map笔记

map定义三种方式package mainimport "fmt"func main() {// map 的基本定义// 第一种方式 使用make分配数据空间var map1 map[string]stringmap1 make(map[string]string, 3)map1["no1"] "北京"map1["no2"] "天津"map1[&q…...

Android Jetpack组件之WorkManager高级概念介绍与使用(三)

一、介绍 通过前面两篇,我们基本掌握了组件的workmanager的接入,以及api的使用等。但是一个框架如果运用在复杂的项目中,肯定需要有其他额外的支持,介绍来我们将会介绍高级概念,以及对前面的知识点进行回顾与拓展。 高…...

Spring框架中用到的设计模式(都用到了哪些设计模式?)

文章目录简单工厂模式:工厂模式:单例模式:原型模式:迭代器模式:代理模式:适配器模式:观察者模式:模板模式:责任链模式:这是一道相对有难度的题目,…...

Python中的类和对象(4)

1. 构造函数 (_ init _(self[,……])) 在类中定义 _init _() 方法,可以实现在实例化对象的时候进行个性化定制: >>> class C: ... def __init__(self, x, y): ... self.x x ... self.y y ... …...

window11 安装node及配置环境变量

一、安装环境 本教程演示的环境: 系统:win 11 64位 node.js下载地址: http://nodejs.cn/ node.js版本:长期支持版本(本教程基于16.15.0) 点击选中图标下载到电脑本地即可。 二、安装步骤 1、双击安装包,一…...

腾讯云服务器选购新手教程(新版流程超级详细)

腾讯云服务器购买有两个入口,一个是直接在秒杀活动上购买云服务器,价格便宜,2核2G4M轻量服务器,2核4G6M服务器、4核8G10M服务器,活动上购买价格便宜,但是服务器机型固定;另一个是直接在云服务器…...

第四章 Opencv图像色彩空间与通道

文章目录1.色彩空间1-1.RGB/BGR色彩空间1-2.GRAY色彩空间1-3.HSV色彩空间2.通道2-1.拆分通道:split()方法1.拆BGR色彩空间图像的通道2.拆HSV色彩空间图像的通道2-2.合并通道:merge()方法1.B、G、R 通道的合并2.H、S、V 通道的合并3.B、G、R、A 通道的合并…...

《论文列表》持续更新中......

《论文列表》持续更新中......前言相关论文阅读说服对话系统 Persuasive Dialogue System情感知识对话 Emotional Support Conversation对话中的情感识别 Emotion Recognition in Conversation情感对话生成 Emotional Response Generation多模态融合情感识别或情感生成 Multimo…...

空间中任意一点到球的截面的最短距离

假设球的球心坐标为Oball{x0,y0,z0}O_{ball}\{x_0,y_0,z_0\}Oball​{x0​,y0​,z0​},球的半径为rrr,球的方程为(x−x0)2(y−y0)2(z−z0)2r2(x-x_0)^2(y-y_0)^2(z-z_0)^2r^2(x−x0​)2(y−y0​)2(z−z0​)2r2球的一截面的方程为AxByCz10AxByCz10AxByCz10…...

麦克斯韦方程场分量公式推导

今天看书的时候遇到了一个关于公式推导的问题,阅读该篇前推荐优先阅读—点乘与叉乘是否满足结合律。 已知: E ⃗ t = i k n 2 (...

freertos学习之路6-任务创建和删除

写在最前 由于工作需要,需要开始学习freertos的相关知识,本专题主要记录freertos的相关内容 参考: https://www.bilibili.com/video/BV19g411p7UT 正点原子视频 1. 简介 和一般的OS不同(linux/windows),在…...

科都电气创业板IPO终止:曾计划募资约6亿元,郑春开等学历较低

近日,深圳证券交易所披露的信息显示,科都电气股份有限公司(下称“科都电气”)提交了撤回首次公开发行股票并在创业板上市申请文件的申请,同时保荐机构撤回对该公司的保荐。 因此,深圳证券交易所决定终止对…...

【MySQL】第十六部分 MySQL数据类型详解

【MySQL】第十六部分 MySQL数据类型详解 文章目录【MySQL】第十六部分 MySQL数据类型详解16. MySQL数据类型详解16.1 整数类型16.2 浮点类型16.3 定点数类型16.4 位类型 BIT16.5 日期和时间类型16.6 文本字符串类型16.6.1 CHAR VS VARCHAR类型16.6.2 TEXT类型16.6.3 ENUM类型16…...

Linux手工创建新用户

准备工作(配置流程的理解) Linux中useradd命令即一系列文件操作的结合体,所以我们可以通过查看useradd命令来确认我们手工创建新用户需要完成的文件配置 找到man useradd中涉及的文件部分 对于手工创建用户有用的文件: /etc/pas…...

K_A12_003 基于STM32等单片机采集光敏二极管模块参数 串口与OLED0.96双显示

K_A12_003 基于STM32等单片机采集光敏二极管模块参数 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RC光敏二极管模块1.2、STM32F103C8T6光敏二极管模块五、基础知识…...

天才少年稚晖君

稚晖君 简介主要成就华为天才少年简介 彭志辉,1993年出生于江西吉安,科技圈知名KOL,人称“稚晖君”“野生钢铁侠”,原华为天才少年。 2015年本科毕业于电子科技大学生命科学与技术学院;2018年研究生毕业于电子科技大学信息与通信工程学院;毕业后就职于OPPO研究院AI实验…...

【Linux command 09】tcpdump 命令

tcp一款sniffer工具,是Linux上的抓包工具,嗅探器语法tcpdump (选项)选项-c: 指定要抓取的包数量。注意,是最终要获取这么多个包。例如,指定"-c 10"将获取10个包,但可能已经处理了100个包&#xf…...

初始结构体

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🏡前言 🐰结构体的基础知识 🐰结构体的声明 &#x…...

English Learning - Day56 作业打卡 2023.2.10 周五

English Learning - Day56 作业打卡 2023.2.10 周五引言1. 他把车停错了地方,因此被罚了款。2. 这个事我越想越生气。3.他在这工作的时间比我长。4. 没有奋斗,就不会变强大。5.我一到北京就给你打电话。6. 直到我有了孩子,才意识到我的父母有…...

Python中五个不常见的隐晦用法小结

1. 引言 我已经用Python编程5年了(从2017年开始),直到最近才知道以下几个Python中不常见的用法,确实和人们对直观理解有所出入。 闲话少说,我们直接开始吧! 2. 类中的私有变量不是真正的私有 我们直接上…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

go 里面的指针

指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...

Selenium 查找页面元素的方式

Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素,以下是主要的定位方式: 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...