網(wǎng)站首頁 編程語言 正文
Golang sync.Map 詳解
在 Golang 中,sync.Map 是一個(gè)并發(fā)安全的 Map 實(shí)現(xiàn),可以在多個(gè) Goroutine 中安全地讀寫 Map。本文將對(duì) sync.Map 進(jìn)行詳細(xì)的介紹,包括創(chuàng)建、初始化、添加元素、刪除元素、遍歷等操作,并提供相應(yīng)的示例代碼。
sync.Map 的創(chuàng)建和初始化
在 Golang 中,可以使用 sync.Map{} 字面量來創(chuàng)建一個(gè)空的 sync.Map。例如,以下是一個(gè)字符串到整數(shù)的 sync.Map 的創(chuàng)建和初始化示例:
// 創(chuàng)建一個(gè)字符串到整數(shù)的 sync.Map
var m sync.Map
// 初始化 sync.Map
m.Store("one", 1)
m.Store("two", 2)
m.Store("three", 3)
// 打印 sync.Map
m.Range(func(key, value interface{}) bool {
fmt.Printf("key: %s, value: %d\n", key, value)
return true
})
在上面的示例中,創(chuàng)建一個(gè)字符串到整數(shù)的 sync.Map,并使用 m.Store(key, value) 的方式來初始化 Map 中的元素。最后,使用 m.Range() 函數(shù)來遍歷 Map 中的元素,并打印每個(gè)元素的 key 和 value。
sync.Map 的添加元素
在 Golang 中,可以使用 m.Store(key, value) 的方式來添加元素到 sync.Map 中。例如,以下是一個(gè)字符串到整數(shù)的 sync.Map 的添加元素示例:
// 創(chuàng)建一個(gè)字符串到整數(shù)的 sync.Map
var m sync.Map
// 初始化 sync.Map
m.Store("one", 1)
m.Store("two", 2)
m.Store("three", 3)
// 在 sync.Map 中添加元素
m.Store("four", 4)
// 打印 sync.Map
m.Range(func(key, value interface{}) bool {
fmt.Printf("key: %s, value: %d\n", key, value)
return true
})
在上面的示例中,創(chuàng)建一個(gè)字符串到整數(shù)的 sync.Map,并使用 m.Store(key, value) 的方式來添加元素到 Map 中。然后使用 m.Store(key, value) 的方式在 Map 中添加一個(gè)元素。最后,使用 m.Range() 函數(shù)來遍歷 Map 中的元素,并打印每個(gè)元素的 key 和 value。
sync.Map 的刪除元素
在 Golang 中,可以使用 m.Delete(key) 函數(shù)來刪除 sync.Map 中的元素。例如,以下是一個(gè)字符串到整數(shù)的 sync.Map 的刪除元素示例:
// 創(chuàng)建一個(gè)字符串到整數(shù)的 sync.Map
var m sync.Map
// 初始化 sync.Map
m.Store("one", 1)
m.Store("two", 2)
m.Store("three", 3)
// 刪除 sync.Map 中的元素
m.Delete("two")
// 打印 sync.Map
m.Range(func(key, value interface{}) bool {
fmt.Printf("key: %s, value: %d\n", key, value)
return true
})
在上面的示例中,創(chuàng)建一個(gè)字符串到整數(shù)的 sync.Map,并使用 m.Store(key, value) 的方式來添加元素到 Map 中。然后使用 m.Delete(key) 函數(shù)刪除 Map 中的一個(gè)元素。最后,使用 m.Range() 函數(shù)來遍歷 Map 中的元素,并打印每個(gè)元素的 key 和 value。
sync.Map 的遍歷
在 Golang 中,可以使用 m.Range() 函數(shù)來遍歷 sync.Map 中的元素。例如,以下是一個(gè)字符串到整數(shù)的 sync.Map 的遍歷示例:
// 創(chuàng)建一個(gè)字符串到整數(shù)的 sync.Map
var m sync.Map
// 初始化 sync.Map
m.Store("one", 1)
m.Store("two", 2)
m.Store("three", 3)
// 遍歷 sync.Map 中的元素
m.Range(func(key, value interface{}) bool {
fmt.Printf("key: %s, value: %d\n", key, value)
return true
})
在上面的示例中,創(chuàng)建一個(gè)字符串到整數(shù)的 sync.Map,并使用 m.Store(key, value) 的方式來添加元素到 Map 中。然后使用 m.Range() 函數(shù)遍歷 Map 中的元素,并打印每個(gè)元素的 key 和 value。
總結(jié)
本文介紹了 Golang 中 sync.Map 的創(chuàng)建、初始化、添加元素、刪除元素和遍歷操作。相較普通的 Map,sync.Map 有以下幾個(gè)優(yōu)點(diǎn):
- 并發(fā)安全:在多個(gè) Goroutine 中讀寫 Map 時(shí),使用 sync.Map 可以避免數(shù)據(jù)競(jìng)爭(zhēng)的問題。
- 支持任意類型的 key 和 value:在傳統(tǒng)的 Map 中,key 和 value 必須是具體的類型,而 sync.Map 可以支持任意類型的 key 和 value。
- 自動(dòng)擴(kuò)容:在傳統(tǒng)的 Map 中,當(dāng) Map 中元素的數(shù)量超過了容量時(shí),需要手動(dòng)擴(kuò)容。而 sync.Map 會(huì)自動(dòng)擴(kuò)容,無需手動(dòng)干預(yù)。
需要注意的是,使用 sync.Map 時(shí)需要注意以下幾點(diǎn):
- sync.Map 中的元素是無序的。
- sync.Map 中的元素是以接口類型的形式存儲(chǔ)的,因此在讀取元素時(shí)需要進(jìn)行類型斷言。
- sync.Map 中的元素不支持 Range() 函數(shù)之外的并發(fā)訪問。
總之,sync.Map 是 Golang 中非常實(shí)用的并發(fā)安全的 Map 實(shí)現(xiàn),使用起來非常方便。希望本文可以幫助讀者更加深入地了解 Golang sync.Map 的使用和實(shí)現(xiàn)。
原文鏈接:https://blog.csdn.net/GeeCode/article/details/131446356
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2021-12-16 linux下wget命令的基本使用方法_Linux
- 2022-05-26 flutter底部彈出BottomSheet詳解_Android
- 2022-09-26 Pytorch模型訓(xùn)練和模型驗(yàn)證
- 2022-03-14 surface屏幕自動(dòng)調(diào)節(jié)亮度無法關(guān)閉
- 2022-06-13 Openstack各組件邏輯關(guān)系及運(yùn)行流程解析_OpenStack
- 2022-10-10 conda創(chuàng)建環(huán)境、安裝包、刪除環(huán)境步驟詳細(xì)記錄_python
- 2022-12-04 Android?MQTT與WebSocket協(xié)議詳細(xì)講解_Android
- 2022-09-19 django安裝xadmin及問題解決_python
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支