Go裡面如何實現廣播?

2021-09-24 01:29:40 字數 2623 閱讀 7564

在go裡面,channel是一種非常關鍵、方便的通訊機制,但是通常我們想要將訊息傳遞給多個消費者可能需要建立多個通道。只要channel的某個訊息被某個消費者讀取了,那麼該值就會被移除,而其他消費者將不會再消費這個訊息。如果我們想實現廣播方式我們可能需要將訊息寫入n個channel。例如:

func

main()

wg.done()

}()go

func()

wg.done()

}() ch <-

1 ch <-

2close

(ch)

wg.wait()

}

執行結果:

b 1

a 2

或者是:

b 1

b 2

或者是:

a 2

b 1

或者是:

a 1 

a 2

package main

import

("fmt"

"sync"

)func

main()

wg.done()

}()go

func()

wg.done()

}()for i :=

0; i <

10; i++

close

(cha)

close

(chb)

wg.wait()

}

現在每個消費者接收到了每乙個訊息。我們對此並不滿意。現在我們必須跟要維護多個channel,如果我們想要動態新增或刪除消費者怎麼辦?讓我們看看第乙個中間改進。

package main

import

("fmt"

"sync"

)func

main()

close

(cha)

close

(chb)

wg.done()

}()go

func()

wg.done()

}()go

func()

wg.done()

}()for i :=

0; i <

10; i++

close

(chbroadcast)

wg.wait()

}

請注意區別?現在我們只需要將我們的值寫入乙個channel chbroadcast。這是我們的廣播channel。但現在讓動態新增和刪除消費者變得更複雜.下面進行了一次封裝,封裝之後消費者的新增和刪除就變得比較容易了。

type broadcastservice struct

// 建立乙個廣播服務

func

newbroadcastservice()

*broadcastservice

}// 這會建立乙個新消費者並返回乙個監聽通道

func

(bs *broadcastservice)

listener()

chan

int// 移除乙個消費者

func

(bs *broadcastservice)

removelistener

(ch chan

int)

func

(bs *broadcastservice)

addlistener

(ch chan

int)

} bs.chlisteners =

(bs.chlisteners, ch)

}func

(bs *broadcastservice)

removelistener

(ch chan

int)}}

func

(bs *broadcastservice)

run(

)chan

int// 將值**到所有的消費者channel

for_

, dstch :=

range bs.chlisteners

dstch <- v

}}}terminate:

//關閉所有的消費通道

for_

, dstch :=

range bs.chlisteners

close

(dstch)}}

()return bs.chbroadcast

}func

main()

wg.done()

}()go

func()

wg.done()

}()for i :=

0; i <

3; i++

bs.removelistener

(cha)

for i :=

3; i <

6; i++

close

(chbroadcast)

wg.wait()

}

原文:

Mac OS 裡面如何識別磁碟。

void hello disk dadiskref disk,void context void goodbye disk dadiskref disk,void context dadissenterref hello diskmount dadiskref disk,void context d...

C語言裡面如何輸入EOF

每次輸入乙個字元,然後輸出乙個字元 int main void return 0 結束的時候,要輸入eof,eof的值為 1 其中eof的輸入方法為 1 在windows下面,輸入ctrl z,然後輸入回車鍵 2 在linux下面,輸入ctrl d,然後輸入回車鍵。下面是自己寫的練習的例程,輸入一段...

list裡面如何用for迴圈if語句

原創是 yu cherish a list 1,2,3,4,5,6 new list x for x in a list print new list 1,2,3,4,5,6 但是a list和new list指向的不是同乙個列表,也就是說,new list建立了乙個新的列表 new list li...