Go语言学习笔记(六)---map

2023-10-26

4.7 map

map是key-value数据结构,又称为字段或者给关联数组,类似其他编程语言的集合。(映射)

基本语法:var map变量名 map[keytype]valuetype

keytype可以是bool,int,string,指针,channel,还可以是只包含前面几个类型的接口,结构体,数组。通常key为int,string。注意:slice,map还有function不可以,因为没办法用==来判断。

valuetype的类型和key基本一样。

1)map在使用前一定要通过make创造空间make(map[key]value,size)

2)map的key是不能重复,如果重复以最后一个key-value为准,其中的value可以是重复的

3)key-value是无序的,不按照输入顺序,也不按照key值大小排列。

map的使用方式:

1)先声明再make。2)直接map+make。3)直接map+make+赋值keyvalue

//map的声明,声明不分配空间,key不能够重复,value可以重复
	var map_1 map[string]string
	//在使用map前,需要先make,make的作用就是给map分配数据空间
	map_1 = make(map[string]string, 10)
	//golang中的map是无序的,不按照key值排序
	map_1["num1"] = "jack"
	map_1["num2"] = "mary"
	map_1["num3"] = "tom"
	fmt.Println(map_1)
	//方式二,size可以省略
	map_2 := make(map[int]string)
	map_2[1] = "tom1"
	fmt.Println(map_2)
	//方式三
	map_3 := map[int]string{1: "tom", 2: "jack"}
	fmt.Println(map_3)
	//map的使用:存放学生信息每个学生学号name和sex信息
	stu_map := make(map[int]map[string]string)
	//stu1
	stu_map[1] = make(map[string]string) //因为内部还有个map,因此还需要一个make
	stu_map[1]["name"] = "tom"
	stu_map[1]["sex"] = "男"
	stu_map[1]["add"] = "北京"
	//stu2
	stu_map[2] = make(map[string]string)
	stu_map[2]["name"] = "jack"
	stu_map[2]["sex"] = "男"
	stu_map[2]["add"] = "南京"
	fmt.Println(stu_map)

map的增删改查及遍历:

//增加就是直接赋值,更新也是直接赋值
	map_4 := make(map[int]string)
	map_4[1] = "北京"
	map_4[2] = "南京"
	map_4[3] = "天津"
	map_4[4] = "上海"
	//删除使用内置函数delete(map名+key)
	//如果要删除map中所有的key
	//1.遍历逐一删除
	//2.可以重新通过make创建一个新空间,将原来直接回收 map_4:=make(...)
	delete(map_4, 2)
	//查找val表示查询到的值,key表示是否存在,不存在则只输出false
	val_1, ok_1 := map_4[1]
	val_2, ok_2 := map_4[5]
	fmt.Println(val_1, ok_1, val_2, ok_2) //北京 true  false
	//map的遍历使用for-range的结构遍历,基本不用for循环
	for k, v := range map_4 {
		fmt.Println(k, v)
	}
	//遍历多重map
	for stu_id, stu := range stu_map {
		fmt.Println(stu_id)
		for stu_inf, stu_res := range stu {
			fmt.Println(stu_inf, stu_res)
		}
	}
	/*1
	name tom
	sex 男
	add 北京
	2
	name jack
	sex 男
	add 南京
	*/
	//返回长度
	fmt.Println(len(stu_map)) //输出为2

map切片:

切片的数据类型如果是map,则称为slice of map,map切片,这样map个数就可以动态变化了。实例:动态添加学生信息

func map_slice() {
	//注意以下的两个make不相同
	var stu []map[string]string
	stu = make([]map[string]string, 2) //准备放入两个,创建切片
	if stu[0] == nil {
		stu[0] = make(map[string]string, 2) //创建映射
		stu[0]["name"] = "tom"
		stu[0]["age"] = "20"
	}
	if stu[1] == nil {
		stu[1] = make(map[string]string, 2)
		stu[1]["name"] = "jack"
		stu[1]["age"] = "22"
	}
	newstu := map[string]string{"name": "小米", "age": "20"}
	stu = append(stu, newstu)
	fmt.Println(stu)
}

map排序:

func map_sort() {
	map1 := make(map[int]string)
	map1[10] = "a"
	map1[2] = "b"
	map1[1] = "c"
	map1[3] = "d"
	//当前版本已经自动排序
	fmt.Println(map1)
	//如果未排序,按照key的key顺序进行排序输出
	//1. 先将map的key放入到切片中
	//2. 对切片进行排序
	//3. 遍历切片,然后按照key来输出map的值
	var key []int
	for k, _ := range map1 {
		key = append(key, k)
	}
	//排序
	sort.Ints(key)
	fmt.Println(key)
	for _, k := range key {
		fmt.Printf("map[%v]=%v  ", k, map1[k])
	}
}

