將外掛程式綁定到介面:一個難題
在 Go 中,可以建立實作特定介面的外掛程式。但是,當將介面作為插件符號傳回時,會出現一種特殊的行為。讓我們深入研究這個問題並探索解決方案。
介面和插件:
我們用各種方法定義一個介面 IPlugin 並建立一個包含一個 struct testpl 的插件,實現它。最初,我們有三個不同的 getPlugin 函數:
找出問題:
解決方案在於理解 Plugin.Lookup() 的工作原理。它傳回一個指向正在尋找的符號的指標。在插件公開變數(例如 Greeter)的情況下,儲存在 sym 中的值是指向該變數的指標。
當我們嘗試將插件符號綁定到介面時,就會出現問題。指向介面的指標類型的值永遠不會滿足除空介面之外的任何介面。因此,嘗試從 iface.IPlugin 類型的值類型斷言 iface.IPlugin 類型總是會失敗。
解決方案:
要解決這個問題,我們需要:
pgPtr, ok := sym.(*iface.IPlugin) if !ok { panic(errors.New("error binding plugin to interface")) } pg := *pgPtr
以上是為什麼將介面作為 Go 插件符號返回失敗,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!