Welcome To Golang By Example

Golang Maps: Not safe for concurrent use

If you are a golang web application developer, then you often might encounter a use case of storing some data in memory in a go map for frequent access. If that is the case with you then you need to be careful because go maps are not safe for concurrent use.

Buggy code: Below is buggy code. It might result in a crash if concurrent read and write of map happen.

package main

var (
   allData = make(map[string]string)
)

func get(key string) string {
	return allData[key]
}

func set(key string, value string) {
	allData[key] = value
}

func main() {
	go set("a", "Some Data 1")
	go set("b", "Some Data 2")
	go get("a")
	go get("b")
	go get("a")
}

Possible Output: fatal error: concurrent map read and map write

Correct Code:

package main

import (
	"fmt"
	"sync"
)

var (
	allData = make(map[string]string)
	rwm     sync.RWMutex
)

func get(key string) string {
	rwm.RLock()
	defer rwm.RUnlock()
	return allData[key]

}

func set(key string, value string) {
	rwm.Lock()
	defer rwm.Unlock()
	allData[key] = value

}

func main() {
	set("a", "Some Data")
	result := get("a")
	fmt.Println(result)
}

Output: Some Data