实现库回调

我正在尝试在 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

}

现在应用程序将定义一个需要由库调用的回调函数。有没有办法做到这一点?我所做的方式无法编译。


一只斗牛犬
浏览 130回答 2
2回答

胡说叔叔

有几种方法可以做到这一点:使用回调函数: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)}您可以将实现此接口的任何结构传递给库函数,或注册到通知接收器列表。如果库异步生成这些事件,那么您可以使用通道将事件发回,但从您的描述来看,这似乎不是您所需要的。

慕运维8079593

在 Go 中,使用来自不同包的类型的接收器是不合法的;您提供的代码将无法编译。相反,请考虑将回调函数从客户端应用程序传递到库。这是一种常见的模式。其使用示例之一是Google Cloud Pub/Sub Go 库。签名如下所示:func (s *Subscription) Receive(ctx context.Context, f func(context.Context, *Message)) error在这种情况下,只要在 上接收到新消息,该函数就会Receive()调用提供的回调函数,因此“客户端应用程序”代码如下所示:f*Subscriptionctx := 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.}这是上面引用的相同文档中示例代码的略微修改版本。可以在此处找到更简化的版本。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go