【GO语言卵细胞级别教程】10.探索Go语言中神奇的Map类型:解密键值对的魔力(含习题)

【GO语言卵细胞级别教程】10.探索Go语言中神奇的Map类型:解密键值对的魔力(含习题)

文章目录

  • 【GO语言卵细胞级别教程】10.探索Go语言中神奇的Map类型:解密键值对的魔力(含习题)
  • 1.简介
  • 2. 基本语法
  • 3.Map基本操作
    • 3.1 增删改查
    • 3.2 遍历
  • 4. 本章的代码
  • 5.练习题

🥰微信公众号:【给点知识】分享小知识,快速成长,欢迎关注呀!(底部点击二维码)
🥰本项目演示代码仓库:https://gitee.com/gdzsfun/csdn-study-go 演示项目仓库
🥰本项目创建方式:【GO语言卵细胞级别教程】05.项目创建和函数讲解
🥰学习宗旨:活到老,学到老。
😍写作宗旨:致力于改变现有文章难读难懂问题。

1.简介

map就是类似python中的字典,是一对键值对key-value。
例如:
学生1:学号1
学生2:学号2

{"name":"张三","age":"19"
}
  1. 注意事项
    (1)key value的类型 bool 数组 指针 channel、结构体、接口、数组
    (2)key通常是为int string value通常为 map int float string 结构体
    (3)key 不能为 slice map function
    (4)map排序是乱序的
    (5)使用之前一定要使用make申请空间
    (6)key不能重复,后面的会把前面已经赋值的给覆盖了
    (7)使用make(map, size)初始的时候,size可以省略默认为1

2. 基本语法

  1. 定义映射类型使用make(map, size)
// 语法
var mapName map[keyType]valueType
// 举例
var map1 map[int]string
map1 = make(map[int]string)// 例子
var a map[int]string
a = make(map[int]string, 1)
a[100] = "中国"
a[99] = "美国"
a[98] = "印度"
fmt.Println(a)
// 输出结果
map[98:印度 99:美国 100:中国]
  1. makei不加长度make(map)
var map2 map[int]string
map2 = make(map[int]string)
// 或者
map2 := make(map[int]string)
map2[100] = "中国"
  1. 直接赋值
// 使用显示定义
var map2 map[int]string = map[int]string{123:"123",
}
fmt.Println(map2)
// 使用隐式定义
map3 := map[int]string{345:"345",
}
fmt.Println(map3)
// 输出结果
map[123:123]
-----
map[345:345]
  1. 多级映射
var selfInfoMap map[string]map[string]string
selfInfoMap =  make(map[string]map[string]string)
selfInfoMap["student1"] = make(map[string]string)
selfInfoMap["student1"]["name"] = "张三"
selfInfoMap["student1"]["age"] = "19"
selfInfoMap["student1"]["notes"] = "优秀"

实战

var selfInfoMap map[string]map[string]string
selfInfoMap =  make(map[string]map[string]string)
selfInfoMap["student1"] = make(map[string]string)
selfInfoMap["student1"]["name"] = "张三"
selfInfoMap["student1"]["age"] = "19"
selfInfoMap["student1"]["notes"] = "优秀"for _,v := range selfInfoMap{fmt.Printf("学生:%v, 年龄:%v, 备注:%v\n",v["name"],v["age"],v["notes"])
}
//输出结果
学生:张三, 年龄:19, 备注:优秀

3.Map基本操作

3.1 增删改查

  1. 增加与更新操作
    只用使用mapx[key] = value
    (1)如果key存在则更新,反之增加元素
package mystudy
// 映射map知识点
import "fmt"func DemoMap(){// map基本操作fmt.Println("------map基本操作------")map6 := make(map[int]string)map6[1] = "111"map6[2] = "222"fmt.Println(map6)// 增加操作map6[3] = "333"fmt.Println("新增key:3 value", map6[3])// 更新操作 map6[3] = "3-3-3"fmt.Println("修改key:3 value", map6[3])
}
// 输出结果
------map基本操作------
map[1:111 2:222]
新增key:3 value 333
修改key:3 value 3-3-3
  1. 删除操作:delete(map, “key”)
