Golang 静态插件化

最近学习Go的时候,看了httpx、kunpeng几个工具源码,发现kunpeng用我没见过的方式,把目录下的插件写到了一个变量里,main通过这个变量能够随意读取和使用插件内的方法。

在这之前,用撇脚的Python写过类似的代码。用main去主动加载,通过pkgutil.iter_modules配合importlib.import_module去import,最后调用插件里的方法。后来也没学会怎么让插件主动注册到一个变量里。

下面是用Go试着实现这种方式的代码

plugins/plugin.go

package plugins

var plugins = make(map[string]Plugin)

type Plugin interface {
	Check(URL string) bool
}

func Register(name string, plugin Plugin) {
	plugins[name] = plugin
}

func GetPlugins() map[string]Plugin {
	return plugins
}

plugins/strust2_032.go

package plugins

type st2032 struct{}

func (s st2032) Check(URL string) bool {
	if URL == ""{
		return false
	}
	return true
}

func init() {
	Register("Struct2-032", st2032{})
}

main.go

package main

func main() {
	plist := plugins.GetPlugins()
	for s, plugin := range plist {
		//fmt.Println(s, plugin)
		fmt.Println(plugin.Check("http://localhost:8080/index.action"))
	}
}
标签:

发表评论

邮箱地址不会被公开。 必填项已用*标注