前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速掌握 Go 语言中的集合(map)

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

作者头像
机智的程序员小熊
发布2020-05-12 10:52:49
3130
发布2020-05-12 10:52:49
举报
文章被收录于专栏:技术面面观技术面面观

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

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

映射关系容器 map

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

这就是Gomap的定义格式。

代码语言:javascript
复制
map[keyType] valueType

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

代码语言:javascript
复制
panic: assignment to entry in nil map

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

代码语言:javascript
复制
var m map[string]string
m = make(map[string]string) 

当然,也可以这么写

代码语言:javascript
复制
m := make(map[string]string) 
使用

赋值

代码语言:javascript
复制
 m["name"] = "coding3min"
 m["sex"] = "man"

循环遍历

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

删除集合元素

代码语言:javascript
复制
 delete(m, "name")

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

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

代码语言:javascript
复制
 if value, ok := m[key]; ok {
  fmt.Println(key, "存在,值为:", value)
 } else {
  fmt.Println(key, " 不存在")
 }

map容器就到这里了。

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

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

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

代码语言:javascript
复制
 var scene sync.Map
 scene.Store("name", "coding3min")
 scene.Store("age", 11)

取值

代码语言:javascript
复制
v, ok := scene.Load("name")
 if ok {
  fmt.Println(v)
 }
 v, ok = scene.Load("age")
 if ok {
  fmt.Println(v)
 }

输出

代码语言:javascript
复制
coding3min
11

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

代码语言:javascript
复制
 scene.Delete("age")

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机智的程序员小熊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 映射关系容器 map
  • 使用
  • 能够在兵法环境中使用的map
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档