首页 > 后端开发 > Golang > 如何将自定义接口传递给 Go 1.8 插件?

如何将自定义接口传递给 Go 1.8 插件?

Linda Hamilton
发布: 2024-12-25 20:12:10
原创
275 人浏览过

How Can I Pass Custom Interfaces to Go 1.8 Plugins?

go 1.8 插件使用自定义接口

许多 Go 插件需要能够将复杂的自定义接口传递给它们。不幸的是,目前在原始插件实现中无法正常执行此操作。

避免此问题的一种方法是使插件返回一个类型为interface{}的值。然后,主应用程序可以定义它期望的接口,并对插件返回的 interface{} 值使用类型断言。

例如,插件代码可能如下所示:

package main

import (
    "fmt"
)

type plgFilter struct{}

func (plgFilter) Name() string {
    return "Bob"
}

func (plgFilter) Age() int {
    return 23
}

func GetFilterIface() (f interface{}, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilterIface] Returning filter: %T %v\n", f, f)
    return
}
登录后复制

主应用程序代码可能如下所示:

package main

import (
    "fmt"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilterIface, err := p.Lookup("GetFilterIface")
    if err != nil {
        panic(err)
    }

    filterIface, err := GetFilterIface.(func() (interface{}, error))()
    fmt.Printf("GetFilterIface result: %T %v %v\n", filterIface, filterIface, err)

    myfilter := filterIface.(MyFilter)
    fmt.Println("\tName:", myfilter.Name())
    fmt.Println("\tAge:", myfilter.Age())
}

type MyFilter interface {
    Name() string
    Age() int
}
登录后复制

另一个解决方案是在插件外部的包中定义接口,并且插件和您的应用程序可以导入它并引用它。
例如,如果在包过滤器中定义了接口:

package filter

type Filter interface {
    Name() string
    Age() int
}
登录后复制

那么插件代码可能如下所示:

package main

import (
    "fmt"
    "filter"
)

type plgFilter struct{}

func (plgFilter) Name() string {
    return "Bob"
}

func (plgFilter) Age() int {
    return 23
}

func GetFilter() (f filter.Filter, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilter] Returning filter: %T %v\n", f, f)
    return
}
登录后复制

主要应用程序代码可能如下所示:

package main

import (
    "fmt"
    "filter"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilter, err := p.Lookup("GetFilter")
    if err != nil {
        panic(err)
    }

    filter, err := GetFilter.(func() (filter.Filter, error))()
    fmt.Printf("GetFilter result: %T %v %v\n", filter, filter, err)
    fmt.Println("\tName:", filter.Name())
    fmt.Println("\tAge:", filter.Age())
}
登录后复制

以上是如何将自定义接口传递给 Go 1.8 插件?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板