The other reason: things <i>inside</i> maps are often pointer types with mutable data. Even if access to the map is properly locked, if two threads take a pointer out of it and directly or indirectly keep a reference (for example, re-slicing a slice without copying it), then one can stomp on the data the other is reading.<p>The fixes for this are subtle and annoying. Either you have to lock around your data, make it somehow immutable, or force copying rather than referencing (by making it &quot;value&quot; data).<p>Go would really benefit from a port of Clojure&#x27;s data structures.