Golang中map基础

news2025/1/30 16:30:13

目录

map类型

声明和初始化

元素操作

大小和容量

并发问题

实现原理

注意


map类型

Go语言中的map类型是一种key-value(键值对)结构,用于存储一组无序的数据,其中键是唯一的,值可以相同或者不同。在Go语言的程序开发中,map使用广泛,尤其是用于缓存、关联数据等场景下。

声明和初始化

声明和初始化map的方式有三种:

(1)声明变量后使用make函数创建map

var m map[string]int  // 声明一个map变量m
m = make(map[string]int)  // 使用make函数创建一个map对象

(2)使用字面量方式创建map

m := map[string]int{
    "apple": 1, 
    "banana": 2,
}

(3)使用make函数创建map并同时初始化

m := make(map[string]int, 10)  // 初始化容量为10的map

元素操作

map中的元素是键值对(key-value)的形式存储的,其中键必须是支持==比较运算符的类型,如string、数字类型、char等;值可以是任意类型。map中常用的元素操作有:

(1)添加或修改元素

m["peach"] = 3  // 添加单个元素
m["banana"] = 4  // 修改单个元素

(2)删除元素

delete(m, "banana")  // 删除单个元素

(3)获取元素及判断元素是否存在

v, ok := m["peach"]  // 获取单个元素
if ok {
    fmt.Println(v)
}
// 或者使用下面的方式判断元素是否存在
if _, ok := m["banana"]; ok {
    fmt.Println("banana is exist")
}

(4)遍历map中的所有元素

for k, v := range m {
    fmt.Printf("%s -> %d\n", k, v)
}

(5)清空map

for k := range m {
    delete(m, k)
}

大小和容量

map的长度(长度表示map元素的个数),可以通过len()函数获得

length := len(m)

map的容量(容量表示map底层的哈希表容量),不能改变,只能通过make函数初始化时设置容量

m := make(map[string]int, 16) // 初始化容量为16的map

并发问题

map不是线程安全的,多个goroutine同时对同一个map进行读写操作,会产生竞态条件,导致程序运行异常。

解决map的并发问题,可以使用sync包提供的锁机制进行同步,例如:

import "sync"

var mu sync.Mutex  // 创建一个互斥锁

// goroutine1
mu.Lock()  // 上锁
m["apple"] = 1
mu.Unlock()  // 解锁

// goroutine2
mu.Lock()  // 上锁
v, _ := m["apple"]
fmt.Println(v)
mu.Unlock()  // 解锁

实现原理

map底层是基于哈希表实现的,map使用哈希表来存储键值对,通过哈希函数将键映射为哈希值,用哈希值作为数组的下标,将值储存在以哈希值为下标的数组槽中。但是,哈希函数并不是绝对可靠的,如果两个不同的键映射为同一个哈希值,这个情况被称为哈希冲突。

解决哈希冲突一般有以下两种方法:

(1)链表法

将哈希值相同的键值对附加到同一个链表上,这个链表通常被称为buckets。当键值对数量较少时,链表法是一种非常有效的解决哈希冲突的方法。

(2)开放地址法

开放地址法有三种常见的实现方式:线性探测法、二次探测法和双重散列法。开放地址法的主要思想是:当出现冲突时,顺序,直到找到一个空闲的槽位为止。

注意

  • Map的元素遍历顺序:Map的元素遍历顺序是随机的,不保证元素的顺序

  • Map的key类型:Map的key可以是任意可比较类型,如整数、浮点数、字符串、数组、结构体等,但不可以是切片、函数、Map等不可比较类型

  • Map的value类型:Map的value可以是任意类型,包括切片、函数、Map等复杂类型。

  • Map的值传递:Map在函数参数传递时是按引用传递的,即修改传入的Map会对原Map产生影响。

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

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

相关文章

button 设置外观

导入图片 设置拉伸 设置按钮的FlatStyle属性为Flat 设置透明背景

先到先得先学,2023最新国内大厂最新Java面试八股文总结

