1.Map的定义

map是Go中的内置类型,它将一个值与一个键关联起来。可以使用相应的键检索值。Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值

Map 是一种集合,所以我们可以像送代数组和切片那样送代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的,它是引用类型

使用map过程中需要注意的几点:

  • map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取。map的长度是不固定的,也就是和slice一样,也是一种引用类型。内置的len函数同样适用于map,返回map拥有的key的数量
  • map的key可以是所有可比较的类型,如布尔型、整数型、浮点型、复杂型、字符串型.....也可以键。

2.Map的使用

/**
* @author ly (个人博客:https://www.cnblogs.com/qbbit)
* @date 2023/4/10 20:31
* @tags 喜欢就去努力的争取
*/
package main import "fmt" func main() { /**
方式一:var map1 map[key类型]value类型
*/
var map1 map[int]string /**
方式二:var map2 = make(map[key类型]value类型)
*/
var map2 = make(map[int]string) /**
方式三:var map3 = make[key类型]value类型{k1:v1,k2:v3,......}
*/
var map3 = map[string]int{"Go": 99, "Java": 98, "Python": 97}
map4 := map[int]int{1: 100, 2: 200, 3: 300} fmt.Println(map1)
fmt.Println(map2)
fmt.Println(map3)
fmt.Println(map4) // 如果不初始化 map,那么就会创建一个nil map。nil map不能用来存放键值对
// 这个nil --> 就相当于null
if map1 == nil {
map1 = make(map[int]string)
fmt.Println(map1 == nil)
}
}

map的存储特点

  • 存储的是无序的键值对
  • 键不能重复,并且和value值一一对应的:map的key不能重复,如果重复了,那么新的value会覆盖原来的,程序不会报错

3.map的一些基本操作

map1[1] = "hello"
map1[2] = "world"
map1[3] = "ly"
map1[4] = "王二狗"
map1[5] = "ruby"
map1[6] = "Javascript"
map1[7] = "" fmt.Println(map1)
fmt.Println(map1[3])
fmt.Println(map1[40]) // 1、获取数据,根据key获取对应的value值
// 根据key获取对应的value,如果key存在,获取数值,如果key不存在,获取的是value值类型的零值
val := map1[1]
fmt.Println(val)
// 推荐下面的方式进行获取数据,ok可以进行判断
v1, ok := map1[40]
if ok {
fmt.Println("对应的数值为:", v1)
} else {
fmt.Println("操作的key不存在,获取到的是零值:", v1)
} // 2、添加|修改数据
// key存在修改,key不存在添加
map1[7] = "ly"
fmt.Println(map1) // 3、删除数据
delete(map1, 2)
fmt.Println(map1) // 4、map的长度
fmt.Println("map的长度为:", len(map1))
// fmt.Println("map的容量为:",cap(map1)) // 错误写法

4.map的遍历

/**
map的遍历
使用:for range
数组,切片:index,value
map: key,value
*/
for key, value := range map1 {
fmt.Printf("key:%d , value:%s \n", key, value)
} for _, value := range map1 {
fmt.Println("value:", value)
} // 创建一个切片
keys := make([]int, 0, len(map1))
fmt.Println("keys:", keys) // 遍历map
for k, _ := range map1 {
keys = append(keys, k)
}
fmt.Println(keys) // 排序
sort.Ints(keys)
fmt.Println(keys) // 这样就可以顺序的拿到map中的值了
for _, key := range keys {
fmt.Println(key, map1[key])
} // 字符串的排序
s1 := []string{"App", "windows", "Orange", "abc", "acd", "acc", "宝宝"}
fmt.Println(s1)
sort.Strings(s1)
fmt.Println(s1)

5.map和slice的使用

// map和slice结合使用
mapA := make(map[string]string)
mapA["name"] = "zs"
mapA["age"] = "18"
mapA["address"] = "湖北武汉" mapB := make(map[string]string)
mapB["name"] = "ly"
mapB["age"] = "20"
mapB["address"] = "湖北黄石" sl := make([]map[string]string, 0, 2)
sl = append(sl, mapA)
sl = append(sl, mapB)
fmt.Println(sl) for index, m := range sl {
fmt.Println(index, m["name"], m["age"], m["address"])
}

6.map是引用类型

