亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有在Go中設計信號或事件API的首選方法?

有沒有在Go中設計信號或事件API的首選方法?

Go
一只斗牛犬 2021-05-04 17:57:57
我正在設計一個程序包,在該程序包中,我想基于觀察者模式提供API:也就是說,有些地方我想發出會觸發零個或多個感興趣方的信號。那些有興趣的各方不必一定要彼此了解。我知道我可以從頭開始實現這樣的API(例如,使用通道或回調函數的集合),但是我想知道是否存在構造此類API的首選方法。在我使用過的許多語言或框架中,已經存在構建這些API的標準方法,以使它們按用戶期望的方式運行:例如,g_signal_*基于glib的應用程序,事件和addEventListener()JavaScript DOM應用程序的功能,或用于。網。Go有類似的東西嗎?如果不是,是否還有其他方法可以構造這種在Go中更慣用的API?
查看完整描述

3 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

我要說的是,從某個通道接收的goroutine在某種程度上類似于觀察者。因此,在Go中公開事件的慣用方式是恕我直言,以從包(函數)返回通道。另一個觀察結果是,在Go程序中回調的使用不是太頻繁。原因之一也是強大者的存在select statement。

最后一點:有些人(我也是)將GoF模式視為Go反模式。


查看完整回答
反對 回復 2021-05-24
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

在幾個項目中,我需要一個“觀察者模式”類型的東西。 是最近項目中的可重用示例。

它有一個相應的測試,顯示了如何使用它。

基本理論是,Submit每當發生一些有趣的事件時,事件發射器都會調用一些數據。任何想要知道該事件的客戶端都將Register通過其讀取事件數據的通道。您注冊的該通道可以select循環使用,也可以直接讀?。ɑ蚓彌_并輪詢)。

完成后,您Unregister。

它并非在所有情況下都是完美的(例如,對于慢速的觀察者,我可能想要強制注銷類型的事件),但是在我使用它的地方它可以工作。


查看完整回答
反對 回復 2021-05-24
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

Go為您提供了許多用于設計信號API的工具。

首先,您必須決定一些事情:

您要推還是拉模型?例如。發布者是將事件推送給訂閱者還是訂閱者從發布者中提取事件?

如果您想要一個推送系統,那么讓訂閱者為發布者提供一個發送消息的渠道就可以很好地工作。如果您要使用pull方法,那么僅一個帶有互斥量的消息框將起作用。除此之外,在不了解您的要求的情況下,很難提供更多細節。


查看完整回答
反對 回復 2021-05-24
  • 3 回答
  • 0 關注
  • 267 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號