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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以發(fā)送函數(shù)作為 RPC 的響應(yīng)

是否可以發(fā)送函數(shù)作為 RPC 的響應(yīng)

Go
FFIVE 2022-08-09 20:39:15
我正在嘗試實現(xiàn)一個服務(wù)器和多個客戶端。客戶端將向服務(wù)器注冊,服務(wù)器應(yīng)為客戶端提供要調(diào)用的特定功能。我不希望特定函數(shù)是另一個rpc調(diào)用。我正在嘗試為map reduce創(chuàng)建一個分布式系統(tǒng),其中函數(shù)將在客戶端進(jìn)程中執(zhí)行。有沒有辦法在 Go 中傳遞函數(shù)作為對遠(yuǎn)程過程調(diào)用的響應(yīng)?以下是我嘗試過的:在服務(wù)器中 :type ResgisterResponse struct {    Ack     bool    MapFunc func()}func (a *API) RegisterWorker(addr string, reply *ResgisterResponse) error {    a.worker[addr] = "idle" //idle, working, complete    fmt.Printf("Wokers : %+v\n", a.worker)    *reply = ResgisterResponse{        Ack: true,        MapFunc: func() {            fmt.Println("Hello Worker")        },    }    return nil}和在客戶端中:var reply struct {        Ack     bool        MapFunc func()    }err = client.Call("API.RegisterWorker", getLocalAddr()+":"+localPort, &reply)must(err)fmt.Println("Worker registered")reply.MapFunc()當(dāng)然,我得到的指針錯誤為零。panic: runtime error: invalid memory address or nil pointer dereference
查看完整描述

1 回答

?
四季花海

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

由于語言設(shè)計,通過網(wǎng)絡(luò)發(fā)送普通函數(shù)將不起作用。在單個程序中,您可以將函數(shù)作為參數(shù)傳遞,因為它們是在同一二進(jìn)制文件中編譯的。在服務(wù)器進(jìn)程中,您可以獲取它們的地址/引用,因為它們映射在內(nèi)存中,但是當(dāng)您發(fā)送函數(shù)時,您實際上會發(fā)送指向它的指針,該指針在客戶端的內(nèi)存中不是有效的地址(因此指針錯誤無效)。

為了解決您的問題,我會讓客戶端根據(jù)id(可能是提及函數(shù)名稱的字符串)向服務(wù)器注冊一組可用函數(shù)。服務(wù)器將在 Run RPC 調(diào)用中發(fā)回函數(shù) ID,客戶端將根據(jù)此 ID 選擇函數(shù)并運行它

還有一些實驗庫可以在運行時評估Go代碼,但我認(rèn)為它們不安全。這是一個例子。


查看完整回答
反對 回復(fù) 2022-08-09
  • 1 回答
  • 0 關(guān)注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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