package mystudy
// 映射map知识点
import "fmt"func DemoMap(){// map基本操作fmt.Println("------map基本操作------")map6 := make(map[int]string)map6[1] = "111"map6[2] = "222"fmt.Println(map6)map6[3] = "333"fmt.Println("新增key:3 value", map6[3])map6[3] = "3-3-3"fmt.Println("修改key:3 value", map6[3])// 删除操作fmt.Println("删除前map6:", map6)delete(map6,3)fmt.Println("删除后map6:", map6)}
// 输出结果
删除前map6: map[1:111 2:222 3:3-3-3]
删除后map6: map[1:111 2:222]
  1. 清空数组操作
1. 清空操作,方式1使用delete遍历删除
2. 使用make赋值新的空间
map6 = make(map[int]string)
  1. 获取值操作map6[2] 会有两个返回值,一个是value 一个是元素是否存在的布尔类型
    true 存在,false 不存在 value对应的类型以及默认值就是 map[int]string 值对应的类型,比如
    map[int]string 值类型是string那么这个字符串就是空的 如果是 map[int]int 那么如果获取不到就默认是0 false
package mystudy
// 映射map知识点
import "fmt"func DemoMap(){// map基本操作fmt.Println("------map基本操作------")map6 := make(map[int]int)map6[1] = 111map6[2] = 222fmt.Println(map6)// 增加操作map6[3] = 333fmt.Println("新增key:3 value", map6[3])// 更新操作 map6[3] = 33333fmt.Println("修改key:3 value", map6[3])// 删除操作fmt.Println("删除前map6:", map6)delete(map6,3)fmt.Println("删除后map6:", map6)// 清空map6// map6 = make(map[int]string)// fmt.Println(map6)// 获取值操作value, bool1:= map6[2]fmt.Printf("%T, %T\n", value, bool1)fmt.Println(value, bool1)value, bool1 = map6[22]fmt.Printf("%T, %T\n", value, bool1)fmt.Println(value, bool1)
}
// 输出结果
------map基本操作------
map[1:111 2:222]
新增key:3 value 333
修改key:3 value 33333
删除前map6: map[1:111 2:222 3:33333]
删除后map6: map[1:111 2:222]
int, bool
222 true
int, bool
0 false

3.2 遍历

  1. 使用for - range进行遍历
package mystudy
// 映射map知识点
import "fmt"func DemoMap(){// 定义多级映射var selfInfoMap map[string]map[string]stringselfInfoMap =  make(map[string]map[string]string)selfInfoMap["student1"] = make(map[string]string)selfInfoMap["student1"]["name"] = "张三"selfInfoMap["student1"]["age"] = "19"selfInfoMap["student1"]["notes"] = "优秀"for _,v := range selfInfoMap{fmt.Printf("学生:%v, 年龄:%v, 备注:%v\n",v["name"],v["age"],v["notes"])}}
// main
学生:张三, 年龄:19, 备注:优秀
  1. 获取map长度,使用len(xxx)

4. 本章的代码

package mystudy
// 映射map知识点
import "fmt"func DemoMap(){// 定义map变量var a map[int]stringa = make(map[int]string, 1)a[100] = "中国"a[99] = "美国"a[98] = "印度"fmt.Println(a)fmt.Println("-----")var map1 map[int]stringmap1 = make(map[int]string)map1[66] = "以色列"map1[68] = "巴勒斯坦"fmt.Println(map1)fmt.Println("------")var map2 map[int]string = map[int]string{123:"123",}fmt.Println(map2)fmt.Println("-----")map3 := map[int]string{345:"345",}fmt.Println(map3)fmt.Println("-----")// 定义多级映射var selfInfoMap map[string]map[string]stringselfInfoMap =  make(map[string]map[string]string)selfInfoMap["student1"] = make(map[string]string)selfInfoMap["student1"]["name"] = "张三"selfInfoMap["student1"]["age"] = "19"selfInfoMap["student1"]["notes"] = "优秀"for _,v := range selfInfoMap{fmt.Printf("学生:%v, 年龄:%v, 备注:%v\n",v["name"],v["age"],v["notes"])}// 获取长度fmt.Println(len(selfInfoMap))// map基本操作fmt.Println("------map基本操作------")map6 := make(map[int]int)map6[1] = 111map6[2] = 222fmt.Println(map6)// 增加操作map6[3] = 333fmt.Println("新增key:3 value", map6[3])// 更新操作 map6[3] = 33333fmt.Println("修改key:3 value", map6[3])// 删除操作fmt.Println("删除前map6:", map6)delete(map6,3)fmt.Println("删除后map6:", map6)// 清空map6// map6 = make(map[int]string)// fmt.Println(map6)// 获取值操作value, bool1:= map6[2]fmt.Printf("%T, %T\n", value, bool1)fmt.Println(value, bool1)value, bool1 = map6[22]fmt.Printf("%T, %T\n", value, bool1)fmt.Println(value, bool1)
}
  1. 多嵌套遍历
package mainimport "fmt"func main() {// 创建多个嵌套的映射employeeMap := make(map[string]map[string]string)// 添加数据到映射中employeeMap["John"] = map[string]string{"position": "Manager","department": "Sales","city": "New York",}employeeMap["Alice"] = map[string]string{"position": "Engineer","department": "IT","city": "San Francisco",}employeeMap["Bob"] = map[string]string{"position": "Analyst","department": "Finance","city": "Chicago",}// 遍历多个嵌套的映射for name, details := range employeeMap {fmt.Printf("Employee: %s\n", name)fmt.Println("Details:")for key, value := range details {fmt.Printf("%s: %s\n", key, value)}fmt.Println()}
}

5.练习题

当提供一些Go语言的映射(Map)练习题,包括选择题和算法题。以下是几个例子及其答案:

选择题:

  1. 下面哪个选项是创建一个空映射的正确方式?
    a) var m map[string]int
    b) m := make(map[string]int)
    c) m := map[string]int{}
    d) m := new(map[string]int)

    答案:b) m := make(map[string]int)

  2. 假设有一个映射m,如何判断键"key1"是否存在于映射中?
    a) if m["key1"] != nil
    b) if _, ok := m["key1"]; ok
    c) if m["key1"] != ""
    d) if _, ok := m["key1"]

    答案:b) if _, ok := m["key1"]; ok

