Home  >  Article  >  Backend Development  >  **Can You Share Custom Data Types Between Go Plugins and the Host Application?**

**Can You Share Custom Data Types Between Go Plugins and the Host Application?**

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 10:16:02834browse

**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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn