{"id":36531397,"url":"https://github.com/rocket049/pluginloader","last_synced_at":"2026-01-12T03:01:38.696Z","repository":{"id":57487874,"uuid":"176217220","full_name":"rocket049/pluginloader","owner":"rocket049","description":"help load plugin for go, base on standard plugin library","archived":false,"fork":false,"pushed_at":"2020-01-07T03:55:10.000Z","size":52,"stargazers_count":17,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-13T22:33:01.939Z","etag":null,"topics":["go","plugin"],"latest_commit_sha":null,"homepage":"https://gitee.com/rocket049/pluginloader","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rocket049.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-18T06:22:26.000Z","updated_at":"2025-05-13T16:01:15.000Z","dependencies_parsed_at":"2022-08-29T11:22:04.090Z","dependency_job_id":null,"html_url":"https://github.com/rocket049/pluginloader","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/rocket049/pluginloader","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocket049%2Fpluginloader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocket049%2Fpluginloader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocket049%2Fpluginloader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocket049%2Fpluginloader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rocket049","download_url":"https://codeload.github.com/rocket049/pluginloader/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rocket049%2Fpluginloader/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28332840,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T00:36:25.062Z","status":"online","status_checked_at":"2026-01-12T02:00:08.677Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","plugin"],"created_at":"2026-01-12T03:01:26.913Z","updated_at":"2026-01-12T03:01:38.684Z","avatar_url":"https://github.com/rocket049.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"### pluginloader\n用于简化调用 plugin 内的函数。 Help developer call func in go plugin easy.\n\n### ChangeLog\n\n20190419-2 update pluginwrap: delete InitxxxFuncs , add `func GetxxxFuncs(p *pluginloader.PluginLoader) *xxxFuncs` ,avoid namespace conflict.\n修改 pluginwrap ，删除生成的文件中的 `InitxxxFuncs`，改为：`func GetxxxFuncs(p *pluginloader.PluginLoader) *xxxFuncs`，\n函数都被包含在 `xxxFuncs`结构体中避免命名冲突。\n\n20190419 新增用于调用未定义结构体的对象：`UnknownObject`。 can use undefined object.\n\n20190418 pluginwrap is almost perfect now! pluginwrap几乎已经完美了！\n现在除了用户自定义类型，已经可以使用所有被导入库的类型。\nIt can deal with all types import from packages, except User Defined types in main.\n\n20190413 add new method: MakeFunc，\n用函数名从`plugin`中构建`func`。\nmake func from plugin by name.\n\n20190412 add new method: CallValue, \n被调用的函数可以返回任意数量的返回值，返回值形式为: ([]reflect.Value,error)。\nCallValue Allow any number of return values,return type: ([]reflect.Value,error)\n\n\n### 内容\n\n```\ntype PluginLoader struct {\n\t...\n}\n\n///Call return type must be: (res,error)\nfunc (p *PluginLoader) Call(funcName string, p0 ...interface{}) (interface{}, error)\n\n//CallValue Allow any number of return values,return type: []reflect.Value,error\nfunc (p *PluginLoader) CallValue(funcName string, p0 ...interface{}) ([]reflect.Value, error)\n\n//MakeFunc point a func ptr to plugin\nfunc (s *PluginLoader) MakeFunc(fptr interface{}, name string) error \n\n\n//20190419 new\n//UnknownObject field 'V' MUST be valueof object type *struct{...}\n//成员'V' 必须是结构体指针的 Value: *struct{...}\ntype UnknownObject struct {\n\tV reflect.Value\n}\n//NewUnknownObject parameter 'v' MUST be valueof object type *struct{...}\n//参数'v' 必须是结构体指针的 Value: *struct{...}\nfunc NewUnknownObject(v reflect.Value) *UnknownObject \n\n//Get 得到结构体成员的 Value\n//get the value of a field\nfunc (s *UnknownObject) Get(name string) reflect.Value\n\n//Call 运行结构体的 method\n//call the method of the struct\nfunc (s *UnknownObject) Call(fn string, args ...interface{}) []reflect.Value\n\n//Json 把结构体编码为 JSON。 convert the struct to JSON. if error,retur nil.\nfunc (s *UnknownObject) Json() []byte\n\n//CopyToStruct 利用 gob 编码技术把结构体的值复制到 v 中，v 必须是相似结构体的指针。 copy the value of the struct to v through gob encoding.\nfunc (s *UnknownObject) CopyToStruct(v interface{}) error\n```\n\n### 用法（usage）:\n\n```\nimport \"github.com/rocket049/pluginloader\"\n\np, err := pluginloader.NewPluginLoader( \"path_to_plugin\" )\nif err != nil {\n\tpanic(err)\n}\n\nres, err := p.Call(\"NameOfFunc\", p0,p1,p3,...)\n//...\n\nret := p.CallValue(\"NameOfFunc\", p0,p1,p3,...)\n//...\n\nvar Foo func(arg string)(string,error)\np.MakeFunc(\u0026Foo,\"Foo\")\n//call Foo(something)\n\n// Use UnknownObject. NewFoo return 'foo *Foo'\nv, err := p.CallValue(\"NewFoo\")\nif err != nil {\n\tt.Fatal(err)\n}\nobj := NewUnknownObject(v[0])\n\nid: = obj.Get(\"Id\").Int()\n\nerr = obj.Call(\"Set\", nil)\n\n```\n\n### 注意(attention)：\n\n#### Call\n被调用的函数可以无返回值，也可以返回1个返回值，或者1个返回值跟1个`error`。\n\n被 `Call` 的函数返回值格式只能是： `ResType` 或 `(ResType, error)` -- `ResType`可以是任何类型。\n\n当只有0个或1个返回值时，`Call` 返回的 `error` 始终是 `nil`。\n\nThe func called can have no return value, or return 1 value or 1 value and 1 error。\n\nThe format MUST be: `ResType` OR `(ResType, error)` -- `ResType` can be any type.\n\nIf there is 0 or 1 return value,the `error` return from `Call` is always `nil`.\n\n#### CallValue\n被调用的函数可以返回任意数量的返回值，返回值形式为: ([]reflect.Value,error)\n\nThe func called can return any number values, return type: ([]reflect.Value,error)\n\n### 命令行工具 pluginwrap\n本程序用于从`plugin`源代码生成:\n\n1. 可导出结构体的接口(`interface`)，以便用于类型断言。 convert export structs to interface, in order to type assert.\n2. 包装可调用的函数。 Wrap funcs.\n\n#### 安装(install)：\n\n`go get github.com/rocket049/pluginloader/cmd/pluginwrap`\n\n#### 用法（usage）：\n\n`pluginwrap path/to/plugin/dir`\n\n生成的文件(generate)：\n\n`dirWrap.go`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frocket049%2Fpluginloader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frocket049%2Fpluginloader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frocket049%2Fpluginloader/lists"}