学习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月前
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
50 4
|
2月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
47 7
|
2月前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
2月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
2月前
|
设计模式 测试技术 Go
学习Go语言
【10月更文挑战第25天】学习Go语言
33 4
|
4月前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
3月前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
128 0
|
4月前
|
Go
Golang语言之映射(map)快速入门篇
这篇文章是关于Go语言中映射(map)的快速入门教程,涵盖了map的定义、创建方式、基本操作如增删改查、遍历、嵌套map的使用以及相关练习题。
48 5
|
4月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
92 3
|
4月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
156 4
Golang语言之管道channel快速入门篇