算法题:

  1. 给定一个字符串,统计每个字符出现的次数,并将结果存储在一个映射中。
func countCharacters(str string) map[rune]int {charCount := make(map[rune]int)for _, char := range str {charCount[char]++}return charCount
}func main() {str := "abracadabra"result := countCharacters(str)fmt.Println(result)
}

输出结果:

map[a:4 b:2 r:2 c:1 d:1]
  1. 给定两个映射m1m2,编写一个函数判断它们是否相等,即包含相同的键和对应的值。
func mapsEqual(m1, m2 map[string]int) bool {if len(m1) != len(m2) {return false}for key, val := range m1 {if m2Val, ok := m2[key]; !ok || m2Val != val {return false}}return true
}func main() {m1 := map[string]int{"a": 1, "b": 2, "c": 3}m2 := map[string]int{"a": 1, "b": 2, "c": 3}fmt.Println(mapsEqual(m1, m2)) // truem3 := map[string]int{"a": 1, "b": 2, "c": 3}m4 := map[string]int{"a": 1, "b": 3, "c": 3}fmt.Println(mapsEqual(m3, m4)) // false
}

输出结果:

true
false

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

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

相关文章

考研复试C语言篇

第一章 概述 1.1什么是程序 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的合集。 1.4C语言的特点 代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,也适用于多种机型。使允许直接访问物理地址…

维度建模之公共明细层

在模型设计时多事务事实表和累积快照事实表的选取,如果是基于多个业务过程联合分析而构建的事实表,比如订单全流程表应设计为累积快照事实表,而多事务事实表应该是有多个业务过程,多个度量,并且这些业务过程还应该有一…

供应IMX290LQR-C芯片现货

长期供应各品牌芯片现货,SONY索尼SONY索尼CMOS/CCD芯片全系列全新现货优势出: IMX225LQR-C IMX415-AAQR-C IMX290LQR-C imx273llr-C IMX397CLN-C IMX637-AAMJ-C IMX647-AAMJ-C IMX991-A***-C IMX991-AABJ-C IMX287LLR-C IMX287LQR-C IMX297L…

git fetch 合并远程仓库到本地

git fetch origin master //从远程主机的master分支拉取最新内容 git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支 https://www.cnblogs.com/runnerjack/p/9342362.html 使用git fetch和git merge手动解决一次pull request冲突

python可视化绘图2.0

五星红旗 import turtle import mathturtle.pensize(3) turtle.colormode(255)# 画背景 turtle.pencolor("#ed120c") turtle.fillcolor("#ed120c") turtle.begin_fill() turtle.penup() turtle.goto(-150, 100) turtle.pendown()for i in [300, 200, 300,…

