I argue CSP is far superior to async/await in almost all cases. In Go errors are explicit and always right there. No weird control flow like you see in javascript.
Personally though I prefer either the actor model or structured concurrency to CSP, depending on the usecase.
I've been trying to convince the gleam folks of that without too much success so far...
If ok is false, the channel is closed and data is a zero value.
I like sync primitives and good old collections.
It gets overly verbose because of "simplicity"
You do need to use either two channels (horrible code) or some kind of Result{T,error} wrapper (bad language design).