Goroutines, Nonblocking I/O, and Memory Usage
This would be solved if the "select" keyword was also working on I/O objects. It could gain special io.ReadReady and io.WriteReady channels that return a boolean.<p>This would also simplify most of the code that tries to pull events from different sources, including I/O. Right now each I/O needs to be extracted in it's own goroutine (adding error handling makes it worse):<p><pre><code>    fromIO := make(chan []byte)
    go func() {
       for {
          buf := myPool.Get()
          myIO.Read(buf)
          fromIO <- buf
       }
    }()

    for {
      select {
      case a := <-fromIO:
        // do one thing
      case b := <-fromOtherChan:
        // something else
      }
    }
</code></pre>
After the change:<p><pre><code>    for {
      select {
      case <-myIO.ReadReady:
        buf := myPool.Get()
        myIO.Read(a)
      case b := <-myOtherChan:
        // ...
     }</code></pre>