Go channel 数据聚合的实现示例

 更新时间:2026年04月23日 14:37:37   作者:Go_error  
本文主要介绍了使用协程将多个个输入channel的数据流聚合为一个输出channel的方案,通过创建一个通用函数,利用反射技术构造SelectCase切片,并传递给reflect.Select函数实现多channel数据流的聚合,感兴趣的可以了解一下

一个数据聚合模块的工作协程将多个数据流合为一个数据流(就是指有多个源 channel 输入、一个目的 channel 输出的情况)。

下面这个函数将任意数量的数据流合为一个。

e.g.

通过每个 goroutine 处理一个 channel 的方式来实现。

func Aggregator(chs ...<-chan any) <-chan any {
 out := make(chan any)
 var wg sync.WaitGroup
 for _, ch := range chs {
  wg.Add(1)
  ch := ch
  go func() {
   defer wg.Done()
   for v := range ch {
    out <- v
   }
  }()
 }
 go func() {
  wg.Wait()
  close(out)
 }()
 return out
}

e.g.

通过反射的方式来实现,主要就是构造出 SelectCase slice,然后传递给 reflect.Select 语句。

func AggregatorReflect(chs ...<-chan any) <-chan any {
 out := make(chan any)
 go func() {
  defer close(out)
  // 构造 SelectCase slice
  var cases []reflect.SelectCase
  for _, ch := range chs {
   cases = append(cases, reflect.SelectCase{
    Dir:  reflect.SelectRecv,
    Chan: reflect.ValueOf(ch),
   })
  }
  // 循环,从 cases 中选择一个可用的
  for len(cases) > 0 {
   i, v, ok := reflect.Select(cases)
   if !ok { // 此通道关闭并且它的缓冲队列中为空
    cases = append(cases[:i], cases[i+1:]...)
    continue
   }
   out <- v.Interface()
  }
 }()
 return out
}

到此这篇关于Go channel 数据聚合的实现示例的文章就介绍到这了,更多相关Go channel 数据聚合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang实现心跳机制的示例详解

    Golang实现心跳机制的示例详解

    这篇文章主要为大家详细介绍了Golang实现心跳机制的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-04-04
  • 解决老版本goland无法调试新版本go的问题

    解决老版本goland无法调试新版本go的问题

    这篇文章主要给大家介绍了如何解决老版本goland无法调试新版本go的问题,文中通过代码示例给大家讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • Golang绘制数列趋势图的操作步骤

    Golang绘制数列趋势图的操作步骤

    数列趋势图是用来表示数列中各项之间的变化趋势的图形,它可以帮助我们观察和分析数列的规律和特点,一般来说,数列趋势图可以分为两种类型:折线图和散点图,本文给大家介绍了Golang绘制数列趋势图的操作步骤,文中有详细的代码示例,需要的朋友可以参考下
    2024-04-04
  • Go中的闭包函数Closure示例详解

    Go中的闭包函数Closure示例详解

    闭包是Go语言中非常重要的一个概念,它允许函数访问和操作函数外部的词法作用域中的变量,下面这篇文章主要介绍了Go中闭包函数Closure的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-12-12
  • Go函数的使用示例教程

    Go函数的使用示例教程

    这篇文章主要介绍了Go函数的使用示例,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Go使用Google Gemini Pro API创建简单聊天机器人

    Go使用Google Gemini Pro API创建简单聊天机器人

    这篇文章主要为大家介绍了Go使用Google Gemini Pro API创建简单聊天机器人实现过程详解,本文将通过最新的gemini go sdk来实现命令行聊天机器人
    2023-12-12
  • Go语言学习之数组的用法详解

    Go语言学习之数组的用法详解

    数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标(或者叫索引)来访问元素。本文将通过示例详细讲解Go语言中数组的使用,需要的可以参考一下
    2022-04-04
  • Go语言操作金仓数据库的环境搭建与连接管理

    Go语言操作金仓数据库的环境搭建与连接管理

    这篇文章主要为大家详细介绍了使用Go语言开发数据采集服务时使用Gokb驱动连接金仓数据库的过程,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-05-05
  • go module构建项目的实现

    go module构建项目的实现

    本文主要介绍了go module构建项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go语言基础学习教程

    Go语言基础学习教程

    这篇文章主要介绍了Go语言基础知识,包括基本语法、语句、数组等的定义与用法,需要的朋友可以参考下
    2016-07-07

最新评论