2 回答

TA貢獻1804條經驗 獲得超8個贊
有幾種方法可以做到這一點:
使用回調函數:
func LibraryFunction(callback func(Event)) {
...
callback(event)
}
或者,將回調函數注冊到某種注冊表:
var callbacks []func(Event)
func AddNotificationCallback(f func(Event)) {
callbacks=append(callbacks,f)
}
func Notify(ev Event) {
for _,x:=range callbacks {
x(ev)
}
}
除了回調函數,你可以用接口做同樣的事情:
type Receiver interface {
EventHappened(Event)
}
您可以將實現此接口的任何結構傳遞給庫函數,或注冊到通知接收器列表。
如果庫異步生成這些事件,那么您可以使用通道將事件發回,但從您的描述來看,這似乎不是您所需要的。

TA貢獻1876條經驗 獲得超5個贊
在 Go 中,使用來自不同包的類型的接收器是不合法的;您提供的代碼將無法編譯。
相反,請考慮將回調函數從客戶端應用程序傳遞到庫。這是一種常見的模式。其使用示例之一是Google Cloud Pub/Sub Go 庫。簽名如下所示:
func (s *Subscription) Receive(ctx context.Context, f func(context.Context, *Message)) error
在這種情況下,只要在 上接收到新消息,該函數就會Receive()調用提供的回調函數,因此“客戶端應用程序”代碼如下所示:f*Subscription
ctx := context.Background()
client, err := pubsub.NewClient(ctx, "project-id")
if err != nil {
// TODO: Handle error.
}
sub := client.Subscription("subName")
callback := func(ctx context.Context, m *pubsub.Message) {
// TODO: Handle message.
m.Ack()
}
err = sub.Receive(ctx, callback)
if err != context.Canceled {
// TODO: Handle error.
}
這是上面引用的相同文檔中示例代碼的略微修改版本。
可以在此處找到更簡化的版本。
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報