The inversion
The default model for concurrent programming is shared memory plus locks: several threads reach the same data, and a mutex ensures one at a time.
That model is where the lesson Locks and Synchronization lives, and its difficulties are well known. Which lock protects which data is a convention nobody can check. Acquiring in inconsistent orders deadlocks. Forgetting one is a race. All of it is invisible in the types.
C. A. R. Hoare proposed the alternative in "Communicating Sequential Processes", Communications of the ACM, volume 21, issue 8, 1978, pages 666 to 677: treat input and output as basic primitives, and build programs as sequential processes that communicate by passing values rather than by sharing variables.
Go's proverb states the consequence: do not communicate by sharing memory; instead, share memory by communicating.
The inversion is the point. Under locks, data sits still and access is coordinated. Under channels, data moves, and only one goroutine holds it at a time. There is no shared state to protect, so the whole category of problems does not arise rather than being managed.

