Go channel 數(shù)據(jù)聚合的實(shí)現(xiàn)示例
一個(gè)數(shù)據(jù)聚合模塊的工作協(xié)程將多個(gè)數(shù)據(jù)流合為一個(gè)數(shù)據(jù)流(就是指有多個(gè)源 channel 輸入、一個(gè)目的 channel 輸出的情況)。
下面這個(gè)函數(shù)將任意數(shù)量的數(shù)據(jù)流合為一個(gè)。
e.g.
通過(guò)每個(gè) goroutine 處理一個(gè) channel 的方式來(lái)實(shí)現(xiàn)。
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.
通過(guò)反射的方式來(lái)實(shí)現(xiàn),主要就是構(gòu)造出 SelectCase slice,然后傳遞給 reflect.Select 語(yǔ)句。
func?AggregatorReflect(chs?...<-chan?any)?<-chan?any?{
?out?:=?make(chan?any)
?go?func()?{
??defer?close(out)
??//?構(gòu)造?SelectCase?slice
??var?cases?[]reflect.SelectCase
??for?_,?ch?:=?range?chs?{
???cases?=?append(cases,?reflect.SelectCase{
????Dir:??reflect.SelectRecv,
????Chan:?reflect.ValueOf(ch),
???})
??}
??//?循環(huán),從?cases?中選擇一個(gè)可用的
??for?len(cases)?>?0?{
???i,?v,?ok?:=?reflect.Select(cases)
???if?!ok?{?//?此通道關(guān)閉并且它的緩沖隊(duì)列中為空
????cases?=?append(cases[:i],?cases[i+1:]...)
????continue
???}
???out?<-?v.Interface()
??}
?}()
?return?out
}到此這篇關(guān)于Go channel 數(shù)據(jù)聚合的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go channel 數(shù)據(jù)聚合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)心跳機(jī)制的示例詳解
這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)心跳機(jī)制的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-04-04
解決老版本goland無(wú)法調(diào)試新版本go的問(wèn)題
這篇文章主要給大家介紹了如何解決老版本goland無(wú)法調(diào)試新版本go的問(wèn)題,文中通過(guò)代碼示例給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11
Go使用Google?Gemini?Pro?API創(chuàng)建簡(jiǎn)單聊天機(jī)器人
這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡(jiǎn)單聊天機(jī)器人實(shí)現(xiàn)過(guò)程詳解,本文將通過(guò)最新的gemini?go?sdk來(lái)實(shí)現(xiàn)命令行聊天機(jī)器人2023-12-12
Go語(yǔ)言學(xué)習(xí)之?dāng)?shù)組的用法詳解
數(shù)組是相同數(shù)據(jù)類型的一組數(shù)據(jù)的集合,數(shù)組一旦定義長(zhǎng)度不能修改,數(shù)組可以通過(guò)下標(biāo)(或者叫索引)來(lái)訪問(wèn)元素。本文將通過(guò)示例詳細(xì)講解Go語(yǔ)言中數(shù)組的使用,需要的可以參考一下2022-04-04
Go語(yǔ)言操作金倉(cāng)數(shù)據(jù)庫(kù)的環(huán)境搭建與連接管理
這篇文章主要為大家詳細(xì)介紹了使用Go語(yǔ)言開發(fā)數(shù)據(jù)采集服務(wù)時(shí)使用Gokb驅(qū)動(dòng)連接金倉(cāng)數(shù)據(jù)庫(kù)的過(guò)程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-05-05
go module構(gòu)建項(xiàng)目的實(shí)現(xiàn)
本文主要介紹了go module構(gòu)建項(xiàng)目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

