Golang基础--05--map

Golang Map 深度剖析:原理、实践与面试要点 嘿,小伙伴们!我是 k 哥。今天,咱们来聊聊 Map。在 Go 语言这个神奇的世界里,Map 这个有点神秘的数据结构一直都是开发者们特别关注的。你是不是在用 Map 的时候,对它里面咋工作的感到好奇?是不是碰到复杂操作的时候,特别想弄明白它背后的原理?别着急,今天这篇文章就带你走进 Go 语言 Map 那个神秘的世界,帮你一层一层揭开它的面纱!从底层的原理,到最佳实践,再到高频面试题的分析,这篇文章会从各个方面满足你的求知心。 阅读详情

目录

简介

  • 类似其他语言的哈希表或者字典,以key-value的形式存储数据
  • key必须支持==或者!=比较运算的类型,不能是函数,map或者slice(他们都不支持),但是value可以呀,嘿嘿
  • map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍(array,slice)

声明定义初始化

  • map支持使用make()创建,也可以用传统方式创建支持:=这种简写形式
  • make([keyType]valueType, cap),cap是容量,可省略
  • 超过容量会自动扩容,但是尽量使用合适的初始值
  • 使用len() 获取元素个数
  • 键值对不存在就自动添加,使用delete(map,key)删除某个键值对
func main(){
    var m map[int]string = map[int]string{}
    var mm map[int]string = make(map[int]string)
    mmm := make(map[int]string)
    m[1] = "ok"
    a := m[1]
    fmt.Println(m,a,mm,mmm)
    delete(m,1)
    fmt.Println(m,a)
}
/*
> Output:
command-line-arguments
map[1:ok] ok map[] map[]
map[] ok
*/

复杂map

func main(){
    var m map[int]map[int]string
    m = make(map[int]map[int]string)
    //这里记得里面的value对应的map也要初始化
    a, ok := m[2][1]
    if !ok {
        m[2] = make(map[int]string)
    }
    m[2][1]="GOOD"
    a,ok = m[2][1]
    fmt.Println(a, ok)
}
/*
> Output:
command-line-arguments
GOOD true
*/

map和slice的迭代操作

/*
    for i,v:=range slice/map{

    }*/
    //如果是slice : i是索引,int型,v是其对应的值的拷贝,对v的任何操作都不会影响slice
    //如果是map : i,v对应键值对,对v的任何操作都不会影响map
func main(){
    sm := make([]map[int]string, 5)
    for _, v := range sm {
        v = make(map[int]string, 1)
        v[1]="ok"
        fmt.Println(v)
    }
    fmt.Println(sm)
    for i := range sm {
        sm[i] = make(map[int]string, 1)
        sm[i][1] = "not ok"
        fmt.Println(sm[i])
    }
    fmt.Println(sm)
}
/*
> Output:
command-line-arguments
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
[map[] map[] map[] map[] map[]]
map[1:not ok]
map[1:not ok]
map[1:not ok]
map[1:not ok]
map[1:not ok]
[map[1:not ok] map[1:not ok] map[1:not ok] map[1:not ok] map[1:not ok]]
*/

利用slice对map进行间接排序

  • map是无序的
  • 引入包sort,使用sort.Ints()函数
func main(){
    m := map[int]string{1:"a",2:"b",3:"c",4:"d",5:"f",6:"g"}
    s := make([]int, len(m))
    i := 0
    for k,_ := range m {
        s[i] = k
        i++
    }
    sort.Ints(s)
    for _,v := range s {
        fmt.Println(m[v])
    }
    fmt.Println(s)
}
/*
> Output:
command-line-arguments
a
b
c
d
f
g
[1 2 3 4 5 6]
*/

例子:交换key和value

func main(){
    m := map[int]string{1:"a",2:"b",3:"c",4:"d",5:"f",6:"g"}
    mm := make(map[string]int,len(m))
    for k,v := range m {
        mm[v]=k
    }
    fmt.Println(m)
    fmt.Println(mm)
}
/*
> Output:
command-line-arguments
map[5:f 6:g 1:a 2:b 3:c 4:d]
map[f:5 g:6 a:1 b:2 c:3 d:4]
*/
深入理解 Go 语言并发 map 安全使用 介绍了 Go 语言内建的 map 类型,了解它的基本使用方法和使用陷阱,然后学习如何实现线程安全的 map 类型,最后介绍 Go 标准库中线程安全的 sync.Map 类型以及第三方库。。 阅读详情

相关推荐

(Golang) 牛客 在线编程 Go语言入门

本文为牛客的在线编程的GO语言入门题集的个人解析牛客网在线编程_语法篇_GO语言入门本人主语言C/C++ 来这边刷一下GO的入门语法题,这个题库很基础很入门真的就是纯考GO语法本文虽然是展示AC代码,但实际是为了记录GO的各种基础语法,便于以后遗忘了可以查看牛客的环境是版本:Go 1.14。