// map是引用类型
mapC := make(map[string]float64)
mapD := make(map[int]int64)
fmt.Printf("%T\n", mapC)
fmt.Printf("%T\n", mapD) mapE := make(map[string]map[int]string)
fmt.Printf("%T\n", mapE) m1 := make(map[int]string)
m1[1] = "a"
m1[2] = "b" m2 := make(map[int]string)
m2[1] = "ly"
m2[2] = "bao" mapE["A"] = m1
mapE["B"] = m2 fmt.Println(mapE) // 验证map是引用类型
mapF := mapE fmt.Println(mapE)
fmt.Println(mapF) m3 := map[int]string{1: "zs", 2: "包"}
mapF["A"] = m3 // 验证
fmt.Println(mapE)
fmt.Println(mapF)

14、Map的更多相关文章

  1. go语言的 数组、slice、map使用(转)

    golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...

  2. Python特殊语法--filter、map、reduce、lambda

    一.filter(function, sequence) 对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple( ...

  3. Python特殊语法:filter、map、reduce、lambda [转]

    Python特殊语法:filter.map.reduce.lambda [转] python内置了一些非常有趣但非常有用的函数,充分体现了Python的语言魅力! filter(function, s ...

  4. Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

    概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...

  5. Java集合的Stack、Queue、Map的遍历

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  6. java中将list、map对象写入文件

    链接地址:http://blog.sina.com.cn/s/blog_4a4f9fb50101p6jv.html     推荐:凤爪女瓜子男怪象该谁反思伦敦房价为什么持续暴涨 × wvqusrtg个 ...

  7. STL学习:STL库vector、string、set、map用法

    本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...

  8. ReactiveCocoa源码解析(五) SignalProtocol的observe()、Map、Filter延展实现

    上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...

  9. ReactiveSwift源码解析(五) SignalProtocol的observe()、Map、Filter延展实现

    上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...

  10. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比

    原文地址 在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java中泛型强制要求指定类型. ES6引入了iterable类型, ...

随机推荐

  1. CodeForces 1408D Searchlights

    题意 在二维平面有\(n\)个海盗,\(m\)个探照灯,你有两种操作 将所有海盗往上走一步 将所有海盗往右走一步 设海盗为\((a_i,b_i)\),探照灯为\((c_j,d_j)\),当且仅当\(a ...

  2. 发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别

    蓝绿发布(Blue-Green Deployment) 蓝绿发布提供了一种零宕机的部署方式.不停老版本,部署新版本进行测试,确认OK,将流量切到新版本,然后老版本同时也升级到新版本.始终有两个版本同时 ...

  3. AutoEmbedding论文阅读笔记

    问题背景 目前推荐系统中, 在特征维度上低频特征和高频特征的维度是通过遍历mask特征获得到的auc衰减衡量特征对模型的重要度来决定的. 如果想提升模型效果, 在field层面上需要减少进行基于经验的 ...

  4. Azure Data Factory(七)数据集验证之用户托管凭证

    一,引言 上一篇文章中,我们讲解了 Azure Data Factory 在设置数据集类型为  Dataverse 的时候,如何连接测试.今天我们继续讲解认证方式这一块内容,打开 Link Servi ...

  5. 在线问诊 Python、FastAPI、Neo4j — 创建药品节点

    目录 前提条件 创建节点 Demo 准备数据 创建药品标签节点 在线问诊 Python.FastAPI.Neo4j - 创建节点 Neo4j 节点的标签可以理解为 Java 中的实体. 根据常规流程: ...

  6. java中有哪些并发的List?只知道一种的就太逊了

    java中有很多list,但是原生支持并发的并不多,我们在多线程的环境中如果想同时操作同一个list的时候,就涉及到了一个并发的过程,这时候我们就需要选择自带有并发属性的list,那么java中的并发 ...

  7. Electron包装网站的问题

    原文链接 原文链接 Preface 最近尝试了很多不错的在线工具,只是每次都要进入网站,有点麻烦,于是想到之前了解过的electron,尝试一下打包成本地应用. Contents 1.下载所有源文件 ...

  8. vue2和vue3使用echarts时无数据,怎么显示暂无数据图片或文字

    一开始也经历了用v-if和v-show,v-show的话echarts还会留出暂无数据图片的位置,导致echarts变形,v-if在加载和不加载切换时,dom会获取不到:后来也是在网上找的方法,时间有 ...

  9. Vite+ts+springboot项目集成2

    项目集成 集成element-plus 官网地址: 安装图标库 pnpm install element-plus @element-plus/icons-vue 入口文件main.ts全局安装ele ...

  10. 基本环境安装 jdk,mq,redis,nginx

    JDK:解压安装包,命令为 tar -zxvf jdk-8u381-linux-x64.tar.gz配置环境变量,使用 vim 命令(需要安装vim,安装命令为:yum install vim)修改 ...