在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...