Svelte之基础知识一

文章目录 参考资料什么是Svelte?简介添加数据{}动态属性{}嵌套组件HTML标签html创建一个应用程序 反应性能力赋值on:click{}声明$:语句$:{}更新数组和对象 属性Declaring propsexport属性对象传递{...xxx} 逻辑if语句{#if xxx}...{/if}else语句{#if xxx}...{:else}.…

Coordinate Attention(CVPR 2021)

paper:Coordinate Attention for Efficient Mobile Network Design official implementation:GitHub - houqb/CoordAttention: Code for our CVPR2021 paper coordinate attention 背景 注意力机制,已经被广泛用于提高深度神经网络的性能&…

HBuilder发行微信小程序

首先需要完善mainifest.json中的基本配置 这个需要组测dcloud才可以获取,注册后点击重新获取就可以。 然后发行前还需要完成dcloud的信息,这个他会给你网址 点击连接完成信息填写就可以了 然后就可以发行了。 发行成功后会自动跳转微信小程序&#xff…

Sklearn逻辑回归

逻辑回归是一种广泛用于分类问题的机器学习算法。在Python中,你可以使用Sklearn库(scikit-learn)来方便地实现逻辑回归。下面是一个简单的例子,展示了如何使用Sklearn进行逻辑回归。 # 导入必要的库 from sklearn.model_selectio…

大数据面试(Kafka面试真题-卷二)

大数据面试(Kafka面试真题) 1、Kafka分区容错性?2、Kafka的IOSR和ACK介绍,ACK分别有几种值?3、Kafka的工作原理?4、Kafka如何保证全局有序?5、Kafka为什么同一个消费者组的消费者不能消费相同的…

6.Java并发编程—深入剖析Java Executors:探索创建线程的5种神奇方式

Executors快速创建线程池的方法 Java通过Executors 工厂提供了5种创建线程池的方法,具体方法如下 方法名描述newSingleThreadExecutor()创建一个单线程的线程池,该线程池中只有一个工作线程。所有任务按照提交的顺序依次执行,保证任务的顺序性…

现代化的轻量级Redis桌面客户端Tiny RDM

​欢迎光临我的博客查看最新文章: https://river106.cn 1、简介 Tiny RDM(全称:Tiny Redis Desktop Manager)是一个界面现代化的轻量级Redis桌面客户端,支持Linux、Mac和Windows。它专为开发和运维人员设计,使得与Red…

python coding with ChatGPT 打卡第22天| 二叉搜索树的操作:插入、删除、修剪、转换

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树:理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树:翻转…

SpringBoot集成对象存储服务Minio

MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从…

IP数据报格式

每一行都由32位比特,即4个字节组成,每个格子称为字段或者域。IP数据报由20字节的固定部分和最大40字节的可变部分组成。 总长度 总长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度(首部长度数据载荷长度)最大…

基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大,容错率低&…

【Axure高保真原型】下拉列表切换图表

今天和大家分享通过下拉列表动态切换统计图表的原型模板,我们可以通过下拉列表选择要显示的图表,包括柱状图、条形图、饼图、环形图、折线图、曲线图、面积图、阶梯图、雷达图;而且图表数据可以在左侧表格中动态维护,包括增加修改…

《你是什么垃圾-弹幕版》

你是什么垃圾-弹幕版 类型:垃圾分类 视角:2d 乐趣点:弹幕交互,热点追踪 时间:2021 个人职责: 所有程序部分的设计开发 此游戏是某个早晨,在早点铺子吃米线的时候构思出来的。当时正是&#xff0…

bpmn-js系列之Viewer

上一篇文章『bpmn-js系列之Modeler、以及流程编辑界面的优化』介绍了bpmn-js的modeler模式下的一些开发配置,这篇文章将会介绍Viewer模式的使用 以下演示代码基于上一节搭建好的vue环境,使用bpmn版本为当前最新版7.3.0 基本使用 Viewer的使用与Modele…

【基础CSS】

本文章属于学习笔记&#xff0c;在https://www.freecodecamp.org/chinese/learn/2022/responsive-web-design/中练习 二、 CSS 样式&#xff0c;新建一个文件.css&#xff0c;该文件不含有style标签 <style>. h1&#xff0c;h2&#xff0c;p{ text-align&#xff1a;ce…