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 关注
- 126 浏览
添加回答
举报