Golang Map类型

news2024/11/23 0:10:41

文章目录

  • Map介绍
  • Map的定义方式
  • Map的增删查改
    • 新增和修改Map元素
    • 查找Map元素
    • 删除Map元素
    • 遍历Map元素
  • Map元素排序
  • Map切片

Map介绍

Map介绍

  • 在Go中,map是哈希表的引用,是一种key-value数据结构。map类型写作map[K]V,其中K和V分别对应key和value的类型。
  • map中所有的key都是相同的类型,所有的value也是相同的类型,但key和value可以是不同的类型,value通常使用自定义类型。
  • map内部需要通过判断两个key是否相等以确保每个键的唯一性,因此key的数据类型必须是可比较,如果key是自定义类型,则要求自定义类型中的所有字段是可比较的。

map的示意图如下:

在这里插入图片描述

map中仅包含一个指向底层哈希表的指针,属于引用类型,当map类型变量进行赋值或传参时,本质就是将map中指向哈希表的指针的值进行拷贝,因此最终两个map变量底层指向的是同一个哈希表,其中一个变量对哈希表修改会影响到另一个map变量。如下:

在这里插入图片描述

Map的定义方式

方式一:make map

在定义map时,可以通过make创建指定初始容量的map。如下:

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	// 方式一:make map
	var m = make(map[string]string, 10)
	fmt.Printf("m = %v\n", m)                     // m = map[]
	fmt.Printf("m len = %v\n", len(m))            // m len = 0
	fmt.Printf("m size = %d\n", unsafe.Sizeof(m)) // m size = 8
}

说明一下:

  • map定义后需要先通过make函数分配内存空间,然后才能使用。make是Go中的内建函数,可以用于分配并初始化一个map,其第一个参数表示map的类型,第二个参数表示初始容量,第二个参数若省略则使用默认的初始容量。
  • 在调用make函数创建map时提供初始容量,以便底层哈希表开辟足够多的哈希桶,这样可以避免后续在插入键值对时哈希表的频繁扩容(重新哈希),从而提高性能。
  • 通过len函数可以获取map中键值对的数量,但无法通过cap函数获取map的容量,map底层的哈希表会自动扩容以适应需要存储的键值对数量。

方式二:指定具体的键值对

在定义map时,也可以直接指定具体的键值对。如下:

package main

import (
	"fmt"
)

func main() {
	// 方式二:指定具体的键值对
	var m = map[string]string{
		"四川省": "川",
		"陕西省": "陕",
		"广东省": "粤",
	}
	fmt.Printf("m = %v\n", m)          // m = map[四川省:川 广东省:粤 陕西省:陕]
	fmt.Printf("m len = %d\n", len(m)) // m len = 3
}

说明一下:

  • 通过指定具体键值对创建map时,Go运行时也会在底层创建对应的哈希表,并将指定的键值对插入到哈希表中。

Map的增删查改

新增和修改Map元素

新增和修改Map元素

Go中通过map名[key] = value的方式在map中新增和修改键值对。如下:

package main

import "fmt"

func main() {
	// 新增和修改Map元素
	var m = map[string]string{
		"四川省": "川",
		"陕西省": "陕",
		"广东省": "粤",
	}
	m["浙江省"] = "浙"                     // 新增
	m["四川省"] = "川~"                    // 修改
	fmt.Printf("m = %v\n", m)          // m = map[四川省:川~ 广东省:粤 浙江省:浙 陕西省:陕]
	fmt.Printf("m len = %d\n", len(m)) // m len = 4
}

说明一下:

  • map中各个键值对的key值不能重复,在以map名[key] = value的方式操作map中的键值对时,如果对应的key值不存在则视为向map中新增键值对,如果对应的key值存在则视为修改map中对应键值对的value。

查找Map元素

查找Map元素

Go中通过map名[key]的方式查找map中的元素。如下:

package main

import "fmt"

func main() {
	// 查找Map元素
	var m = map[string]string{
		"四川省": "川",
		"陕西省": "陕",
		"广东省": "粤",
	}
	var key = "四川省"
	value, ok := m[key] // 查找
	if !ok {
		fmt.Printf("没有key为%s的键值对\n", key)
	} else {
		fmt.Printf("%s的简称为%s\n", key, value) // 四川省的简称为川
	}
}

