首页  >  文章  >  后端开发  >  ## 您可以在 Go 插件中输入断言自定义数据结构吗?

## 您可以在 Go 插件中输入断言自定义数据结构吗?

Barbara Streisand
Barbara Streisand原创
2024-10-29 14:14:02889浏览

## Can You Type Assert Custom Data Structures in Go Plugins?

Go 插件和应用程序之间共享自定义数据类型

在 Go 中,可以在插件和应用程序之间共享数据。然而,问题出现了,将断言输入到自定义数据结构而不是接口中是否可行。

使用自定义结构键入断言

考虑以下场景:

<code class="go">// plugin.go
package main

type Person struct {
    Name string
}

var (
    P = Person{
        Name: "Emma",
    }
)</code>
<code class="go">// app.go
package main

import (
    "fmt"
    "plugin"
    "os"
)

func main() {
    plug, err := plugin.Open("./plugin.so")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    sym, err := plug.Lookup("P")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    var p Person
    p, ok := sym.(Person)
    if !ok {
        fmt.Println("Wrong symbol type")
        os.Exit(1)
    }

    fmt.Println(p.Name)
}</code>

当尝试在 app.go 文件中向 Person 键入断言符号 P 时,您将遇到执行时错误:“符号类型错误。”

解决方案:通用类型包

要克服此限制,请在单独的包中定义自定义数据类型,并在插件和主应用程序中使用它。

<code class="go">// filter/filter.go
package filter

type Filter struct {
    Name string
    Age  int
}</code>
<code class="go">// plugin/main.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">// app/main.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>

在此示例中,Filter 类型在单独的包中定义,使其可供插件和主应用程序访问。结果,从插件符号到 *filter.Filter 的类型断言成功。

注意:

  • 主包中定义的变量不能从其他包引用,因此避免直接在插件和主应用程序中使用相同的类型。
  • 代表变量的符号作为指针返回,允许您修改它们的值。
  • 返回非指针类型值的函数可以通过函数指针查找。
  • 更改普通类型包需要重新构建插件。

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

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