为了账号安全,请及时绑定邮箱和手机立即绑定

实现库回调

实现库回调

Go
一只斗牛犬 2022-06-13 15:28:54
我正在尝试在 Go 中实现一个客户端库。客户端应用程序将导入此库并使用其方法。一种这样的方法是为某个事件设置通知,如果该事件发生,则客户端应用程序应收到回调。我被困在如何从我的库中调用客户端应用程序功能的问题上。以下是我正在尝试做的事情的去游乐场链接。假设有一个包 main 是客户端应用程序,该应用程序使用包测试中的客户端库。主包:package main  import (    "fmt"    "test")func main() {    obj := test.New_data()    fmt.Println("This is main")    fmt.Println("Name is ", obj.Name)}func (dObj *(test.Write_data)) Callback() {    fmt.Println("This is callback function")    }封装测试:package test  import (    "fmt")type Write_data struct {    Name string}func New_data() *Write_data {    var obj Write_data    obj.Name = "Sample string"    fmt.Println("Name is", obj.Name)    obj.Callback()    return &obj}现在应用程序将定义一个需要由库调用的回调函数。有没有办法做到这一点?我所做的方式无法编译。
查看完整描述

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)

}

您可以将实现此接口的任何结构传递给库函数,或注册到通知接收器列表。


如果库异步生成这些事件,那么您可以使用通道将事件发回,但从您的描述来看,这似乎不是您所需要的。


查看完整回答
反对 回复 2022-06-13
?
慕运维8079593

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.

}

这是上面引用的相同文档中示例代码的略微修改版本。


可以在此处找到更简化的版本。


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信