32-Golang中的map

news2024/9/25 19:17:02

Golang中的map

    • 基本介绍
    • 基本语法
      • map声明的举例
    • map使用的方式
    • map的增删改查操作
      • map的增加和更新
      • map的删除
      • map的查找
    • map的遍历
    • map切片
      • 基本介绍
    • map排序
    • map的使用细节

基本介绍

map是key-value数据结构,又称为字段或者关联数组。类似其它编程语言的集合,在编程中是经常使用到的7

基本语法

var map变量名 map[keytype]valuetype

  • key可以是什么类型:golang中的map的key可以是很多种类型,比如bool,数字,string,指针,channel,还可以是值包含前面几个类型的接口,结构体,数组,通常为int,string。value的类型和key基本一样,通常为数字,string,map,struct。
  • 注意:slice,map还有function不可以,因为这几个没法用 ==来判断

map声明的举例

var a map[string]sting

var a map[string]int

var a map[int]sting

var a map[string]map[sting]string

注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。

package main
import (
	"fmt"
)


func main() {
	//map的声明和注意事项
	var a map[string]string
	//在使用map,需要先make,make的作用就给map分配给map分配数据空间
	a = make(map[string]string)
	a["no1"] = "kunkun"
	a["no2"] = "kun"
	a["no3"] = "heizi"
	a["no1"] = "kun"
	fmt.Println(a)
}

//map[no1:kun no2:kun no3:heizi]

说明:

  • 1.map在使用前一定要make
  • 2.map的key是不能重复,如果重复了,则以最后这个key-value为准
  • 3.map的value是可以相同的
  • 4.map的key-value是无序的
  • 5.make在映射中的说明:初始分配的创建取决于size,但产生的映射长度为0.size可以省略,这种情况下就会分配一个小的起始大小

map使用的方式

package main
import (
	"fmt"
)


func main() {
	//第一种方式,先声明再make
	var a map[string]string
	//在使用map,需要先make,make的作用就给map分配给map分配数据空间
	a = make(map[string]string)
	a["no1"] = "kunkun"
	a["no2"] = "kun"
	a["no3"] = "heizi"
	a["no1"] = "kun"
	fmt.Println(a)

	//第二种方式,声明就直接make
	cities := make(map[string]string)
	cities["no1"] = "changshang"
	cities["no2"] = "beijing"
	cities["no3"] = "shanghai"
	fmt.Println(cities)

	//第三种方式声明直接赋值
	heroes := map[string]string{
		"hero1" : "jingze", 
		"hero3" : "wang", 
		"hero2" : "kun", 
	}
	fmt.Println("heroes=", heroes)
}

/*
map[no1:kun no2:kun no3:heizi]
map[no1:changshang no2:beijing no3:shanghai]
heroes= map[hero1:jingze hero2:kun hero3:wang]
*/



map的增删改查操作

map的增加和更新

map[“key”] = value //如果可以还没有,就是增加,如果key存在就是修改

在这里插入图片描述

map的删除

  • delete(map,“key”),delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,不操作,但是也不会报错
  • 如果我们要删除map所有地key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除
  • 或者map=make(…),make一个新的,让原来的成为垃圾,被gc回收

在这里插入图片描述

map的查找

package main
import (
	"fmt"
)


func main() {
	cities := make(map[string]string)
	cities["no1"] = "changshang"
	cities["no2"] = "beijing"
	cities["no3"] = "shanghai"

	val, ok := cities["no1"]
	if ok{
		fmt.Println("找到了cities=", val)
	} else {
		fmt.Println("没有找到这个可以")
	}

}

//找到了cities= changshang

map的遍历

map的遍历使用for-range的结构遍历

package main
import (
	"fmt"
)


func main() {
	cities := make(map[string]string)
	cities["no1"] = "changshang"
	cities["no2"] = "beijing"
	cities["no3"] = "shanghai"

	for k, v := range cities{
		fmt.Printf("k=%v v=%v\n",k,v)
	}
}

/*
k=no1 v=changshang
k=no2 v=beijing
k=no3 v=shanghai
*/



map切片

基本介绍

切片 数据类型如果是map,我们称为slice of map,map切片,这样使用则map个数就可以动态变化了。