cuber-lotus的博客 2207

Golang基础_05-map

目录 目录 简介 复杂map map和slice的迭代操作 利用slice对map进行间接排序 例子:交换key和value 目录 @ 简介 类似其他语言的哈希表或者字典,以key-value的形式存储数据 key必须支持=...

156

NFT图片批量合成及稀有度计算工具

一、制作背景 -当前NFT作品制作的大多方式都是使用部件拼接的形式,然后从大量的可能性结果取优; 二、解决问题 拼接合成的组合数量十分巨大,手工合成费时费力; 合成中对各个部件的使用次数不容易控制,部位出现的概率对作品的稀有度及评分影响较大; 对于生成的作品各个部位的信息(包括来源和使用率)统计繁琐,不利于对作品的介绍中体现; 三、程序功能介绍 1、功能自定义部位稀有度批量合成NFT作品 步骤一:创建各个合成部件文件夹,将图片放到文件夹内 步骤二:软件上设置各个部件对于的图片文件夹及出现的概率 步骤二

Keeping111的博客 4638

GO_05:GO语言基础map与函数

1. map   1. 类似其它语言中的哈希表活着字典,以 key-value 形式存储数据   2. key 必须是支持 == 或 != 比较运算的类型,不可以是函数、map 或 slice   3. map 查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍   4. map使用 make() 创建,支持 := 这种简写方式   5. make([keyType]valueT...

weixin_30379531的博客 117

【实战指南】从零构建UNet多分类分割数据集:标注、转换与训练全流程

本文提供了一份从零构建UNet多分类分割数据集的完整实战指南。详细介绍了使用Labelme进行图像标注的核心技巧与规范,并通过Python脚本将标注结果转换为模型可用的VOC格式。最后,指导如何修改经典的PyTorch版UNet代码,以适配自定义数据集并进行训练与测试,帮助读者完成从数据准备到模型训练的全流程。

arduino9maker的博客 288

AppleAccount注册之生成sign

根据日志发现:签名来自于AuthKit的-[AKAppleIDServerResourceLoadDelegate signRequest:withCompletionHandler:]的一个block,这个库是放在共享缓存库里的,找到提前准备好的IDA文件,先去找主方法,根据分析IDA,最后找到了实际生成签名的方法:t1。,接受五个参数,context(之前讲的获取到的客户端证书),bytes(待加密的body字节),length(字节长度),以及两个接受结果的参数,直接进这个方法看,

2503_90751938的博客 1006

Go语言基础第05天(切片和map)

golang

qq_51685718的博客 224

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 854

GO语言基础-05-循环和语句-if语句(基本应用,错误处理,判断map的key是否存在)

1. if 语法 完整示例 2. if……else…… 语法 完整示例 3. 实际应用 3.1 错误处理 3.2 判断map的key是否存在

架构+开发+运维 469

别再只会插拔了!深入Linux内核,手把手调试USB热插拔中断(以高通平台为例)

本文深入探讨了Linux内核中USB热插拔中断的调试方法,特别针对高通平台提供了详细的实战指南。从硬件基础到内核机制,再到中断调试工具和常见问题排查,帮助开发者系统性地解决USB设备识别问题。通过监控中断状态、分析处理流程和高级调试技巧,提升USB热插拔的稳定性和性能。

weixin_29161785的博客 429

QMT vs Ptrade:量化交易新手如何根据需求选择券商系统(附实战案例)

本文对比了QMT和Ptrade两大券商量化交易系统的核心差异,帮助量化交易新手根据需求选择合适的平台。QMT适合技术面策略开发,执行效率高;Ptrade则提供全面的财务数据和复杂策略支持。通过实战案例,展示了如何结合两平台优势实现高效量化交易。

weixin_42683394的博客 527

golang 遍历map_为什么遍历 Go map 是无序的?

Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!有的小伙伴没留意过 Go map 输出顺序,以为它是稳定的有序的;有的小伙伴知道是无序的,但却不知道为什么?有的却理解错误?今天我们将通过本文,揭开 for range map 的 “神秘” 面纱,看看它内部实现到底是怎么样的,输出顺序到底是怎么样?01前言假设运行这段代码,输出结果是按顺序?还是无序输出呢?2019/04/0...

weixin_39851261的博客 1160

ROS2_control 对机器人控制(不完整,有时间再更新)

会提示安装好其他相应的东西# 本来应该还要有ros-humble-gz-ros2-control,但是直接安装提示定位不到ros2 control --help # 输出 Commands:list_controller_types 输出可用的控制器类型及其基类list_controllers 输出已加载控制器的列表、类型和状态list_hardware_components 输出可用硬件组件列表list_hardware_interfaces 输出可用命令和状态接口列表。

m0_52113469的博客 2468

golang之map并发访问

即定义一个新的结构体,为该结构体实现两个方法,在方法里使用sync包的Mutex或RWMutex来做加锁保证并发安全.(和缓存的做法很类似:先从缓存中取,如果没有则从数据库中读,读回来存入缓存,下次就可以从缓存中取到了。可以用sync.Mutex (互斥锁),或者sync.RWMutex(读写锁)来"重构"map,map 不是并发安全的数据结构,倘若存在并发读写行为,会抛出 fatal error.并发安全也称线程安全,如果在并发中出现了数据的丢失或错乱,就是并发不安全。Store为写,Load为读。

techdashen的博客 1789

【AI智能体】Coze 数据库从使用到实战操作详解

Coze 数据库使用到实战详解

congge 5914

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Go 学习笔记 05 | map 详解

Go 学习笔记 05 | map 详解

Wonz 676

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

2020-12-05:go中,map的扩容流程是什么?

福哥答案2020-12-05:答案来自此链接: 源码位于runtime/map.go文件中的hashGrow函数。 在向map中添加数据时,当达到某个条件,则会引发字典扩容。 扩容条件: 1.map中数据总个数/桶个数>6.5,引发翻倍扩容。mapassign中的overLoadFactor函数。 2.使用了太多的溢出桶时(溢出桶使用的太多会导致map处理速度降低)。mapassign中的tooManyOverflowBuckets函数。 B<=15,已使用的溢出桶个数>=2的B次方时,引

福大大架构师每日一题 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Golang Map介绍

存储基于key-value键值对模式,key不能重复,value可以重复;增、删、改、查时间复杂度为O(1);在go语言中,map底层采用hash表,用变种拉链法拉解决hash冲突;

weixin_69163469的博客 982

c++ map 修改value_Go 学习笔记 05 | map 详解

一、map 详解make 创建 map 类型的数据:package 输出:map[age:20 sex:男 username:张三]for range 循环遍历 map 类型的数据。map 类型数据的 curdpackage 输出:map[age:20 username:张三] map[age:20 username:李四] 20 true map[username:李四]map 和切片结合pac...

weixin_39750854的博客 1015

golang面试:golang基础语法(一)

最近忙于面试,就顺便把这个更新到blog上面方便随时查看,有些不对的请留意告知,内容大多数来源前辈的文章,因为当时做笔记也搞忘复制链接了,如果有知道的欢迎补充,我会补上链接。在初始化后长度是固定的,无法修改其长度。接口类型,是一种抽象的类型,它不会暴露它所代表的对象的内部值和对象支持的操作方法。数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。数组的长度是数组类型的一部分,所以[3]int 和 [4]int 是两种不同的数组类型。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 347

Go语言sync.Map

Go语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的。

无风的雨 3015

Golang-05运算符与map数据结构

golang的map这个数据结构我们经常使用,存储的是key-value的键值对。在C++/java当中叫做map,在Python中叫做dict。

凯歌响起的博客 270

map的扩容因子_【Golang】图解map

“来画一画map底层的哈希表,再看一看map是怎样扩容的吧!”01—map概览Go语言中map用来存储键值对,可以分别指定键和值的类型。var a map[string]stringmap类型的变量本质上是个指针,这些键值对实际上是通过哈希表来存储的。图:map结构概览为什么要用哈希表?能够存储键值对的数据结构有很多种,可以是数组,也可以是链表,但是能用不代表好用。如果每次查找一个键都...

weixin_36102776的博客 1883

qt怎么输出一个map里的所有键值_【Golang】图解map

“来画一画map底层的哈希表,再看一看map是怎样扩容的吧!”01—map概览Go语言中map用来存储键值对,可以分别指定键和值的类型。var a map[string]stringmap类型的变量本质上是个指针,这些键值对实际上是通过哈希表来存储的。图:map结构概览为什么要用哈希表?能够存储键值对的数据结构有很多种,可以是数组,也可以是链表,但是能用不代表好用。如果每次查找一个键都...

weixin_39770311的博客 648

【Go语言-Day 15】玩转 Go Map:从 for range 遍历到 delete 删除的终极指南

本文是 Go 语言学习系列的第 15 篇,将深入探讨 `map` 类型的进阶操作。继上一篇我们掌握了 `map` 的创建和基本增改查之后,本篇将聚焦于 `map` 的两大核心操作:如何安全地删除键值对,以及如何高效地遍历 `map`。我们将通过丰富的代码示例,详细解析 `delete()` 函数的使用、`for...range` 遍历的特性及其无序性原理。

吴师兄大模型的博客 1258

Golang数组、切片和map

数组 数组可以存放多个同一类型数据。数组也是一种数据类型,在Go中,数组是值类型。 初始化的四种方式 package main import "fmt" func main() { //四种初始化方式 var numArr01 [3]int = [3]int{1, 2, 3} fmt.Println("numArr01=", numArr01) var numArr02 = [3]int{1, 2, 3} fmt.Println("numArr02=", numArr0

qq_53267860的博客 1667
上一篇: Golang基础--04--切片slice
下一篇: Golang基础--06--函数function
ListentTome
码龄9年 3粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值