首頁 > 後端開發 > Golang > 主體

為什麼將介面作為 Go 插件符號返回失敗,如何修復?

Patricia Arquette
發布: 2024-11-21 17:48:14
原創
843 人瀏覽過

Why Does Returning an Interface as a Go Plugin Symbol Fail, and How Can It Be Fixed?

將外掛程式綁定到介面:一個難題

在 Go 中,可以建立實作特定介面的外掛程式。但是,當將介面作為插件符號傳回時,會出現一種特殊的行為。讓我們深入研究這個問題並探索解決方案。

介面和插件:

我們用各種方法定義一個介面 IPlugin 並建立一個包含一個 struct testpl 的插件,實現它。最初,我們有三個不同的 getPlugin 函數:

  • 第一個直接傳回 testpl 結構,它按預期工作。
  • 第二個將 testpl 作為 IPlugin 介面傳回,但在下列情況下失敗綁定插件符號。
  • 第三個回傳一個通用介面{},它也失敗。

找出問題:

解決方案在於理解 Plugin.Lookup() 的工作原理。它傳回一個指向正在尋找的符號的指標。在插件公開變數(例如 Greeter)的情況下,儲存在 sym 中的值是指向該變數的指標。

當我們嘗試將插件符號綁定到介面時,就會出現問題。指向介面的指標類型的值永遠不會滿足除空介面之外的任何介面。因此,嘗試從 iface.IPlugin 類型的值類型斷言 iface.IPlugin 類型總是會失敗。

解決方案:

要解決這個問題,我們需要:

  • 從插件傳回一個函數傳回問候語(Greeter() iface.IPlugin)。這樣,當我們尋找 Greeter 符號時,它將是 func() iface.IPlugin 類型,這不需要插件包傳回指向該值的指標。
  • 取消引用插件符號指標取得 iface.IPlugin 類型的值。可以如下完成:
pgPtr, ok := sym.(*iface.IPlugin)
if !ok {
    panic(errors.New("error binding plugin to interface"))
}
pg := *pgPtr
登入後複製

以上是為什麼將介面作為 Go 插件符號返回失敗,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板