當嘗試匯入實現兩個套件外部定義的介面的外掛程式時,將外掛符號綁定到接口出現故障。儘管插件的介面的結構實作仍然會發生這種情況。
問題是由從外掛程式中尋找變數的方法引起的,該方法會傳回指向該變數的指標。從指標類型的值到介面鍵入斷言介面永遠不會成功。相反,解決方案是從插件中導出一個返回所需介面類型的函數。
func Greeter() iface.IPlugin { return testpl{} }
外掛程式包透過在尋找變數時傳回指向值的指標來操作。對於 iface.IPlugin 類型的變量,這會產生一個指向介面的指針,該介面不能被類型斷言為 iface.IPlugin。
透過從外掛程式傳回一個函數,找出操作不再需要指標。然後可以呼叫該函數來取得所需的介面值。
要利用此方法,應更新外掛程式定義以公開傳回介面實作的函數。然後程式可以查找這個函數並使用它來取得greeter實例。
// In the plugin func Greeter() iface.IPlugin { return testpl{} } // In the main program Greeter, err := p.Lookup("Greeter") if err != nil { panic(err) } greeterFunc, ok := Greeter.(func() iface.IPlugin) if !ok { panic(errors.New("not of expected type")) } greeter := greeterFunc()
這種方法避免了間接類型斷言的麻煩和使用指針引起的混亂。此外,它與從插件中公開功能的更直觀的方式相一致。
以上是為什麼將插件符號作為函數返回可以解決 Go 插件介面綁定問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!