当前位置:网站首页>【愚公系列】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
})
}
边栏推荐
- Exam Questions Previous True Questions Wrong Bills [The Fourth Session] [Provincial Competition] [Group B]
- 外贸网站优化-外贸网站优化教程-外贸网站优化软件
- 文件 - 05 下载文件:根据文件Id下载文件
- 小实战项目之——吃货联盟订餐系统
- 科普 | “大姨太”ETH 和 “小姨太”ETC的爱恨情仇
- Analysis of the implementation principle and detailed knowledge of v-model syntactic sugar and how to make the components you develop support v-model
- LeetCode刷题——摆动序列#376#Medium
- 批量翻译软件免费【2022最新版】
- (border-box)盒子模型w3c、IE的区别
- 在 ASP.NET Core 应用程序启动时运行代码的 3 种方法
猜你喜欢
运行 npm 会弹出询问 “你要如何打开这个文件?“
【Go报错】go go.mod file not found in current directory or any parent directory 错误解决
Basic usage of Koa framework
2. (1) Chained storage of stack, operation of chain stack (illustration, comment, code)
LeetCode brush # 376 # Medium - swing sequence
数据库原理作业2 — JMU
Foreign trade website optimization - foreign trade website optimization tutorial - foreign trade website optimization software
【解决】mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止
Install and use uView
Redux state management
随机推荐
MySQL系列一:账号管理与引擎
文件 - 04 下载文件: 根据文件下载链接下载文件
Automatic translation software - batch batch automatic translation software recommendation
文件 - 05 下载文件:根据文件Id下载文件
文件 - 03 下载文件:根据文件id获取下载链接
外贸网站优化-外贸网站优化教程-外贸网站优化软件
文件 - 07 删除文件: 根据fileIds批量删除文件及文件信息
LeetCode brush # 376 # Medium - swing sequence
多进程全局变量失效、变量共享问题
gstreamer的caps event和new_segment event
iOS大厂面试查漏补缺
文件 - 02 上传文件:上传临时文件到服务器
双倍数据速率同步动态随机存储器(Double Data Rate Synchronous Dynamic Random Access Memory, DDR SDRAM)- 逻辑描述部分
tidyverse笔记——管道函数
剑指offer(一)
nohup原理
服务器和客户端信息的获取
Zotero | Zotero translator plugin update | Solve the problem that Baidu academic literature cannot be obtained
Core Tower Electronics won the championship in the Wuhu Division of the 11th China Innovation and Entrepreneurship Competition
【解决】mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止