In looking at Go and Erlang\'s approach to concurrency, I noticed that they both rely on message passing.
This approach obviously alleviates the need for complex loc
In Erlang, all values are immutable - so there's no need to copy a message when it's sent between processes, as it cannot be modified anyway.
In Go, message passing is by convention - there's nothing to prevent you sending someone a pointer over a channel, then modifying the data pointed to, only convention, so once again there's no need to copy the message.