我正在尝试读取一个恒定的数据流,如果接收数据流的调用花费的时间超过30秒,我需要超时并退出程序。我不确定如何在收到超时后退出go例程。

func ReceiveStreamMessages(strm Stream, msg chan<- []byte) error {
  d := make(chan []byte, 1)

  e := make(chan error)

  tm := time.After(30 * time.Second)

  go func() {
    for {
        //blocking call
        data, err := strm.Recv()
        if err != nil {
            e <- err
            return
        }
        select {
        case d <- data.Result:
        case <-tm:
            //exit out go routine
            return
         }
      }
  }()

  for {
    select {
    case message := <-d:
        msg <- message
    case err := <-e:
        return err
    case <-tm:
        return nil
    }
  }
}
select