Home > Backend Development > Golang > ## Can You Type Assert a Custom Data Type From a Go Plugin?

## Can You Type Assert a Custom Data Type From a Go Plugin?

Patricia Arquette
Release: 2024-10-26 18:48:03
Original
895 people have browsed it

## Can You Type Assert a Custom Data Type From a Go Plugin?

Can You Share a Custom Data Type Between a Go Plugin and Application?

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>
Copy after login

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>
Copy after login

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>
Copy after login

Running this showcases the successful type assertion and retrieval of data:

&{Name:Bob Age:21}
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template