当前位置:网站首页>【愚公系列】2022年07月 Go教学课程 022-Go容器之字典
【愚公系列】2022年07月 Go教学课程 022-Go容器之字典
2022-07-31 16:31:00 【华为云】
一、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 })}
边栏推荐
- 多主复制的适用场景(2)-需离线操作的客户端和协作编辑
- jeecg master-slave database read-write separation configuration "recommended collection"
- The 2nd China PWA Developer Day
- 多主复制的适用场景(1)-多IDC
- 动态规划之线性dp(上)
- adb shell 报错error: device unauthorized
- 复制延迟案例(3)-单调读
- ML.NET相关资源整理
- 动态规划之线性dp(下)
- After Grafana is installed, the web opens and reports an error
猜你喜欢

Graham‘s Scan法求解凸包问题

第二届中国PWA开发者日

研发过程中的文档管理与工具

Three aspects of Ali: How to solve the problem of MQ message loss, duplication and backlog?

gerrit中如何切换远程服务器

二分查找的细节坑

js的toString方法

After Effects 教程,如何在 After Effects 中调整过度曝光的快照?

Foreign media right, apple on May be true in inventory

基于Redis(SETNX)实现分布式锁,案例:解决高并发下的订单超卖,秒杀
随机推荐
npm安装时卡在sill idealTree buildDeps,npm安装速度慢,npm安装卡在一个地方不动
The arm button controls the flashing of the led light (embedded button experiment report)
牛客 HJ16 购物单
动态规划之线性dp(下)
使用 Postman 工具高效管理和测试 SAP ABAP OData 服务的试读版
2022年整理LeetCode最新刷题攻略分享(附中文详细题解)
Replication Latency Case (1) - Eventual Consistency
利用PHP开发具有注册、登陆、文件上传、发布动态功能的网站
.NET 20周年专访 - 张善友:.NET 技术是如何赋能并改变世界的
研发过程中的文档管理与工具
t-sne 数据可视化网络中的部分参数+
Summary of the implementation method of string inversion "recommended collection"
Delete the disk in good condition (recovery partition)
单细胞测序流程(单细胞rna测序)
字符指针赋值[通俗易懂]
mongo enters error
深度学习机器学习理论及应用实战-必备知识点整理分享
LeetCode_733_图像渲染
网站漏洞修复服务商关于越权漏洞分析
OPPO在FaaS领域的探索与思考