Is this inherent in Go's concurrency model or just a limitation of the standard library? Couldn't the standard library provide a function that takes a buffer pool as an argument instead of a buffer?
One could imagine a function that takes a set of net.Conns and returns the ones that are available for reading. You'd then pass those off to a goroutine for processing with blocking I/O as usual.