Lack of race condition for safety
“Go’s approach to concurrency can be summarized as “don’t communicate by sharing memory; share memory by communicating”. There are no restrictions on how go-routines access shared data, making race conditions possible. Specifically, unless a program explicitly synchronizes via channels or other means, writes from one go-routine might be partly, entirely, or not at all visible to another, often with no guarantees about ordering of writes. Furthermore, Go’s internal data structures like interface values, slice headers, hash tables, and string headers are not immune to race conditions, so type and memory safety can be violated in multi_threaded programs that modify shared instances of those types without synchronization. Instead of language support, safe concurrent programming thus relies on conventions; for example, Chisnall recommends an idiom called “aliases xor mutable”, meaning that passing a mutable value (or pointer) over a channel signals a transfer of ownership over the value to its receiver.