Any Go function can take a channel, return a channel, or use a channel (and spawn goroutines) internally, unbeknownst to the caller/callee. It may lead to some bad design decisions (code that must not be async may never be), but it won't get in your way when you least need a refactor.
The problem is futures (async/await) as a concept; JavaScript, Rust, etc all have the same problems.
Take CSP by contrast: https://en.wikipedia.org/wiki/Communicating_sequential_proce...
Any Go function can take a channel, return a channel, or use a channel (and spawn goroutines) internally, unbeknownst to the caller/callee. It may lead to some bad design decisions (code that must not be async may never be), but it won't get in your way when you least need a refactor.