map数据类型

news/2024/11/13 21:24:50/文章来源:https://www.cnblogs.com/xuruizhao/p/18544835

map

Map 是一种无序的键值对的集合。

  • 无序 :map[key],不可能使用 map[0] map[1]1去取出数据
  • 键值对:key - value /key - value key - value key - value

Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。

不过,Map 是无序的,我们无法决定它的返回顺序。

Map也是引用类型

【1】、map的定义

package mainimport ("fmt"
)func main() {// map集合,保存数据的一种结构// 创建一个map  map[key]value,定义后默认是空的var map1 map[int]stringif map1 == nil {fmt.Println("map1==null")}// 更多的时候时使用make方法去创建var map2 = make(map[string]string)fmt.Println(map2)// 在创建的时候,添加一些数据 map[string]int{"key":"value"}var map3 = map[string]int{"C": 100, "Go": 10, "java": 60}fmt.Println(map3)fmt.Printf("%T\n", map3)
}

【2】、map的使用

  • 创建并初始化map
  • map[key] = value 。将vaule赋值给对应的map的key
  • 判断key是否存在,value, ok = map[key]
  • 删除map中的元素, delete(map,key)
  • 新增 map[key] = value
  • 修改 map[key] = value ,如果存在这个key就是修改。
  • 查看map的大小, len(map)
package mainimport ("fmt"
)func main() {// map定义var map1 map[string]int// map1初始化map1 = make(map[string]int)// 在map中,如果key重复了,那么后面的key就会覆盖前面的keymap1["C"] = 100map1["Go"] = 100map1["Java"] = 200fmt.Println(map1)fmt.Println(map1["C"])// 在map中没有index的概念,因此我们需要判断key是否存在// map中的判断,ok-idiom 是否存在 是一个bool值value, ok := map1["C"]if ok {fmt.Println("map中key存在,value", value)} else {fmt.Println("map中key不存在")}// 修改数据map1["C"] = 300fmt.Println(map1)// 如果key存在 那就是直接修改,如果key不存在就是新增的过程map1["C++"] = 400fmt.Println(map1)// 删除数据,delete方法delete(map1, "C")fmt.Println(map1)fmt.Println(len(map1))  // 有几个key len就是多少
}

【3】、map遍历

for k, v := range map1 , key-value,每次打印可能是无序的。

package mainimport "fmt"/*遍历map- key、value 无序的,遍历map,可能每次的结果排序都不一致。- "aaa" "aaaaa"- "bbb" "bbbbb"- "ccc" "ccccc"1、map是无序的,每次打印出来的map可能都不一样,它不能通过index获取,只能通过key来获取
2、map的长度是不固定的,是引用类型的
3、len可以用于map查看map中数据的数量,但是cap无法使用
4、map的key 可以是 布尔类型,整数,浮点数,字符串
*/
func main() {var map1 = map[string]int{"C": 100, "java": 200, "Go": 300}for k, v := range map1 {fmt.Println(k, v)}
}

【4】、map结合slice使用

package mainimport "fmt"func main() {// map 结合 slice 来使用/*需求:1、创建map来存储人的信息,name,age,sex,addr2、每个map保存一个的信息3、将这些map存入到切片中4、打印这些数据*/user1 := make(map[string]string)user1["name"] = "tom"user1["age"] = "14"user1["addr"] = "tianjin"user2 := make(map[string]string)user2["name"] = "jim"user2["age"] = "16"user2["addr"] = "shanghai"user3 := map[string]string{"name": "jerry", "age": "55", "addr": "hangzhou"}fmt.Println(user3)userDate := make([]map[string]string, 0, 3)userDate = append(userDate, user1, user2, user3)fmt.Println(userDate)for _, v := range userDate {fmt.Println(v["name"])}
}
// 通过map和slice 写一个简单的图书数据库,并可以通过书名或者书号来查询书的位置
package mainimport "fmt"func main() {map1 := make(map[string]any)map1["name"] = "haha"map1["num"] = "1212"map1["addr"] = "1-1-3232"map2 := make(map[string]any)map2["name"] = "xixi"map2["num"] = "456"map2["addr"] = "1-2-5252"map3 := make(map[string]any)map3["name"] = "hehe"map3["num"] = "44512"map3["addr"] = "4-1-3232"s1 := make([]map[string]any, 0, 10)s1 = append(s1, map1, map2, map3)fmt.Println(s1)var name stringfmt.Println("请输入书名")fmt.Scan(&name)for _, books := range s1 {if name == books["name"] {fmt.Println(books["addr"])}}
}

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

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

相关文章

数据类型和运算符

