As written above, if that's the main thread, it is guaranteed to freeze in a deadlock every time. I don't see a goroutine kicked off, so I'm assuming you're trying to run that on the main thread, and you will be 100%, always, forever stuck on the `case wch := <- ach {` line.
Channel reads are blocking, if there's nothing in the buffer. You might have omitted it for brevity, but so I read that as if it's on the main thread for the program. You want goroutines to block while awaiting a receivable channel, typically. If you're receiving on the main thread, you need to add a default case that will not block.. This is a good explanation of the issue:
https://golangbyexample.com/select-default-case-go/