Home >Backend Development >Golang >**Can You Share Custom Data Types Between Go Plugins and the Host Application?**
Custom Data Type Sharing in Go Plugins
In Go plugins, it is possible to export Go symbols and access them from the host application. However, the question arises whether custom data types can be shared between the plugin and the application, specifically as structs.
Type Assertion Limitations
At first glance, using type assertion to convert an exported symbol into a specific struct would seem straightforward. For instance:
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 // ... }
Unfortunately, this attempt fails at runtime with an error, indicating "Wrong symbol type." This error message stems from the fact that identifiers defined in the main package cannot be referenced from other packages. Therefore, an exported identifier from a plugin cannot be the same type as its counterpart in the main application. Even if the type definitions were identical, type assertion would fail due to the different type objects involved.
Separate Package Approach
To circumvent this limitation, we can define the custom data type in a separate package and import it into both the plugin and the main application. This allows both components to share the same type definition.
Here's an example:
separate_pkg/filter/filter.go:
package filter type Filter struct { Name string Age int }
plugin.go:
// import "separate_pkg/filter" var MyFilter = filter.Filter{ Name: "Bob", Age: 21, } // ...
main.go:
// import { "play/filter/filter", "plugin" } func main() { p, _ := plugin.Open("plugin.so") mf, _ := p.Lookup("MyFilter") f, ok := mf.(*filter.Filter) // type assertion now succeeds // ... }
The above is the detailed content of **Can You Share Custom Data Types Between Go Plugins and the Host Application?**. For more information, please follow other related articles on the PHP Chinese website!