数据类型 动态类型编程语言运行时判断静态类型的编程语言 : Go 、C 、在开发的时候,就需要给一些定义的变量赋值空间大小。C 需要自己去开辟这个空间数据类型 : 每种在Go语言中出现的基本数据类型,会有一个默认的空间大小。 1、布尔类型数据 布尔型的值只可以是常量 true 或…

XXL JOB DockerCompose部署

官网给的方式是 Docker 命令启动,但是用起来太麻烦了,所以用DockerCompose 简化部署 创建数据库,导入 SQL SQL 脚本位置为/xxl-job/doc/db/tables_xxl_job.sql https://raw.githubusercontent.com/xuxueli/xxl-job/refs/heads/master/doc/db/tables_xxl_job.sql 编写 Docker…

CICD02 Jenkins安装,备份还原, 实现CICD核心功能 ubuntu使用

DevOps 之 CICD 服务器 Jenkins 1 Jenkins 部署与基本配置 1.2 Jenkins 安装和启动 1.2.1 Jenkins 的安装 Jenkins支持多种安装方法 1.包安装 2.JAVA的WAR文件 #要手动配置,不太方便 3.容器运行#系统要求 最低推荐配置:1.256MB可用内存2.1GB可用磁盘空间(作为一个Docker容…

CICD01 Git, GitLab, 部署方式 ubuntu使用

版本管理系统 Git 和 GitLab 1 DevOps 简介 1.3 持续集成、持续交付和持续部署 CICD CICD: 持续集成, 持续交付, 持续部署 1.6 常见的软件部署模式 生产中 蓝绿部署 和 金丝雀用的比较多 1.6.1 蓝绿部署 Blue-green Deployments 一个和生产环境一样的预发布环境, 和生产环…

jvm 垃圾回收算法的评价标准

如何实现回收的(核心思想): 1. 找到内存中存活的对象(与GC Root相关联) 2. 释放不再存活对象的内存,使得程序能再次利用这部分空间 --------------------------------------------------------------------------------- 垃圾回收算法的分类: -------- ----------------…

GO面试-切片

一、结构介绍 切片(Slice)在 Go 语言中,有一个很常用的数据结构,切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。并发不安全。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义: type slice …

系统管理体系——软件包管理

1.Linux系统管理体系——软件包管理Linux下面的软件包格式为:rpm格式(红帽系列系统,CentOS,麒麟系统)或deb格式(Debian,Ubuntu)安装软件方式 举例 说明 应用场景yum/apt 方式 点外卖,缺啥少啥,外卖解 决 通过网络下载软件包,替我们安装, 如果 有依赖自动下载依赖并安装. …

Linux12位权限管理体

1. Linux12位权限管理体 1.1 权限管理概述Linux通过rwx3种权限控制系统与保护系统,组成9位权限. Linux权限体系中还有3位特殊权限,组合起来就是12位权限体系. Linux这简单的rwx控制整个Linux系统的安全,权限与用户共同组成Linux系统的安全防护体系.1.2 Linux权限计算 2.0 rwx权…

Java流程控制(三)

用户交互Scanner(java.util.Scanner获取用户的输入)//基本语法 Scanner s = new Scanner(System.in)通过Scanner类的next()与nextLine()方法获取输入的字符串,使用hasNext()与hasNextLine()判断是否还有输入的数据(Next不能得到带有空格的字符串,NextLine可以获得空白)im…

0.1+0.2=0.30000000000000004

看下效果这个网站能找到你想要的答案 https://0.30000000000000004.com/ 十进制转二进制 十进制整数转换为二进制整数采用"除2取余,逆序排列"法。 具体做法是:用2整除十进制整数,可以得到一个商和余数; 再用2去除商,又会得到一个商和余数,如此进行,直到商为小…

「AT_diverta2019_2_e」Balanced Piles 题解

题意描述 有一个长度为 \(N(2\le N \le 10^6)\) 的数组,一开始所有元素均为 \(0\)。 设 \(M\) 为当前数组中的最大元素,\(m\) 是当前数组中的最小元素,你可以执行若干次以下操作:选择一个大小为 \(m\) 的元素,把他变为 \(x\),其中 \(M\le x \le M+D\) 且 \(m<x\)。 求…

团队项目Scrum冲刺-day3

一、每天举行站立式会议 站立式会议照片一张昨天已完成的工作成员 任务陈国金 用户模块的部分接口凌枫 用户登录页面陈卓恒 用户注册界面谭立业 题目搜索页面部分内容廖俊龙 接口测试曾平凡 前端页面测试曾俊涛 题目模块的部分接口薛秋昊 题目提交模块的部分接口今天计划完成的…