“铜三铁四”接近尾声,身边被迫“毕业”或者主动在这个时间点跳槽的大佬基本该找到工作的都找到工作了,找不到的也大多数都已经躺平了(手动狗头),只剩一群“45度人”(卷不动,躺不平的人&#xf…

用于跨中心多边形分割的任务相关特征补充

文章目录 Task-Relevant Feature Replenishment for Cross-Centre Polyp Segmentation摘要本文方法Domain-Invariant Feature Decomposition (DIFD)Task-Relevant Feature ReplenishmentPolyp-Aware Adversarial Learning (PAAL)总损失函数 结果 Task-Relevant Feature Repleni…

AI翻译工具分享

LanguageX简介 冠军翻译引擎交互式翻译,为专业译者而生的新一代译者工具 自2017年神经网络机器翻译流行以来,“机器翻译替代人工翻译”的观点屡见不鲜。作为一个技术和语言背景结合的团队,LanguageX认为语言服务是高度复杂、需要创意的智力活动,并肩负着人类沟通的重要使命。La…

机器学习之k-means聚类二、啤酒聚类实现

文章目录 一、环境开发说明二、基于前篇理论实现1. 数据说明2. 具体实现流程a. 对数据进行标准化处理b. 使用手肘法进行K值得选择c. 算法实现,d.将聚类结果进行可视化e. 计算轮廓系数f. 轮廓系数可视化 三、 文中的完整代码四、不调包实现五、参考文献 一、环境开发…

MySQL-图形化界面工具 (下

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易&…

ip route 和 route 命令

ip route 属于 iproute2 工具包;route 属于 net-tools 工具包;目前 ip route 使用较为广泛; 两个工具包的介绍请见 “iproute2 和 net-tools 介绍” 文章。 ip route命令介绍 ip route命令用于管理静态路由表。 linux 系统中,可…

【GigaGAN论文精读】Scaling up GANs for Text-to-Image Synthesis

【GigaGAN论文精读】Scaling up GANs for Text-to-Image Synthesis 0、前言Abstract1. Introduction(图放在文末)2. Related Works2.1Text-to-image synthesis.2.2GAN-based image synthesis.2.3Super-resolution for large-scale text-to-image models.…

【Java|基础篇】面向对象三大特性之封装

文章目录 1.前言2.什么是封装3.如何更好的封装4.封装的好处5.总结 1.前言 面向对象有三个特性:封装,继承和多态,本文主要讲解封装. 封装是面向对象编程的基本原则之一,它可以提高程序的安全性、稳定性、可维护性和可扩展性,减少了代码的冗余&#xff0c…

【框架源码】Spring源码核心注解Conditional和应用

1.什么是Conditional注解 Conditional来源于spring-context包下的一个注解。通过Conditional配置一些条件判断,当所有条件都满足时,被该Conditional注解标注的目标才会被Spring处理。 例如根据当前环境、系统属性、配置文件等条件来决定是否注册某个Bea…

股票量价关系基础知识3

成交量变化的表现形式 成交量变化的表现形式主要有以下几种 一、缩量 一般界定当日成交量低于前一交易日成交量10%以上为缩量。 缩量往往发生在上升途中的回调末期、上涨末期以及股价下跌的中后期。一般下跌趋势中的缩量阶段,往往意味着股价仍未见底,不能…

服务攻防-中间件安全CVE复现IISApacheTomcatNginx漏洞复现

目录 一、导图 二、ISS漏洞 中间件介绍> 1、短文件 2、文件解析 3、HTTP.SYS 4、cve-2017-7269 三、Nignx漏洞 中间件介绍> 1、后缀解析漏洞 2、cve-2013-4547 3、cve-2021-23017 无 EXP 4、cve-2017-7529 意义不大 四、Apache漏洞 中间件介绍> 1、漏…

AcWing算法提高课-1.3.5买书

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 小明手里有n元钱全部用来买书&#xff0c;书的价格为10元&#xff0c;20元&#xff0c;50元&#xff0c;100元。 问小明有多少种买…

【Python--读写模式全解】

读写模式 读写模式语法读取写入追加 小结 读写模式 open() 函数常用形式是接收两个参数&#xff1a;文件名(file)和模式(mode)。 # 读写文件最好用 with...open...操作&#xff0c;这样最安全 # 而且还不需要关闭文件 with open(path,r)as f:f.read() # 一次读取整个文件&…

如何调用API数据接口来获取想要的数据

API&#xff08;Application Programming Interface&#xff09;是连接不同软件和服务的桥梁&#xff0c;允许不同的应用程序之间共享和交换数据。API接口被广泛应用于各种场景&#xff0c;如&#xff1a; 1.移动应用程序&#xff1a;许多移动应用程序使用API接口与服务器通信…

量子计算——新兴领域的前沿技术

随着人类社会文明的不断进步&#xff0c;计算技术也在不断发展。传统计算机在过去的几十年中快速发展&#xff0c;计算速度、存储能力等方面发生了天翻地覆的变化。但随着大数据、人工智能、区块链等新兴领域的迅速崛起&#xff0c;传统计算机的发展似乎面临了瓶颈。在这样的背…

花3个月面过京东测试岗,拿个25K不过分吧?

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在…

java简单接触

文章目录 常用的DOS命名计算机语言的发展史javajava的历史java的版本java的特性和优势JDK、JRE、JVMjava程序的运行机制 常用的DOS命名 # 盘符切换 C:\Users\Administrator>D: D:\> # 查看当前目录下的所有文件 dir # 切换目录 cd change screen # 返回上一级目录 cd ..…

FE_本地存储LocalStorage和SessionStorage

localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。他们均只能存储字符串类型的对象。localStorage生命周期是永久&#xff0c;这意味着除非用户主动在浏览器上清除localStorage信息&#xff0c;否则这些信息将永远存在。sessionStorage的失效时间为当前会话…

Wine运行器3.2.2——修复一些问题

不写太多啥了&#xff0c;详细介绍看这里就行&#xff1a;https://bbs.deepin.org/post/248098 更新内容 ※1. 修改源地址&#xff08;迁出 Gitlink&#xff09;&#xff1b; ※2. 修复非 X86 架构运行器主页面虚拟机工具禁用的问题&#xff1b; 3、部分组件支持选择最优源。 …