1. 程式人生 > >[Golang] 關於Sync.Map的使用

[Golang] 關於Sync.Map的使用

簡介:

sync.Map這個資料結構是執行緒安全的(基本型別Map結構體在併發讀寫時會panic嚴重錯誤),它填補了Map執行緒不安全的缺陷,不過最好只在需要的情況下使用。它一般用於併發模型中對同一類map結構體的讀寫,或其他適用於sync.Map的情況。

關於sync.Map的原始碼解析文章:Go 1.9 sync.Map揭祕

正文:

它主要五個方法及其功能簡介:

1、Store   存 key,value

2、LoadOrStore   取&存-具體看程式碼

3、Load   取key對應的value

4、Range   遍歷所有的key,value

5、Delete   刪除key,及其value

package main

import (
	"fmt"
	"sync"
)

func main() {
	var m sync.Map

	//Store
	m.Store(1,"a")
	m.Store(2,"b")

	//LoadOrStore
	//若key不存在,則存入key和value,返回false和輸入的value
	v,ok := m.LoadOrStore("1","aaa")
	fmt.Println(ok,v) //false aaa

	//若key已存在,則返回true和key對應的value,不會修改原來的value
	v,ok = m.LoadOrStore(1,"aaa")
	fmt.Println(ok,v) //false aaa

	//Load
	v,ok = m.Load(1)
	if ok{
		fmt.Println("it's an existing key,value is ",v)
	} else {
		fmt.Println("it's an unknown key")
	}

	//Range
	//遍歷sync.Map, 要求輸入一個func作為引數
	f := func(k, v interface{}) bool {
		//這個函式的入參、出參的型別都已經固定,不能修改
		//可以在函式體內編寫自己的程式碼,呼叫map中的k,v

			fmt.Println(k,v)
			return true
		}
	m.Range(f)

	//Delete
	m.Delete(1)
	fmt.Println(m.Load(1))

}

註明:此文章的簡介部分是我自己寫的,但是程式碼部分基本都是轉載而來,即本文屬於非原創型文章。

原文連結:CSDN-ChamPly-Go1.9 安全map用法