manager.go 750 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package plugin_manager
  2. import (
  3. "fmt"
  4. "plugin"
  5. "unicode"
  6. )
  7. var registry map[string]plugin.Symbol
  8. func init(){
  9. registry = make(map[string]plugin.Symbol)
  10. }
  11. func GetPlugin(t string, ptype string) (plugin.Symbol, error) {
  12. t = ucFirst(t)
  13. key := ptype + "/" + t
  14. var nf plugin.Symbol
  15. nf, ok := registry[key]
  16. if !ok {
  17. mod := "plugins/" + key + ".so"
  18. plug, err := plugin.Open(mod)
  19. if err != nil {
  20. return nil, fmt.Errorf("cannot open %s: %v", mod, err)
  21. }
  22. nf, err = plug.Lookup(t)
  23. if err != nil {
  24. return nil, fmt.Errorf("cannot find symbol %s, please check if it is exported", t)
  25. }
  26. }
  27. return nf, nil
  28. }
  29. func ucFirst(str string) string {
  30. for i, v := range str {
  31. return string(unicode.ToUpper(v)) + str[i+1:]
  32. }
  33. return ""
  34. }