我正在嘗試實現(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)為它們不安全。這是一個例子。
- 1 回答
- 0 關(guān)注
- 164 瀏覽
添加回答
舉報
0/150
提交
取消