说明一下:

  • 通过map名[key]的方式访问map中的元素将会得到两个值,如果map中存在对应key值的键值对,那么第一个值则是与key对应的value,第二个值为true;如果map中不存在对应key值的键值对,那么第一个值将是value对应类型的默认值,第二个值为false。
  • 通过map名[key]的方式访问map中的元素时,可以根据得到的第二个值来判断map中是否存在对应key值的键值对,也可以选择只用一个变量来接收其返回值,相当于忽略了它的第二个返回值。

删除Map元素

删除Map元素

Go中通过delete函数删除map中指定key值的键值对。如下:

package main

import "fmt"

func main() {
	// 删除Map元素
	var m = map[string]string{
		"四川省": "川",
		"陕西省": "陕",
		"广东省": "粤",
	}
	delete(m, "广东省") // 删除
	fmt.Printf("m = %v\n", m) // m = map[四川省:川 陕西省:陕]
}

说明一下:

  • delete是Go中的内建函数,用于删除map中指定key值的键值对,如果map中不存在对应的键值对,则delete不进行任何操作。
  • Go中没有提供删除map中所有键值对的方法,如果希望删除map中所有的键值对,可以遍历map中的键值对并逐个进行删除,或者通过make函数重新为当前map分配内存空间,此时原先map底层的哈希表将由GC回收。

遍历Map元素

遍历Map元素

Go中通过for range循环的方式对map元素的遍历。如下:

package main

import "fmt"

func main() {
	// 遍历Map元素
	var m = map[string]string{
		"四川省": "川",
		"陕西省": "陕",
		"广东省": "粤",
	}
	// 遍历map元素
	for key, value := range m {
		fmt.Printf("<key:%s, value:%s>\n", key, value)
	}
}

说明一下:

  • 在for range循环中遍历map时,每次迭代会返回两个值,第一个是当前键值对的key,第二个是当前键值对的value,当遍历结束后会自动退出for range循环。
  • map中的键值对是无序的,每次遍历map得到的键值对序列都是不可预测的。

Map元素排序

Map元素排序

map中的元素是无序的,想要按照key值遍历键值对,可以采用以下方式:

  1. 获取map中所有键值对的key,得到keys序列。
  2. 根据需求对keys序列进行排序。
  3. 遍历keys序列,根据key值访问map中的键值对。

使用案例如下:

package main

import (
	"fmt"
	"sort"
)

func main() {
	// map元素排序
	var m = map[int]string{
		1: "周一",
		7: "周日",
		3: "周三",
		2: "周二",
		5: "周五",
		4: "周四",
		6: "周六",
	}
	// 1、获取map中所有的key
	var keys []int
	for key, _ := range m {
		keys = append(keys, key)
	}
	// 2、对所有的key进行排序
	sort.Ints(keys)
	// 3、遍历有序的key,根据key访问其value
	for _, key := range keys {
		fmt.Printf("<key:%d, value:%s>\n", key, m[key])
	}
}

运行程序后可以看到,输出的键值对信息是按key值排序的。如下:

在这里插入图片描述

说明一下:

  • Ints是sort包中的一个函数,用于对int类型的切片按升序进行排序。
  • sort包中还有对其他类型切片排序的函数,比如Float64s、Strings等。

Map切片

Map切片

如果一个切片中存储元素的数据类型是map,那么我们称之为map切片。如下:

package main

import "fmt"

func AddStudent(students []map[string]string,
	name string, gender string, class string) []map[string]string {
	var student = map[string]string{
		"name":   name,
		"gender": gender,
		"class":  class,
	}
	students = append(students, student)
	return students
}

func main() {
	// map切片
	var students []map[string]string
	students = AddStudent(students, "Alice", "female", "class 2")
	students = AddStudent(students, "Bob", "male", "class 1")
	for i := 0; i < len(students); i++ {
		fmt.Printf("第%d个学生的信息如下:\n", i+1)
		for key, value := range students[i] {
			fmt.Printf("\t%s: %s\n", key, value)
		}
	}
}

上述代码中定义了一个map切片,切片中的每一个map存储着一个学生的信息,我们通过AddStudent函数向map切片中添加了两个学生的信息,并通过遍历切片中的map输出了学生的信息。运行结果如下:

在这里插入图片描述

说明一下:

  • 通过append函数向切片末尾追加元素时,append函数会对切片进行检测,如果该切片底层没有引用任何数组(nil切片),那么会先给切片分配一个底层数组,然后再将元素追加到切片中。
  • 切片是引用类型,传参时采用引用的方式进行传递,函数内部的切片与原始切片底层引用的是同一个数组,函数内对切片的操作会影响到原始切片。但AddStudent函数在添加学生信息到切片后仍需要将追加后的切片返回,并在调用AddStudent函数的地方用原始切片接收返回值,目的是更新原始切片的长度字段和容量字段,否则在遍历切片中的学生信息时仍无法观察到添加的学生信息。

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

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

相关文章

深度学习之基于Tensorflow卷积神经网络智能体操健身系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着人们健康意识的提高和数字化技术的快速发展&#xff0c;智能健身系统逐渐成为健身领域的新趋势。…

为什么不建议在 Vue <style> 中使用 scoped?

前言 亲爱的小伙伴&#xff0c;你好&#xff01;我是 嘟老板。我们使用 Vue 开发页面时&#xff0c;经常需要在 <style> 标签下编写样式。不知你是否留意&#xff0c;在 <style> 标签下有一个属性经常出现 - scoped。你知道它起到什么作用吗&#xff1f;原理是怎样…

实现同一份数据的各种镜像

一个数据集通过某个轴&#xff08;通常是垂直或水平轴&#xff09;的镜像对称。这可以通过简单的数学运算来实现。 如果想要通过一块数据生成四份&#xff0c;可以通过以下步骤&#xff1a; 下面是一个简单的示例&#xff0c;展示了如何通过垂直轴&#xff08;左右对称&#…

瑞友天翼应用虚拟化系统SQL注入致远程代码执行漏洞复现

0x01 产品简介 瑞友天翼应用虚拟化系统是西安瑞友信息技术资讯有限公司研发的具有自主知识产权,基于服务器计算架构的应用虚拟化平台。它将用户各种应用软件集中部署在瑞友天翼服务器(群)上,客户端通过WEB即可快速安全的访问经服务器上授权的应用软件,实现集中应用、远程接…

普洱茶泡多少茶叶才算淡茶?

普洱茶淡茶一般放几克茶叶&#xff0c;品深茶官网根据多年专业研究与实践结果&#xff0c;制定了淡茶冲泡标准。在冲泡普洱茶淡茶时&#xff0c;茶叶的投放量是关键因素之一。淡茶冲泡标准旨在保持茶汤的清爽口感&#xff0c;同时充分展现普洱茶的独特风味。 根据《品深淡茶冲…

短视频账号矩阵系统saas、技术私有化开发--OEM贴牌加盟源码部署

短视频矩阵系统的SaaS&#xff08;Software as a Service&#xff09;授权方式独立开发涉及到多个技术层面的考虑&#xff0c;包括但不限于用户认证、授权机制、API访问控制、数据隔离等。以下是一些关键步骤和建议&#xff0c;帮助你开发一个成功的短视频矩阵系统SaaS授权方式…

【Linux】文件内容相关的命令,补充:管道符

1、查看文件内容 &#xff08;1-1&#xff09;查看文件内容&#xff1a;cat&#xff0c;tac&#xff0c;head&#xff0c;tail 查看文件内容cat 文件名查看文件内容并显示行号cat -n 文件名倒着查看文件内容&#xff08;从最后一行开始&#xff09;tac 文件名查看文件前10行…

中国3254座水库集水区特征(地形、土壤、地质、土地利用、气候、人为活动等)

中国3254座水库集水区特征数据集 中国3254座水库集水区特征&#xff08;地形、土壤、地质、土地利用、气候、人为活动等&#xff09;数据集 数据介绍 中国3254个水库共提供512个属性。这些属性是在水库上游集水区提供的&#xff0c;包含: 1&#xff09;两种类型的水库上游集水…

linux或ubuntu环境下需要自行安装vivado USB Program下载程序驱动

如果在linux或ubuntu环境下&#xff0c;不安装驱动是无法下载FPGA程序的。在linux或ubuntu环境下安装程序不要自动安装。 johnjohn-wang:~/vitis2021.2/Vivado/2021.2/data/xicom/cable_drivers/lin64/install_script/install_drivers$ sudo ./install_drivers

W801学习笔记二十一:英语背单词学习应用——上

英语背单词是比较常见的学习APP&#xff0c;参考唐诗宋词应用&#xff0c;本章做一个类似的应用。 一、单词数据清洗及格式转换 诗词数据的获取渠道很多&#xff0c;一般可以按照年级来分文件。如一到九年级&#xff0c;四六级&#xff0c;雅思等等。 1、先从网上某某地方下载…

数据结构学不会?数据结构可视化网站来了

目录 前言 图码网站 算法可视化 算法编辑器 数据结构全书 数据结构课程 总结 前言 数据结构与算法在计算机的学习中应该是许多小白最头疼的东西&#xff0c;明明听的时候那么容易&#xff0c;为什么转换成代码就那么抽象呢&#xff1f; 有没有一个网站可以数据结构与算…

Nginx从入门到精通速成

文章目录 一. **Nginx** **的简介**1.1 什么是 **nginx**1.2 正向代理1.3 反向代理1.4 **负载均衡**1.5 动静分离 二. **Nginx** **的安装**三. **Nginx** **的常用的命令**四. **Nginx** **的配置文件**五. **Nginx** **配置实例**反向代理实例**1**5.1 实现效果5.2 准备工作5…

领航法律科技,法大大多年深耕再获认可!

近日&#xff0c;“乘势破局 第八届新兴法律服务业高峰论坛”在上海隆重举行。作为国内领先的电子签厂商&#xff0c;法大大凭借在法律科技领域的多年深耕与沉淀&#xff0c;荣获“法律科技领航机构”称号。 据悉&#xff0c;新兴法律服务业高峰论坛作为国内首个聚焦“新兴法律…

Android版本依赖Version catalog

曾经我们使用config.gradle文件进行版本依赖配置&#xff0c;然后在project的build.gradle.kts中使用如下方式引入&#xff1a; apply(from "./config.gradle") 缺点&#xff1a;在project的module中引用无任何提示&#xff0c;无法跳转到指定引用 一、创建versio…

《QT实用小工具·五十九》随机图形验证码,带有一些可人的交互与动画

1、概述 源码放在文章末尾 该项目实现了可交互的动画验证码控件&#xff0c;趣味性十足&#xff1a; 字符变换动画 噪音动画 可拖动交互 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef CAPTCHAMOVABLELABEL_H #define CAPTCHAMOVABLELABEL…

物料厘不清?企业如何做好“物料管理”

物料包括原材料、半成品、成品、辅助用品以及生产过程中必然产生的边角余料、废料等。在制造企业中&#xff0c;各个部门的业务流程几乎都要用到物料&#xff1a; 销售和订单录入部门要通过物料确定客户定制产品的构形&#xff1b; 计划部门要根据物料来计划物料和能力的需求…

实验15 MVC

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握MVC的用法。 三、源代码以及执行结果截图&#xff1a; inputMenu.jsp&#xff1a; <% page contentType"text/html" %> <% page pageEncoding "utf-8" %> &…

Nessus 部署实验

一、下载安装https://www.tenable.com/downloads/nessus 安装好之后&#xff0c;Nessus会自动打开浏览器&#xff0c;进入到初始化选择安装界面&#xff0c;这里我们要选择 Managed Scanner 点击继续&#xff0c;下一步选择Tenable.sc 点击继续&#xff0c;设置用户名和密码 等…

SpringBoot3项目打包和运行

六、SpringBoot3项目打包和运行 6.1 添加打包插件 在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。如果不添加spring-boot-maven-plugin插件配置&#xff0c;使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找…

FL Studio20.9水果安装及切换修改中文语言教程

前言 喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;如果你们已经下载好了这款软件的话&#xff0c;小编今天在这里就为大家详细讲解下如何安装FL Studio软件&#xff0c;一起来学习吧&#xff01; 注意&#xff1a; &#xff0…