I don't think there's a hard-and-fast answer here. You can pass pointers to objects to avoid copying, so it's really a question of how you synchronize the per-socket goroutines with the summarising goroutine.
I can think of different ways of doing this depending on the exact requirements. One way would be to send them a message, they return a pointer to their object, and they pause until they are sent another message telling them it's OK to proceed.
Another way to avoid mutexes is to use a 1-deep buffered channel as a sort of 'holding area' for an object: push it into the channel when created, and when you need to use it, pop it out, use it, then push it back in when done. If you use a pointer to an object, or something which implicitly contains pointers (like a slice or a map) then this will be efficient.
I always point people to Bryan C. Mills excellent talk on "Rethinking Classical Concurrency Patterns":
It took me several views to get it, with lots of pauses to understand the code, but it was worth it.