【问题标题】:Find all implementations of interface and put them in a slice找到接口的所有实现并将它们放在一个切片中
【发布时间】:2021-09-21 03:21:06
【问题描述】:

我正在尝试实现这样的 golang 插件接口:

package main

import "fmt"

type Plugin interface {
    Run() bool
}
type Plugin1 struct{}
type Plugin2 struct{}

func (p Plugin1) Run() bool {
    fmt.Println("Plugin1::Run()")
    return true
}

func (p Plugin2) Run() bool {
    fmt.Println("Plugin2::Run()")
    return true
}

func main() {
    plugins := []Plugin{
        Plugin1{},
        Plugin2{},
    }

    for _, plugin := range plugins {
        plugin.Run()
    }
}

我可以调用plugins 切片中定义的所有插件。切片中的项目是硬编码的,有没有办法自动生成切片?

【问题讨论】:

    标签: go interface


    【解决方案1】:

    执行此操作的常见方法是拥有一个注册函数,并从包的init() 函数中调用该函数。那就是:

    var plugins = []Plugin{}
    
    func RegisterPlugin(p Plugin) {
      plugins=append(plugins,p)
    }
    

    在声明插件的包中:

    func init() {
       plugins.RegisterPlugin(MyPlugin{})
    }
    

    一旦你导入所有声明插件的包,插件就会被填充。

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多