In Go plugin development, one can seek to interface with a custom data type defined in a plugin from the main application. While it's feasible to retrieve exported symbols and represent them as interfaces, the question arises: can we type assert them into custom structs?
The direct answer is negative, as the main package cannot access identifiers defined in other packages. Hence, the exported identifier in the plugin cannot share the same type with the application. Even with identical Person type definitions in both plugin and application, type assertion fails due to their inherent distinction.
But, there's a workaround. Definining the type in a separate package allows its use in both plugin and application. This enables type assertion of the custom struct.
Here's an example:
Custom type definition:
<code class="go">package filter type Filter struct { Name string Age int }</code>
Plugin code:
<code class="go">package main import ( "play/filter" ) var MyFilter = filter.Filter{ Name: "Bob", Age: 21, } func CreateFilter() filter.Filter { return filter.Filter{ Name: "Bob", Age: 21, } }</code>
Main application:
<code class="go">package main import ( "fmt" "log" "os" "play/filter" "plugin" ) func main() { p, err := plugin.Open("plugin.so") if err != nil { log.Fatal(err) } mf, err := p.Lookup("MyFilter") if err != nil { log.Fatal(err) } f, ok := mf.(*filter.Filter) if !ok { log.Fatal("Wrong symbol type") } fmt.Printf("%+v\n", f) }</code>
Running this showcases the successful type assertion and retrieval of data:
&{Name:Bob Age:21}
It's essential to note the type difference between exported identifiers in the plugin (variable type for MyFilter, function type for CreateFilter) and the type of symbols obtained when looked up from the plugin (pointer type for variables, same type for functions).
By utilizing this approach, developers can share custom data types between Go plugins and applications, facilitating efficient inter-component communication.
The above is the detailed content of ## Can You Type Assert a Custom Data Type From a Go Plugin?. For more information, please follow other related articles on the PHP Chinese website!