package main
import (
	"fmt"
)


func main() {
	var monsters []map[string]string
	monsters = make([]map[string]string, 2)
	if monsters[0] == nil{
		monsters[0] = make(map[string]string,2)
		monsters[0]["name"] = "kunkun"
		monsters[0]["age"] = "38"

	}
	if monsters[1] == nil{
		monsters[1] = make(map[string]string,2)
		monsters[1]["name"] = "kun"
		monsters[1]["age"] = "18"

	}

	//动态的增加monster
	//先定义一个monster信息
	newMonster := map[string]string{
		"name" : "heizi",
		"age" : "45",
	}
	monsters = append(monsters, newMonster)
	fmt.Println(monsters)
}

//[map[age:38 name:kunkun] map[age:18 name:kun] map[age:45 name:heizi]]



map排序

  • 1.golang中没有一个专门的方法针对map的key进行排序
  • 2.golang中的map默认时无序的没注意也不是按照添加的顺序存放的,每次遍历得到的输出结果可能不一样
  • 3.golang中的map排序,是先将key进行排序,然后根据key值遍历输出即可
package main
import (
	"fmt"
	"sort"
)


func main() {
	//map的排序
	map1 := make(map[int]int, 10)
	map1[10] = 100
	map1[1] = 13
	map1[4] = 56
	map1[8] = 90

	fmt.Println(map1)

	//如果按照map的key的顺序进行排序输出
	//1.先将map的key放入到切片中
	//2.对切片排序
	//3.遍历切片,然后按照key来输出map的值
	var keys []int
	for k, _ := range map1 {
		keys = append(keys, k)
	}
	//排序
	sort.Ints(keys)
	fmt.Println(keys)

	for _, k := range keys{
		fmt.Printf("map1[%v=%v \n", k, map1[k])
	}
}


/*
map[1:13 4:56 8:90 10:100]
[1 4 8 10]
map1[1=13
map1[4=56
map1[8=90
map1[10=100
*/


map的使用细节

  • 1.map是引用类型,遵守引用类型传递的机制,在一个函数接受map,修改后,会直接修改原来的map
  • 2.map的容量达到后,再想map增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对
  • 3.map的value也经常使用struct类型,(比前面value是一个map更好)比如value为Student结构体

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

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

相关文章

2023美赛ABCDEF思路汇总

注:以下每个题思路仅是个人所想所做,不代表他人。由于时间仓促完成这么多,难免有不足之处,还请谅解。 文章目录A题第一大问第二大问B题第一问第二问第三问C题第一问第二问第三问第四问D题第一问第二问第三问第四问第五问E题第一问…

#Paper Reading# Language Models are Unsupervised Multitask Learners

论文题目: Language Models are Unsupervised Multitask Learners 论文地址: https://life-extension.github.io/2020/05/27/GPT技术初探/language-models.pdf 论文发表于: OpenAI 2019 论文所属单位: OpenAI 论文大体内容: 本文主要提出了GPT-2(Gener…

Visual Studio 2022: 增加对虚幻引擎的支持

自 Visual Studio 2022 发布以来,我们一直专注于为游戏和大型项目开发人员提供一系列生产力和性能改进。今天,我们很高兴与大家分享下一组专门用来提高虚幻引擎开发效率的功能。我们听到并看到了来自你(我们的游戏开发人员)的大量…

Spring MVC之 一次请求响应的过程

Spring MVC 会创建两个容器,其中创建Root WebApplicationContext 后,调用其refresh()方法会触发刷新事件,完成 Spring IOC 初始化相关工作,会初始化各种 Spring Bean 到当前容器中我们先来了解一个请求是如何被 Spring MVC 处理的…

2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享 很多时候,我们都想将一些文件或文本传送给别人,或者跨端传递一些信息,但是我们又不…

自抗扰控制ADRC之三种微分跟踪器TD仿真分析

目录 前言 1 全程快速微分器 1.1仿真分析 1.2仿真模型 1.3仿真结果 1.4结论 2 Levant微分器 2.1仿真分析 2.2仿真模型 2.3仿真结果 3.非线性跟踪微分器——韩教授 3.1仿真分析 3.2小结 4.总结 前言 工程上信号的微分是难以得到的,所以本文采用微分器…

