go语言容器(集合)、Map、sync.Map

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: go语言容器(集合)、Map、sync.Map

文章目录


前言


每一门语言都有容器,用于存储一系列具有相同特征的数据,一个容器内的数据往往由键、值对进行组合,今天带大家领略一下Go语言中的容器



一、Go语言中的容器分类


1.Map集合


语法概括:


先声明后初始化
  var 集合名 map[集合键类型] 集合值类型
  集合名=make(map[键类型]值类型)
直接进行初始化
  var name = map[string]string{"func": "123", "name": "66"}


底层实现:


集合底层用哈希表进行实现,所以集合中存取的数据是乱序的
  所以集合内一个键只能对应一个值不可以对应多个值,最新插入的会刷新旧的


迭代集合:


集合使用range进行迭代的时候,返回的值可以是一个k也可以是k,v会自动调整
  一个值进行接受返回的是k,两个值接受返回的是k,v


创建一个集合,并进行迭代、删除


代码如下(示例):


name := make(map[string]string)
  if name == nil {
    fmt.Println("none")
  }
  name["France"] = "巴黎"
  name["Italy"] = "罗马"
  name["Japan"] = "东京"
  name["India "] = "新德里"
  name["France"] = "y"
  //删除操作
  delete(name, "France")
  //迭代遍历
  for k, v := range name {
    fmt.Println("国家:", k, "首都:", name[k], v)
  }


2.sync.Map集合


语法概括:


var 变量名 sync.Map
  在sync.Map中数据以键值对的方式存储在interface{}类型中
• 1
• 2


增删改查操作:


  Store()//增(增加后,如果原来的键被占用,那么会将原来的进行覆盖)
  Delete()//删
  Load()//查(查到数据后会将返回对应的值与true,查不到返回nil与false)
  Range()//遍历所有数据,传回调函数进去
    使用Range()对图进行遍历的时候需要将回调函数传进去,可以是一个匿名函数
    Range函数源代码如下:


func (m *Map) Range(f func(key, value interface{}) bool) {
  read, _ := m.read.Load().(readOnly)
  if read.amended {
    m.mu.Lock()
    read, _ = m.read.Load().(readOnly)
    if read.amended {
      read = readOnly{m: m.dirty}
      m.read.Store(read)
      m.dirty = nil
      m.misses = 0
    }
    m.mu.Unlock()
  }
  for k, e := range read.m {
    v, ok := e.load()
    if !ok {
      continue
    }
    if !f(k, v) {
      break
    }
  }
}


所以传进去的函数要采用其参数指定的格式


实际操作代码如下(示例):


  //声明变量
  var test sync.Map
  //添加数据
  test.Store("France", "巴黎")
  test.Store("Italy", "罗马")
  test.Store("Italy", "罗罗")
  fmt.Println("----------查键为France的数据-------")
  fmt.Println(test.Load("France"))
  fmt.Println("--------删除前的数据-------")
  test.Range(func(k, v interface{}) bool {
    fmt.Println(k, "的首都是", v)
    return true
  })
  fmt.Println("----------删除后的数据--------------")
  test.Delete("Italy")
  test.Range(func(k, v interface{}) bool {
    fmt.Println(k, "的首都是", v)
    return true
  })
  /*
  打印结果:
    ----------查键为France的数据-------
    巴黎 true
    ----------删除前的数据-----------
    France 的首都是 巴黎
    Italy 的首都是 罗罗
    ----------删除后的数据--------------
    France 的首都是 巴黎
  */


特点:


并发安全,但执行效率不如Map




总结


两种集合在并发情况下sync.Map更具有优势(线程安全),在非并发情况下Map更具有优势(执行效率高),涉及到并发安全问题,在叙述并发的时候还会详细介绍,对于集合使用方法大家了解这些即可。

相关文章
|
9天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
45 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
29天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
39 7
|
29天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
29天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
101 71
|
28天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
105 67
|
3天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
29 13
|
29天前
|
存储 Go
go语言中映射
go语言中映射
36 11
|
30天前
|
Go 索引
go语言修改元素
go语言修改元素
31 6
|
7天前
|
监控 算法 安全
解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
19 0
|
20天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数