map使用细节:

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

在这里插入图片描述

2)map容量达到后,再向map增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对(key-value)

3)map的value也经常使用struct类型,更适合管理复杂的数据(比前面value是一个map更好)

在这里插入图片描述

##map练习:

编写一个函数modifyUser(users map[string]map[string]string,name string)完成上述功能【如果某个用户名存在,就将其密码修改为”88888“,如果不存在就增加用户信息,包括nickname和pwd】

func modifyUser(users map[string]map[string]string, name string) {
	//判断users中是否有name
	//v , ok := users[name]
	if users[name] != nil {
		//有这个用户
		users[name]["pwd"] = "888888"
	} else {
		//没有这个用户
		users[name] = make(map[string]string, 2)
		users[name]["pwd"] = "888888"
		users[name]["nickname"] = "昵称~" + name //示意
	}
	/*
			users := make(map[string]map[string]string, 10)
			users["smith"]= make(map[string]string, 2)
			users["smith"]["pwd"]="999999"
			users["smith"]["nickname"]="小花猫"
			modifyUser(users, "tom")
			modifyUser(users, "mary")
			modifyUser(users, "smith")
		    fmt.Println(users)
	*/
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言学习笔记(六)---map 的相关文章

  • 毕业设计 - 基于单片机的MP3设计与实现

    文章目录 1 简介 2 主要器件 3 实现效果 4 设计原理 核心算法 音频解码流程 5 部分实现代码 6 最后 1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 基于单片机的MP3设计与实现 大家可用于 课程设计 或 毕业设计
  • 软件工程技术--第四章 概要设计

    第四章 概要设计 4 1 软件设计概述 4 1 1 软件设计的概念与重要性 软件设计是软件工程的重要阶段 是一个将软件需求转换为软件表示的过程 软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务 即确定系统的物理模型 解
  • EXCEL 数字统一转换成文本

    将excel中的数字统一转换成文本形式 即添加 1 点击数据 分列 2 分隔符号 下一步 3 选择文本识别符号 如 分号 4 选中文本 完成 转载于 https www cnblogs com vicdream p 4604012 html
  • 合宙 ESP32C3 使用micropython 驱动配套0.96寸 TFT ST7735 屏幕显示色块和文字

    合宙的esp32c3 开发板配套了0 96寸屏幕驱动板 可直接使用如下链接的代码 注意替换对应的pin脚和st7735 py文件 1 想显示色块参考如下链接 链接 合宙esp32c3 合宙air101LCD屏幕跑通microPython 2
  • hbase面试题(6)

    1 HBase来源于哪篇博文 C BigTable 2 下面对HBase的描述哪些是正确的 B C D B 是面向列的 C 是分布式的 D 是一种NoSQL数据库 3 HBase依靠 存储底层数据 A A HDFS B Hadoop C M
  • SAR目标检测数据集汇总

    SAR目标检测数据集汇总 文章目录 SAR目标检测数据集汇总 1 MSTAR 1996 2 OpenSARShip2 0 2017 3 SSDD SSDD 2020 4 AIR SARShip2 0 2019 5 SAR Ship Data
  • VScode调试php文件(详细且简单易操作)

    之前也不懂 看了网上好多帖子 按照它们步骤操作一遍之后 还是不行 头都大了 现在懂了 原来几步就搞定了 被它们搞得这么复杂 又是配置这个文件 又是配置那个文件 1 下载XAMPP Download XAMPP apachefriends o
  • Java程序员面试常问试题大全

    Java程序员面试常问试题大全 1 面向对象的特征有哪些方面 1 抽象 抽象就是忽略一个主题中与当前目标无关的那些方面 以便更充分地注意与当前目标有关的方面 抽象并不打算了解全部问题 而只是选择其中的一部分 暂时不用部分细节 抽象包括两个方

随机推荐

  • 详解 cryptogen 的内容和配置

    目录 1 cryptogen 模块命令说明 2 cryptogen 模块的配置文件 3 cryptogen 实例 创建测试配置文件 4 Fabric 证书文件的结构 cryptogen 模块主要用来生成组织结构和账号相关的文件 任何 Fab
  • 【react】实现数据双向绑定之不用柯里化的方式

    直接给onChange事件绑定一个箭头函数 这个箭头函数的参数就是event 在箭头函数内再调用saveFormData方法 saveFormData方法里面this setState dataType value
  • 学Python该看什么书?12本精华好书推荐!

    为了让更多想通过看书来学习Python的人能够把时间花在刀刃上 小编总结了Python目前所有热门方向上我个人觉得性价比很高 值得一看的书籍 今天小编来分享给大家 一 Python新手入门 新手学Python的话我推荐这本 Python编程
  • java:面向对象(多态中成员的特点)。

    这次我们说说多态中成员的特点 我们写这样一个代码 class Fu void method1 System out println fu method1 void method2 System out println fu method 2
  • 秒解小米bl锁 无需等待时间_小米全新系统曝光:小米9推送Android Q体验版

    点击上方蓝字订阅每日最新国产手机资讯 对于米粉来说 MIUI系统是他们坚持使用小米手机的重要原因 就在今天上午 MIUI官方微博发布消息 小米9的MIUI Android Q Beta优先体验版现已推送 已获得测试资格的朋友可以升级体验 据
  • 大厂笔试真题

    1 复数相乘 2 K个一组翻转链表 include
  • 浅谈 Python中if __name__ == ‘__main__‘:的工作原理

    为了理解if name main 的工作原理 我们需要先了解Python中的特殊变量 name 每个Python模块都有一个内置的变量 name 这个变量的值取决于如何执行模块 如果模块是被直接运行的 例如 你使用命令python mysc
  • 「网络安全」如何搭建MySQL恶意服务器读取文件?

    前言 注 本文不涉及对MySQL协议报文研究 仅讲解原理 并且做部分演示 搭建MySQL恶意服务器读取文件这件事 虽然直接利用门槛较高 但是由于在网上看到了一种比较新颖的利用方式 利用社会工程学引诱用户连接MySQL进而读取用户文件 个人觉
  • Day【4】字符串解码

    原题链接 思路 对于字符串k encoding 对于这样的形式 我们要加encoding重复k次 从左向右扫描字符串 如果说遇见字符 就直接将该字符添加到结果中 如果说 遇见 k encoding 的形式 我们首先要做的是就是将k和enco
  • GCC参数详解

    gcc and g 分别是gnu的c c 编译器 gcc g 在执行编译工作的时候 总共需要4步 1 预处理 生成 i的文件 预处理器cpp 2 将预处理后的文件不转换成汇编语言 生成文件 s 编译器egcs 3 有汇编变为目标代码 机器代
  • 9.OB4.0调用存储过程通过临时表返回多行记录

    MYSQL存储过程返回多行 1 表数据准备 drop table if exists t1 drop table if exists t2 drop table if exists t3 create table t1 id varchar
  • 任何程序都必须加载到什么中才能被cpu执行

    任何程序都必须加载到内存中才能被cpu执行 内存是计算机中的重要部件之一 它是外存与cpu进行沟通的桥梁 计算机中所有程序的运行都在内存中进行 内存性能的强弱影响计算机整体发挥的水平 任何程序都必须加载到内存中才能被cpu执行 学习视频分享
  • WPF 性能优化建议

    本章讲述 WPF 性能优化建议 20180930 WPF性能优化问题 运行软件发现CPU使用率很大 80 95 程序中含有委托 线程 定时器的处理 之前优化时 主要优化线程和定时器相关线程方面的处理 但是效果甚微 无意间看到博客中说程序界面
  • Android onInterceptTouchEvent与onTouchEvent调用关系

    概述 onInterceptTouchEvent 是用来拦截Touch事件 ViewGroup有 View没有 onTouchEvent 是Touch事件 ViewGroup与View都有 实例讲解 当一个Touch事件发生后 会由父布局开
  • connect错误:no route to host

    linux下 socket 用vmware装了两个虚拟机 分别运行客户端和服务器端 客户端连接的时候报错 connect error no route to host 但是在同一虚拟机下运行正常 我检查了socket返回值 正常 地址和端口
  • U-boot引导流程分析一

    U Boot 全称 Universal Boot Loader 即通用引导程序 是遵循GPL条款的开放源码项目 它的源码目录 编译形式与Linux内核很相似 事实上 不少U Boot源码就是相应的Linux内核源程序的简化 尤其是一些设备的
  • linuxptp源码研究

    目录 1 检查网卡是否支持相应的时间戳 2 linuxptp的目录架构 3 ptp4l的大致流程分析 4 gptp协议对应的sync follow up delay request delay response消息在代码的位置 5 slav
  • Deeplearning4j 实战 (13):基于TextCNN的文本分类实现

    Eclipse Deeplearning4j GitChat课程 Deeplearning4j 快速入门 专栏Eclipse Deeplearning4j 系列博客 万宫玺的专栏 wangongxi CSDN博客Eclipse Deeple
  • java native

    1 java lang Boolean中没有 native方法2 java lang Character中没有native方法3 java lang Byte中没有本地方法4 java labg Short中没有本地方法5 java lan
  • Go语言学习笔记(六)---map

    4 7 map map是key value数据结构 又称为字段或者给关联数组 类似其他编程语言的集合 映射 基本语法 var map变量名 map keytype valuetype keytype可以是bool int string 指针