There are a couple of approaches.
One is to pass the entire response, regardless of success or error, down the channel, and let the receiver handle it. The receiver can tell if it’s a 2xx response and deal with it appropriately.
The other option is if it’s something that throws an exception, there’s the possibility of wrapping your code in a couple of macros that catch errors in the go block and rethrow them when you take from the channel. Here’s an example of that: http://martintrojer.github.io/clojure/2014/03/09/working-with-coreasync-exceptions-in-go-blocks/
I hope that helps.