首页  >  文章  >  后端开发  >  ## 您可以通过 Go 插件键入断言自定义数据类型吗?

## 您可以通过 Go 插件键入断言自定义数据类型吗?

Patricia Arquette
Patricia Arquette原创
2024-10-26 18:48:03820浏览

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

你可以在 Go 插件和应用程序之间共享自定义数据类型吗?

在 Go 插件开发中,可以寻求与在 Go 插件中定义的自定义数据类型进行交互。来自主应用程序的插件。虽然检索导出的符号并将它们表示为接口是可行的,但出现了问题:我们可以将它们键入自定义结构吗?

直接答案是否定的,因为主包无法访问其他包中定义的标识符。因此,插件中导出的标识符不能与应用程序共享相同的类型。即使插件和应用程序中具有相同的 Person 类型定义,类型断言也会因其固有的区别而失败。

但是,有一个解决方法。在单独的包中定义类型允许其在插件和应用程序中使用。这将启用自定义结构的类型断言。

这是一个示例:

自定义类型定义:

<code class="go">package filter

type Filter struct {
    Name string
    Age  int
}</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>

主应用程序:

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

运行此展示了成功的类型断言和数据检索:

&{Name:Bob Age:21}

必须注意插件中导出的标识符之间的类型差异(MyFilter 的变量类型,CreateFilter 的函数类型)和从插件查找时获得的符号类型(变量的指针类型,函数的相同类型)之间的类型差异。

通过利用这种方法,开发人员可以在 Go 插件和应用程序之间共享自定义数据类型,从而促进组件间的高效通信。

以上是## 您可以通过 Go 插件键入断言自定义数据类型吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn