Why can't you take a reference to a value stored by key in a map?
sobes.tech AI
Answer from AI
In Golang, a map is a hash table. Adding or removing elements can lead to changes in the internal structure of the map, including reallocation of memory and movement of elements. If you take a pointer to a value stored by key and then modify the map (for example, by adding or removing another element), this pointer may become invalid, pointing to incorrect memory or another value. Golang prevents this at compile time by disallowing taking the address of a map element.
Moreover, a map in Golang is not thread-safe. Directly changing a value through a pointer could lead to a race condition when accessed concurrently from different goroutines, complicating synchronization. The restriction on taking a pointer to a map value simplifies the concurrent access model and makes it clear that synchronization mechanisms (like sync.RWMutex) are necessary when working with maps in a multithreaded environment.
To change a value by key, you need to retrieve the value, modify it, and then store the modified value back into the map:
package main
import "fmt"
func main() {
m := map[string]int{"a": 1}
// Cannot take a pointer to a map value
// ptr := &m["a"] // Compilation error
// Correct way to modify the value:
value := m["a"] // Get the value
value++ // Modify the value
m["a"] = value // Store the modified value back
fmt.Println(m["a"]) // Will output 2
}