学习golang(2) 初探:go map 基本使用

简介: 学习golang(2) 初探:go map 基本使用

什么是hash


hash表小栗子

hash表在数据结构中被称之为散列表hash在编程中用的非常多,可见之重要。

为什么很重要呢,我们来举个例子

加入我们有如下数据

image.png

假设要查询数据为26的元素,你会怎么查询呢?

最简单的是 直接从 10、1、2...26 查询 6次查到数据 26 对吧

那么还有没有什么查询方法呢? 有的,我们可以定义一个函数,接收数据,函数返回的是 (数据 % 10)

这样,我们直接调用 函数就可以直接得到数据了,hash表正是做这样的事情的。



hash 表定义


那么什么是hash表hash 表可以通过key来直接访问数据的数据结构,而我们上述定义的函数称之为 哈希函数哈希函数 可以理解为 将数据映射为一个表,我们直接访问表中的位置,从而直接访问数据。


例如如上例子

我们hash表

image.png

我们的 哈希函数num % 10,num为我们要查询的数,通过函数我们能够直接得到下标,从而得到数据是否存在。



hash map 解决冲突的几种方式


为什么会有hash冲突

借上述例子


image.png

我们再插入一个 11 ,我们使用 哈希函数 应该插在 key 为 1 的位置

image.png

我们发现,一个key对应多个值,我们到底应该判断哪个呢? 这个其实就是哈希冲突

如何避免hash冲突呢?



解决冲突方法


拉链法

我们可以给每个数组的value都定义一条链表,当遇到冲突的时候,直接新增一个节点就成了,例如,我们在上面的hash表中插入 11 , 若使用拉链法,我们得到的结果可以是这样的。

image.png

开放定址法


当hash冲突时,就去寻找离它最近的空的地址,有空的便存下,只要我们hash表足够大,我们就能够找到并且将数据存下。


其中这里又分为 线性探测 和 二次探测,就不多讲了

例如我们已经有如下hash表了


image.png

若我们再存入 22,按照哈希函数,它应当存在 key2的位置,但是改地址已经有值了,所以,它找一个离它最近的空间,比如 下标为3这个为空的,就可以放进来

image.png

若此时,我们插入13数据呢,同样的到底,它会找后面空的位置,即5


image.png

当查询的时候也一样,当查询不到的时候,顺着往后查找即可



建立公共溢出区

这种方法,先创建哈希表 和 公共溢出区表,先存hash表,若发生冲突了,则存公共溢出区区,查询亦然。



go map 语法


创建map

我们可以使用make或者直接定义map

image.png

我们如上使用了

map1 := map[int]int{}var map2 = make(map[int]int)创建了 map1map2

其中,map[key的类型]值的类型 ,这个需要指定才行

我们运行一下程序看看

使用: go run main.go

image.png


访问map

我们可以直接通过key来访问元素数据,例如,我们想求 map1[0]map2[1] 数据,我们可以这样写

image.png

我们执行一下,查看能否获取数据呢

image.png


遍历map

我们可以使用for k,v := range map 的形式来遍历map,例如,我们遍历一下 map1

image.png


注意,map是输出是无序的,我们尝试多输出几次

image.png


删除map元素

我们可以直接使用delete删除map元素,例如

image.png


我们尝试执行一下

image.png

可见,key: 1已经被删除了



判断map是否存在

我们可以使用 _ , ok := map1[key]

若存在,则oktrue,若不存在,okfalse

image.png

我们尝试下

image.png



map小实验


我们写个小程序,来做一下map的实验,该实验是统计文件单词的个数

例如,有如下文件

image.png


写起来不难,我们看看

image.png


我们尝试运行输出以下

image.png

若想要排序,直接使用sort即可(偷懒了偷懒了)

image.png



思考


关于go map就这样吧,本来想看看go map 底层的,结果我找了一下资料,也看了一部分源码,奈何自身强度不行,看不懂,只得暂时搁置,后面把go基础看完了,再回过头来看底层源码吧,加油,运维小学生。



相关文章
|
2月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
198 1
|
3月前
|
安全 Java 编译器
对比Java学习Go——基础理论篇
本章介绍了Java开发者学习Go语言的必要性。Go语言以简单、高效、并发为核心设计哲学,摒弃了传统的类继承和异常机制,采用组合、接口和多返回值错误处理,提升了代码清晰度与开发效率。Go直接编译为静态二进制文件,启动迅速、部署简便,其基于Goroutine和Channel的并发模型相较Java的线程与锁机制更轻量安全。此外,Go Modules简化了依赖管理,与Java的Maven/Gradle形成鲜明对比,提升了构建与部署效率。
|
2月前
|
存储 Java Go
【Golang】(3)条件判断与循环?切片和数组的关系?映射表与Map?三组关系傻傻分不清?本文带你了解基本的复杂类型与执行判断语句
在Go中,条件控制语句总共有三种if、switch、select。循环只有for,不过for可以充当while使用。如果想要了解这些知识点,初学者进入文章中来感受吧!
148 1
|
3月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
3月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
|
5月前
|
存储 人工智能 安全
深入理解 go sync.Map - 基本原理
本文介绍了 Go 语言中 `map` 在并发使用时的常见问题及其解决方案,重点对比了 `sync.Mutex`、`sync.RWMutex` 和 `sync.Map` 的性能差异及适用场景。文章指出,普通 `map` 不支持并发读写,容易引发错误;而 `sync.Map` 通过原子操作和优化设计,在某些场景下能显著提升性能。同时详细讲解了 `sync.Map` 的基本用法及其适合的应用环境,如读多写少或不同 goroutine 操作不同键的场景。
232 1
|
6月前
|
Go
学习 Go并发模型
本文通过一个简单例子,讲解如何将数组数据转换为其平方值,并将其分解为三个步骤:生产信息(`producer()`)、处理信息(`square()`)和消费信息(`main()`)。进一步介绍了 FAN-OUT 和 FAN-IN 模型的优化,展示了多 goroutine 并发读写通道的实现方式。FAN-OUT 是多个 goroutine 从同一通道读取数据,而 FAN-IN 是单个 goroutine 从多个通道读取数据。最后强调了优化 FAN 模式时需根据具体场景解决瓶颈问题,并推荐使用带缓冲的通道以提高性能。
学习 Go并发模型
|
7月前
|
存储 安全 Go
Map的遍历与判断键是否存在-《Go语言实战指南》
本文介绍了 Go 语言中对 `map` 的常见操作,包括遍历所有项和判断键是否存在。通过 `for range` 可以遍历 `map` 的键值对、仅键或仅值(需忽略键)。注意,`map` 遍历顺序是随机的。判断键是否存在时,使用双赋值语法 `value, ok := map[key]`,其中 `ok` 表示键是否存在。直接访问不存在的键会返回类型的零值,可能导致逻辑错误。掌握这些机制可更安全高效地处理键值对数据。
|
10月前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
11月前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
308 9

推荐镜像

更多