Go 外掛程式中的自訂資料類型共用
在 Go 外掛程式中,可以匯出 Go 符號並從主機應用程式存取它們。然而,問題是自訂資料類型是否可以在插件和應用程式之間共享,特別是作為結構體。
型別斷言限制
乍一看,使用 type將導出的符號轉換為特定結構的斷言似乎很簡單。例如:
import ( "plugin" ) // defined in plugin.so type Person struct { Name string } func main() { // ... Establish connection to plugin ... sym, _ := plug.Lookup("P") var p Person p, ok := sym.(Person) // assertion attempt // ... }
不幸的是,此嘗試在運行時失敗並出現錯誤,指示「符號類型錯誤」。此錯誤訊息源自於以下事實:主包中定義的識別碼無法從其他包引用。因此,插件導出的標識符不能與主應用程式中的對應標識符具有相同的類型。即使類型定義相同,由於涉及不同的類型對象,類型斷言也會失敗。
單獨的套件方法
為了規避這個限制,我們可以定義自訂資料類型位於單獨的套件中,並將其匯入插件和主應用程式中。這允許兩個組件共享相同的類型定義。
這是一個例子:
separate_pkg/filter/filter.go:
package filter type Filter struct { Name string Age int }
plugin.
// import "separate_pkg/filter" var MyFilter = filter.Filter{ Name: "Bob", Age: 21, } // ...
main.go:
以上是**您可以在 Go 外掛程式和主機應用程式之間共用自訂資料類型嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!