{"id":50,"date":"2019-03-17T04:46:47","date_gmt":"2019-03-17T04:46:47","guid":{"rendered":"https:\/\/golangbyexamples.com\/?p=50"},"modified":"2019-11-13T16:11:15","modified_gmt":"2019-11-13T16:11:15","slug":"go-maps-concurrency","status":"publish","type":"post","link":"https:\/\/golangbyexamples.com\/go-maps-concurrency\/","title":{"rendered":"Golang Maps: Not safe for concurrent use"},"content":{"rendered":"\n
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. <\/p>\n\n\n\n
Buggy code:<\/strong> Below is buggy code. It might result in a crash if concurrent read and write of map happen.<\/p>\n\n\n\n Possible Output: fatal error: concurrent map read and map write<\/p>\n\n\n\n Correct Code:<\/strong><\/p>\n\n\n\n Output:<\/strong> Some Data<\/p>\n","protected":false},"excerpt":{"rendered":" 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…<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false},"categories":[1],"tags":[],"class_list":["post-50","post","type-post","status-publish","format-standard","hentry","category-tech"],"yoast_head":"\npackage main\n\nvar (\n allData = make(map[string]string)\n)\n\nfunc get(key string) string {\n\treturn allData[key]\n}\n\nfunc set(key string, value string) {\n\tallData[key] = value\n}\n\nfunc main() {\n\tgo set(\"a\", \"Some Data 1\")\n\tgo set(\"b\", \"Some Data 2\")\n\tgo get(\"a\")\n\tgo get(\"b\")\n\tgo get(\"a\")\n}\n<\/code><\/pre>\n\n\n\n
package main\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\nvar (\n\tallData = make(map[string]string)\n\trwm sync.RWMutex\n)\n\nfunc get(key string) string {\n\trwm.RLock()\n\tdefer rwm.RUnlock()\n\treturn allData[key]\n\n}\n\nfunc set(key string, value string) {\n\trwm.Lock()\n\tdefer rwm.Unlock()\n\tallData[key] = value\n\n}\n\nfunc main() {\n\tset(\"a\", \"Some Data\")\n\tresult := get(\"a\")\n\tfmt.Println(result)\n}\n<\/code><\/pre>\n\n\n\n