0X01
golang中,map(字典)無法並發讀寫
簡單來說,新建萬條線程對同一個map又讀又寫,會報錯。
為此,最好加鎖,其實性能影響並不明顯。
type taskCache struct{
sync.RWMutex
data map[string] interface{}
}
0X02
golang中,map(字典)為引用拷貝。
a = 字典一
b = a
實際上是直接將指針傳給了b。
於是,有一個讀取,寫的時候直接讀map並返回
func GetAllTasks() (result map[string]interface{}, err error) { // 獲得當前的所有任務 DEMO.RLock() defer DEMO.RUnlock() return DEMO.data, err }
而在線程中
// 接收后直接打印
fmt.Println(store.GetAllTasks())
結果居然報錯,map讀寫沖突。
於是,我返回去一遍一遍看代碼,覺得自己的讀寫鎖寫錯了。
調式折騰了半天,最后發現,在接收后不用 fmt.Println 打印就不會報錯。
這很不科學,然后在接收打印前后加上讀鎖,不報錯了。
0X03
所以golang,加了讀寫鎖的時候,要返回全部值,還不能直接返回這個字典,因為直接返回這個字典,返回了指針,操作的時候要不還要加讀寫鎖,要不就報錯。
還沒有直接的取地址的值重新給另一個變量的東西,自己寫個遍歷,一個一個賦值吧,蛋疼,坑貨,坑了一晚上
var cache = make(map[string]interface{}) for k,v := range Demo.data{ cache[k] = v }
