当前位置:网站首页>【愚公系列】2022年07月 Go教学课程 022-Go容器之字典
【愚公系列】2022年07月 Go教学课程 022-Go容器之字典
2022-07-31 06:06:00 【愚公搬代码】
文章目录
一、Go容器之字典
1.什么是字典
Go 中字典也叫做 map , map 是一种无序的键值对的集合,使用散列表(hash)实现。
2.字典的定义
var 变量名 [keyType]valueType
- keyType 表示键类型。
- valueType 表示键对应的值类型。
2.1 第一种使用方式make
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 第二种使用方式{}
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) ,键值对之间使用逗号分隔。
二、字典的遍历
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 是一种无序的数据结构,输出是不按顺序是随机的。
三、字典的键值对删除
delete(map, 键)
- map 表示要删除的目标 map 对象。
- 键表示要删除的 map 中 key 键。
相关案例:
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的字典只读是线程安全的,同时读写是线程不安全的。
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的使用
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
})
}

边栏推荐
猜你喜欢

【 TA - frost Wolf _may - "one hundred plan" 】 art 2.3 hard surface

讲解实例+详细介绍@Resource与@Autowired注解的区别(全网最全)

DirectExchange switch simple introduction demo

芯塔电子斩获第十一届中国双创大赛芜湖赛区桂冠

简单谈谈Feign

Redux state management

Basic usage of Koa framework

【Go语言刷题篇】Go完结篇函数、结构体、接口、错误入门学习

从入门到一位合格的爬虫师,这几点很重要

Project exercise - memorandum (add, delete, modify, check)
随机推荐
Install the gstreamer development dependency library to the project sysroot directory
【云原生】-Docker容器迁移Oracle到MySQL
HuffmanTree
新瓶陈酒 --- 矩阵快速幂
拉格朗日插值及其应用
Web浏览器工作流程解析
文件 - 05 下载文件:根据文件Id下载文件
小实战项目之——吃货联盟订餐系统
我开发了一个利用 Bun 执行 .ts / .js 文件的 VS Code 插件
项目 - 如何根据最近30天、最近14天、最近7天、最近24小时、自定义时间范围查询MySQL中的数据?
Chapter 16: Constructing the Magic Square for Prime Numbers of Order n(5,7)
【Go语言入门教程】Go语言简介
js原型详解
nohup principle
解决win11/win10在登陆界面(解锁界面)点击获取每日壁纸无效的问题 - get Daily Lockscreen and Wallpaper - Win11/10的登录界面背景图片在哪里?
Kubernetes scheduling
【TA-霜狼_may-《百人计划》】美术2.3 硬表面基础
一文读懂 MongoDB 和 MySQL 的差异
Markdown中的数学符号
第十六章:构建n(5,7)阶素数幻方