前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2022年07月 Go教学课程 022-Go容器之字典

【愚公系列】2022年07月 Go教学课程 022-Go容器之字典

作者头像
愚公搬代码
发布2022-08-01 08:50:25
1840
发布2022-08-01 08:50:25
举报
文章被收录于专栏:历史专栏

文章目录


一、Go容器之字典

1.什么是字典

Go 中字典也叫做 map , map 是一种无序的键值对的集合,使用散列表(hash)实现。

2.字典的定义

代码语言:javascript
复制
var 变量名 [keyType]valueType
  • keyType 表示键类型。
  • valueType 表示键对应的值类型。

2.1 第一种使用方式make

代码语言:javascript
复制
package main

import "fmt"

func main() {
	// 定义一个键类型为字符串,值类型为整型的 map
	m := make(map[int]string)

	// 向 map 中添加一个键为 “1”,值为 愚公1号 的映射关系
	key := 1
	m[key] = "愚公1号"

	// 输出 map 中键为 “1” 对应的值
	fmt.Println(m[key])

	// 声明一个 ok 变量,用来接收对应键是否存在于 map 中
	value, ok := m[key]

	// 如果值不存在,则输出值
	if ok {
		fmt.Println(value)
	}
}
在这里插入图片描述
在这里插入图片描述

2.2 第二种使用方式{}

代码语言:javascript
复制
package main

import "fmt"

func main() {
	// 定义一个键类型为字符串,值类型为整型的 map
	m := map[int](string){
		1: "愚公1号",
		2: "愚公2号",
		3: "愚公3号",
	}

	// 输出 map 中键为 “1” 对应的值
	fmt.Println(m[1])

	// 声明一个 ok 变量,用来接收对应键是否存在于 map 中
	value, ok := m[2]

	// 如果值不存在,则输出值
	if ok {
		fmt.Println(value)
	}
}
在这里插入图片描述
在这里插入图片描述

上面的这段代码并没有使用 make(), 而是通过大括号的方式来初始化字典 map, 有点像 JSON 格式一样,冒号左边的是键(key) , 右边的是值(value) ,键值对之间使用逗号分隔。

二、字典的遍历

代码语言:javascript
复制
package main

import "fmt"

func main() {
	m := map[int](string){
		1: "愚公1号",
		2: "愚公2号",
		3: "愚公3号",
	}

	// 通过 for range 遍历, 获取 key, value 值并打印
	for key, value := range m {
		fmt.Printf("key: %d, value: %s\n", key, value)
	}
}
在这里插入图片描述
在这里插入图片描述

注意: 字典 map 是一种无序的数据结构,输出是不按顺序是随机的。

三、字典的键值对删除

代码语言:javascript
复制
delete(map, 键)
  • map 表示要删除的目标 map 对象。
  • 键表示要删除的 map 中 key 键。

相关案例:

代码语言:javascript
复制
package main

import "fmt"

func main() {
	m := map[int](string){
		1: "愚公1号",
		2: "愚公2号",
		3: "愚公3号",
	}

	// 删除 map 中键为 1 的键值对
	delete(m, 1)

	// 通过 for range 遍历, 获取 key, value 值并打印
	for key, value := range m {
		fmt.Println(key, value)
	}
}
在这里插入图片描述
在这里插入图片描述

四、异步sync.Map

1.map的并发问题

Go的字典只读是线程安全的,同时读写是线程不安全的。

代码语言:javascript
复制
package main

func main()  {
	// 初始化一个键为整型,值也为整型的 map
	m := make(map[int]int)

	// 开启一段并发代码
	go func() {
		// 无限循环往 map 里写值
		for {
			m[1] = 1
		}
	}()

	// 开启一段并发代码
	go func() {
		// 无限循环读取 map 数据
		for {
			_ = m[1]
		}
	}()

	// 死循环,让上面的并发代码在后台执行
	for {
	}
}
在这里插入图片描述
在这里插入图片描述

因为并发的对 map 进行读写。两个并发函数不断的对 map 进行读写发生了竞态问题。map 内部会对这种并发操作进行检查并提前发现。

2.sync.Map的使用

代码语言:javascript
复制
package main

import (
	"fmt"
	"sync"
)

func main() {
	var m sync.Map

	// 添加一些键值对到 map 中
	m.Store(1, "愚公1号")
	m.Store(2, "愚公2号")
	m.Store(3, "愚公3号")

	// 从 sync.Map 中获取键为 2 的值
	fmt.Println(m.Load(2))

	// 删除键值对
	m.Delete(1)

	// 遍历 sync.Map 中的键值对
	m.Range(func(key, value interface{}) bool {
		fmt.Printf("key: %d, value: %s\n", key, value)
		return true
	})
}
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/07/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、Go容器之字典
    • 1.什么是字典
      • 2.字典的定义
        • 2.1 第一种使用方式make
        • 2.2 第二种使用方式{}
    • 二、字典的遍历
    • 三、字典的键值对删除
    • 四、异步sync.Map
      • 1.map的并发问题
        • 2.sync.Map的使用
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档