当前位置:网站首页>【Yugong Series】July 2022 Go Teaching Course 022-Dictionary of Go Containers
【Yugong Series】July 2022 Go Teaching Course 022-Dictionary of Go Containers
2022-07-31 16:39:00 【Huawei cloud】
一、Go容器之字典
1.什么是字典
Go 中字典也叫做 map , map 是一种无序的键值对的集合,使用散列表(hash)实现.
2.字典的定义
var 变量名 [keyType]valueType- keyType 表示键类型.
- valueType 表示键对应的值类型.
2.1 第一种使用方式make
package mainimport "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 第二种使用方式{}
package mainimport "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) ,键值对之间使用逗号分隔.
二、字典的遍历
package mainimport "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 是一种无序的数据结构,输出是不按顺序是随机的.
三、字典的键值对删除
delete(map, 键)- map 表示要删除的目标 map 对象.
- 键表示要删除的 map 中 key 键.
相关案例:
package mainimport "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的字典只读是线程安全的,同时读写是线程不安全的.
package mainfunc 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的使用
package mainimport ( "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年必读的12本机器学习书籍推荐
- ML.NET related resources
- Dialogue with Zhuang Biaowei: The first lesson of open source
- 【luogu P8326】Fliper(图论)(构造)(欧拉回路)
- What is the difference between BI software in the domestic market?
- 【网络通信三】研华网关Modbus服务设置
- 牛客 HJ18 识别有效的IP地址和掩码并进行分类统计
- 多主复制下处理写冲突(4)-多主复制拓扑
- 最新神作!阿里巴巴刚出炉的面试参考指南(泰山版),我直接狂刷29天
- 阿里三面:MQ 消息丢失、重复、积压问题,如何解决?
猜你喜欢

基于ABP实现DDD

基于Redis(SETNX)实现分布式锁,案例:解决高并发下的订单超卖,秒杀

【C语言】LeetCode27.移除元素

2022年必读的12本机器学习书籍推荐

全新宝马3系上市,安全、舒适一个不落

The 2nd China PWA Developer Day

智能垃圾桶(九)——震动传感器(树莓派pico实现)

Graham's Scan method for solving convex hull problems

深度学习机器学习理论及应用实战-必备知识点整理分享

Intelligent bin (9) - vibration sensor (raspberries pie pico implementation)
随机推荐
ML.NET related resources
【网络通信三】研华网关Modbus服务设置
Flutter gets the height of the status bar statusbar
i.MX6ULL驱动开发 | 33 - NXP原厂网络设备驱动浅读(LAN8720 PHY)
网站漏洞修复服务商关于越权漏洞分析
Applicable Scenarios of Multi-Master Replication (1) - Multi-IDC
基于ABP实现DDD
无主复制系统(1)-节点故障时写DB
Premiere Pro 2022 for (pr 2022)v22.5.0
智能垃圾桶(八)——红外对管传感器(树莓派pico)
联邦学习:联邦场景下的多源知识图谱嵌入
LeetCode_733_Image rendering
研发过程中的文档管理与工具
The arm button controls the flashing of the led light (embedded button experiment report)
LevelSequence源码分析
使用互相关进行音频对齐
ansible学习笔记02
华为顶级工程师历时9年总结的“趣谈网络协议”PDF文档,太强了
百度网盘网页版加速播放(有可用的网站吗)
Snake Project (Simple)