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.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):    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
      }
    }

After the change:    for {
      select {
      case <-myIO.ReadReady:
        buf := myPool.Get()
        myIO.Read(a)
      case b := <-myOtherChan:
        // ...
     }