专栏首页技术面面观快速掌握 Go 语言中的集合(map)

快速掌握 Go 语言中的集合(map)

我本来下午打算对新系统,好好研究下模块划分,但因为上一个版本提测,于是我改了一个下午的bug

现在是晚上 9 点钟我开始写这篇文章,给大家分析分析Go语言中的map

映射关系容器 map

Go语言提供的映射关系容器为 mapmap 使用散列表hash实现。查找复杂度为O(1),和数组一样,最坏的情况下为O(n),n为元素总数。

这就是Gomap的定义格式。

map[keyType] valueType

注意了,map 是一种引用类型,初值是nil,定义时必须用make来创建,否则会报错

panic: assignment to entry in nil map

必须要申请空间,所有的引用类型都要这么做

var m map[string]string
m = make(map[string]string) 

当然,也可以这么写

m := make(map[string]string) 

使用

赋值

 m["name"] = "coding3min"
 m["sex"] = "man"

循环遍历

for key := range m {
    // 原来不用Printf也可以完成拼接输出啊!
  fmt.Println("key:", key, ",value:", m[key]) 
}

删除集合元素

 delete(m, "name")

PS: 在取值的时候m[key],假如key不存在,不会报错,会返回value类型的默认值,比如int类型默认值为0

当然了,如果你想明确的知道元素是否存在,如下:

 if value, ok := m[key]; ok {
  fmt.Println(key, "存在,值为:", value)
 } else {
  fmt.Println(key, " 不存在")
 }

map容器就到这里了。

能够在兵法环境中使用的map

Go中的map在并发读的时候没问题,但是并发写就不行了(线程不安全),会发生竞态问题。

所以有一个叫sync.Map的封装数据结构供大家使用,简单用法如下:定义和存储

 var scene sync.Map
 scene.Store("name", "coding3min")
 scene.Store("age", 11)

取值

v, ok := scene.Load("name")
 if ok {
  fmt.Println(v)
 }
 v, ok = scene.Load("age")
 if ok {
  fmt.Println(v)
 }

输出

coding3min
11

删除和遍历,这里遍历就用到了函数当作参数传递匿名函数的知识。

 scene.Delete("age")

 scene.Range(func(key, value interface{}) bool {
  fmt.Println("key:",key,",value:",value)
  return true
 })

the end,今天的更新还没完,次条还有切片知识补充哦

本文分享自微信公众号 - 编程三分钟(coding3min),作者:老实耕耘的小熊

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么一定要学Go语言?

    Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。

    编程三分钟
  • 三分钟学 Go 语言——函数深度解析(中)

    上回函数深度解析给大家聊了一些函数的基本知识,不知道还有没有人记得,不记得赶紧回去复习!

    编程三分钟
  • 如何添加windows定时计划任务?

    “ 我们常常使用linux添加定时任务,windows也可以吗?答案是肯定的——编程三分钟”

    编程三分钟
  • iBinary C++STL模板库关联容器之map/multimap

    map容器跟以上的容器都不同,它是一个 表存储结构. 也就是存储表的一个结构. 存储的是 key-value的方式. 所以我们使用的需要执行key的方式,以...

    IBinary
  • 动软.net代码生成器 win2008 r2下无法连接oracle,以及vs2008模板丢失的解决

    一天之内遇到了二个奇怪的问题,人品值最近有所下降啊。 1、动软.Net代码生成器(就是园子里李天平的大作) 在win2008 r2下无法连接oracle数据库,...

    菩提树下的杨过
  • win10 UWP ListView

    如果发现 UWP ListView 横向没有滚动条,可以使用 ScrollViewer 添加

    林德熙
  • Javascript 闭包与变量

    JavaScript中的作用域链的机制引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的值。

    大道七哥
  • Java虚拟机--自定义类加载器

    贾博岩
  • DeepMind发布《星际争霸 II》深度学习环境 | 2分钟读论文

    来源 / Two Minute Papers 翻译 / 李傲 校对 / 叶俊贤 整理 / 雷锋字幕组 StarCraft II: A New Challenge...

    AI研习社
  • LeetCode 1395. 统计作战单位数(蛮力法)

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/count-number-of-teams 著作权归...

    Michael阿明

扫码关注云+社区

领取腾讯云代金券