第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

實(shí)現(xiàn)庫回調(diào)

實(shí)現(xiàn)庫回調(diào)

Go
一只斗牛犬 2022-06-13 15:28:54
我正在嘗試在 Go 中實(shí)現(xiàn)一個(gè)客戶端庫??蛻舳藨?yīng)用程序?qū)?dǎo)入此庫并使用其方法。一種這樣的方法是為某個(gè)事件設(shè)置通知,如果該事件發(fā)生,則客戶端應(yīng)用程序應(yīng)收到回調(diào)。我被困在如何從我的庫中調(diào)用客戶端應(yīng)用程序功能的問題上。以下是我正在嘗試做的事情的去游樂場(chǎng)鏈接。假設(shè)有一個(gè)包 main 是客戶端應(yīng)用程序,該應(yīng)用程序使用包測(cè)試中的客戶端庫。主包: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")    }封裝測(cè)試: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}現(xiàn)在應(yīng)用程序?qū)⒍x一個(gè)需要由庫調(diào)用的回調(diào)函數(shù)。有沒有辦法做到這一點(diǎn)?我所做的方式無法編譯。
查看完整描述

2 回答

?
胡說叔叔

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊

有幾種方法可以做到這一點(diǎn):


使用回調(diào)函數(shù):


func LibraryFunction(callback func(Event)) {

  ...

   callback(event)

}

或者,將回調(diào)函數(shù)注冊(cè)到某種注冊(cè)表:


var callbacks []func(Event)


func AddNotificationCallback(f func(Event)) {

   callbacks=append(callbacks,f)

}


func Notify(ev Event) {

   for _,x:=range callbacks {

      x(ev)

   }

}

除了回調(diào)函數(shù),你可以用接口做同樣的事情:


type Receiver interface {

    EventHappened(Event)

}

您可以將實(shí)現(xiàn)此接口的任何結(jié)構(gòu)傳遞給庫函數(shù),或注冊(cè)到通知接收器列表。


如果庫異步生成這些事件,那么您可以使用通道將事件發(fā)回,但從您的描述來看,這似乎不是您所需要的。


查看完整回答
反對(duì) 回復(fù) 2022-06-13
?
慕運(yùn)維8079593

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊

在 Go 中,使用來自不同包的類型的接收器是不合法的;您提供的代碼將無法編譯。


相反,請(qǐng)考慮將回調(diào)函數(shù)從客戶端應(yīng)用程序傳遞到庫。這是一種常見的模式。其使用示例之一是Google Cloud Pub/Sub Go 庫。簽名如下所示:


func (s *Subscription) Receive(ctx context.Context, f func(context.Context, *Message)) error

在這種情況下,只要在 上接收到新消息,該函數(shù)就會(huì)Receive()調(diào)用提供的回調(diào)函數(shù),因此“客戶端應(yīng)用程序”代碼如下所示: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.

}

這是上面引用的相同文檔中示例代碼的略微修改版本。


可以在此處找到更簡(jiǎn)化的版本。


查看完整回答
反對(duì) 回復(fù) 2022-06-13
  • 2 回答
  • 0 關(guān)注
  • 151 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)