登录
首页 >  Golang >  Go问答

多通道数据的顺序接收方法

来源:stackoverflow

时间:2024-02-09 16:30:26 255浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《多通道数据的顺序接收方法》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我目前正在尝试使用 select 语句从两个通道接收数据。

select {
    case msg1 := <-ch1:
        // send to another channel
    case msg2 := <-ch2:
        // send to another channel
}

从上述两个通道接收到的数据格式如下。

type msg struct {
    msgId uint32
    data []byte
}

我想要的是将两个通道收到的msgmsgid进行比较,然后将msg按顺序发送到另一个通道。

实现我的目的的唯一方法就是使用sync.mutex来使用数据结构queue吗?

有没有办法将多个 goroutine 通过一个通道发送的数据按顺序发送回另一个通道?

编辑:只要顺序正确,来自两个通道的数据就会被排序。数据传输的顺序并不是完全混乱的。


正确答案


您可以构建一个排序算法来缓冲无序消息,如下所示:

// Buffer to keep out-of-order messages
buffer:=make(map[uint32]msg)
// id of the next expected message
nextExpected:=1 
for {
  select {
      case m:=<-ch1:
        buffer[m.id]=m
      case m:=<-ch2:
        buffer[m.id]=m
  }
  // If the next expected message is received, send it
  for {
     if m,ok:=buffer[nextExpected]; ok {
        result<-m
        delete(buffer,nextExpected)
        nextExpected++
     } else {
        break
     }
  }
}

今天关于《多通道数据的顺序接收方法》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>