首页 > 后端开发 > Golang > 如何通过 Go 1.8 插件使用自定义接口?

如何通过 Go 1.8 插件使用自定义接口?

Susan Sarandon
发布: 2024-12-27 19:02:09
原创
264 人浏览过

How Can I Use Custom Interfaces with Go 1.8 Plugins?

在 Go 1.8 插件中使用自定义接口

在 Go 1.8 中,插件可以使用自定义接口。但是,有一些限制需要考虑。

使用外部包

一种方法是在外部包中定义接口,然后让插件和主应用程序导入它。

例如,在名为filter的包中创建一个接口:

package filter

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

在插件中,导入filter包并实现接口:

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())
}
登录后复制

这种方法确保插件可以访问接口定义。

返回接口{}

另一个选项是让插件返回接口{}类型的值。然后,主应用程序可以定义它期望的接口,并对返回值使用类型断言。

例如,在插件中:

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
}
登录后复制

这种方法提供了更大的灵活性,但需要在主程序中进行类型断言application.

限制

请注意,自定义接口仅在插件外部定义的情况下才有效。这是因为 Go 插件是独立的模块,无法访问其他包中定义的类型。

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

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