重磅 | 小O软件新品【鲸鱼地图】发布

千呼万唤始出来.......,小O系列软件又添新品【鲸鱼地图】!!! 2023年新年伊始,小O就投入到新品研发工作中,秉承“发现地理价值”理念,为用户提供更加好用、易用的地图软件产品,经过春…

【C语言】编程初学者入门训练(完结)

文章目录1. 实践出真知2. 我是大V3. 有容乃大4. 小飞机5. 缩短2进制6. 十六进制转十进制7. printf的返回值8. 成绩输入输出9. 学生基本信息输入输出10. 字符圣诞树11. ASCII码12. 出生日期输入输出13. 按照格式输入并交换输出14. 字符转ASCII码15. 计算表达式的值16. 计算带余除…

Java特性之设计模式【策略模式】

一、策略模式 概述 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略…

Matlab数学建模常用算法及论文插图绘制模板资源合集

最近有很多朋友咨询我关于Matlab论文插图绘制方面的问题。 问了一下,这些朋友中,除了写博士论文的,大部分都是要参加美赛的。 这让我突然想起,自己曾经为了水论文,购买过一批Matlab数学建模的资料。 想了想&#xf…

EMIF转AXI-Lite接口

最近想用DSP对FPGA里的IP进行配置,感觉没有什么特别好的办法。如果能像Zynq一样直接有能够配置外设的AXI-Lite接口就好了。EMIF是DSP的外部存储器访问接口,支持对存储器的同步或异步访问。在我现有的条件下,利用EMIF接口配置FPGA内部的寄存器…

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 一、竞赛时间 共计360分钟。 竞赛任务书内容 2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 A模块基础设施设置/安全加固(200分) A-1&…

如何安全存储企业文件?

信息时代的到来,企业文件的安全存储越来越被企业管理者看重。常见的企业文件存储是借用第三方工具,如企业网盘,这种方法性价比高,而且也比较安全,被各大企业所喜爱。市面上的企业网盘类工具不胜枚举,该如何…

O(1)调度器:Linux2.6版本的核心算法

上一章学习了O(n)调度器的设计,以及它的核心算法,其主要思路如下: O(n)调度器采用一个Runqueue运行队列来管理所有可运行的进程,在主调度schedule函数中选择一个优先级最高,也就是时间片最大的进程来运行,…

2019蓝桥杯真题完全二叉树的权值 C语言/C++

题目描述 给定一棵包含 N个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A_1, A_2, A_N,如下图所示: 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最…

力扣2241. 设计一个 ATM 机器

力扣上的一个中等难度的题,之所以写一篇博客记录下来,是因为貌似触发了力扣的彩蛋,第一次遇见,感觉挺有意义的。 题目如下: 一个 ATM 机器,存有 5 种面值的钞票:20 ,50 &#xff0c…

手把手教你使用gdb调试器

所谓调试,指的是对编好的程序用各种手段进进行查错和排非错的过程。进行这种查错处理时,下面将讲解如何使用gdb进行程序的调试。 gdb 简介 gdb是一个功能强大的调试工具,可以用来调试C程序或C程序。在使用这个工具进行程序调试时&#xff0…

nodejs学习-4:nodejs连接mongodb和相关操作

1. express生成器生成express模板 前提需要首先下载好:express-generator,命令如下(全局安装) npm install -g express-generator生成模板命令如下: express 项目名称 --viewejs // --view 参数表示前端界面使用的引擎,这里使用…

Java线程池运行原理,线程池源码解读【Java线程池学习二】

一、前奏 有了上一篇博文的学习,相信你对于线程池的使用这块已经不在存在什么问题了,日常开发和面试也都足够了。 线程池最优使用策略【Java线程池学习一】 但随着时间的推移在闲下来的时候我突然想,当任务进入了队列之后是怎么取出来的呢…

linux系统根文件系统构建

根文件系统构建 一、根文件系统简介 根文件系统是 Linux 内核启动以后挂载(mount)的第一个文件系统,从根文件系统中读取初始化脚本,比如 rcS,inittab 等。根文件系统和 Linux 内核是分开的,单独的 Linux 内核是没法正常工作的&a…