-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplugin.go
More file actions
43 lines (38 loc) · 887 Bytes
/
plugin.go
File metadata and controls
43 lines (38 loc) · 887 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package plugin
import (
"path/filepath"
gplugin "plugin"
"strings"
"github.com/puzpuzpuz/xsync/v4"
)
var pluginmap = xsync.NewMap[string, gplugin.Symbol]()
func Load[T any](plugpath, name string) T {
if len(plugpath) == 0 {
plugpath = "./plugins"
}
name = strings.ToLower(name)
obj, ok := pluginmap.Load(name)
if ok {
return obj.(T)
}
so := filepath.Join(plugpath, name+".so")
plug, err := gplugin.Open(so)
if err != nil {
panic("插件 " + name + " 加载失败!" + err.Error())
}
obj, err = plug.Lookup("Plugin")
if err != nil {
panic("插件 " + name + " 加载,无Plugin符号!" + err.Error())
}
t, ok := obj.(T)
if !ok {
panic("插件 " + name + " 转换T失败!")
}
pluginmap.Store(name, t)
return t
}
func Reload[T any](plugpath, name string) T {
name = strings.ToLower(name)
pluginmap.Delete(name)
return Load[T](plugpath, name)
}