Regarding the example in your first point, you are still sending a reference `m` of the map. If you wanted to send an immutable type, you could declare the channel to only accept struct values (and not pointers to structs) and you'll get your desired behavior.
Here's a playground for reference:
https://play.golang.org/p/U2tYZVTtUf-