首页 > 后端开发 > Golang > 如何在 Go 插件中有效使用自定义接口?

如何在 Go 插件中有效使用自定义接口?

DDD
发布: 2024-12-24 03:47:18
原创
160 人浏览过

How Can I Use Custom Interfaces Effectively within Go Plugins?

Go 插件中的自定义接口

问题:如何在 Go 插件中使用自定义接口?

背景:自定义接口对于实现可重用至关重要和可扩展的软件组件。然而,最初尝试在 Go 插件中使用它们会导致以下错误:

panic: interface conversion: plugin.Symbol is func() (filter.Filter, error), not func() (filter.Filter, error)
登录后复制

答案:

虽然 Go 插件无法访问插件本身定义的类型,可以通过以下方法使用自定义接口:

1.使用通用包:

在由插件和主应用程序导入的包中定义接口。这种方法允许两个组件使用相同的类型定义。

2.从插件返回 Interface{}:

让插件函数返回 interface{} 类型的值。然后,主应用程序可以在返回值上定义类型断言以使用自定义接口。

示例:

Main应用程序:

package main

import (
    "fmt"
    "plugin"

    "github.com/fagongzi/gateway/pkg/filter"
)

func main() {
    // ...
    GetInstance(func() (filter.Filter, error)) // Error occurs
}
登录后复制

插件:

package plugin

import "github.com/fagongzi/gateway/pkg/filter"

type plgFilter struct{}

func (plgFilter) Name() string   { return "Bob" }
func (plgFilter) Age() int      { return 23 }

// Return an "empty" filter to satisfy the function signature
func GetInstance() (filter.Filter, error)         { return nil, nil }
func GetInstanceInter() (interface{}, error)       { return &plgFilter{}, nil }
func GetInstancePtr() (*plgFilter, error)      { return &plgFilter{}, nil }
登录后复制

比较:

  • 选项 1: 需要接口存在在插件和应用程序代码中。
  • 选项 2: 允许插件返回任何类型的值,提供更大的灵活性。

其他注意:

  • 自定义接口只能在没有其他插件的插件中使用依赖项。
  • 插件无法定义自己的接口,可以从主应用程序引用。

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

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