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 }
比较:
其他注意:
以上是如何在 Go 插件中有效使用自定义接口?的详细内容。更多信息请关注PHP中文网其他相关文章!