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

简介: 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更具有优势(执行效率高),涉及到并发安全问题,在叙述并发的时候还会详细介绍,对于集合使用方法大家了解这些即可。

相关文章
|
11月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
567 2
|
11月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
491 2
|
12月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
348 4
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
754 1
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
699 0
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
534 0
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
570 0
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
1626 0
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。