美文网首页Golang 开发者编程随笔Golang
pluginloader:简化go语言plugin函数和对象调用

pluginloader:简化go语言plugin函数和对象调用

作者: 从火星来 | 来源:发表于2019-04-13 10:57 被阅读0次

go语言的plugin调用还是很繁琐,而且功能限制也不少,我开发了的这个程序包含一个包github.com/rocket049/pluginloader和一个命令行工具github.com/rocket049/pluginloader/cmd/pluginwrap

github.com/rocket049/pluginloader引用到程序中,用于简化函数调用。

命令行工具pluginwrap用于从plugin的源代码生成可导出对象struct对应的interface和可导出func

使用pluginloader

安装命令: go get github.com/rocket049/pluginloader

可调用的函数:

type PluginLoader struct {
    P *plugin.Plugin
}

///Call return type must be: (res,error)
func (p *PluginLoader) Call(funcName string, p0 ...interface{}) (interface{}, error)

//CallValue Allow any number of return values,return type: []reflect.Value,error
func (p *PluginLoader) CallValue(funcName string, p0 ...interface{}) ([]reflect.Value, error)

//MakeFunc point a func ptr to plugin
func (s *PluginLoader) MakeFunc(fptr interface{}, name string) error 

pluginloader导出method的具体说明

  • Call,直接通过函数名调用对应的函数,但是返回值形式受到限制。
  • CallValue,直接通过函数名调用对应的函数,返回值形式不受限制。
  • MakeFunc,根据名字把预定义的函数类型变量指向插件中的函数。

调用示例

import "github.com/rocket049/pluginloader"

p, err := pluginloader.NewPluginLoader( "foo.so" )
if err != nil {
    panic(err)
}

res, err := p.Call("NameOfFunc", p0,p1,p3,...)
// ...

ret := p.CallValue("NameOfFunc", p0,p1,p3,...)
// ...

var Foo func(arg string)(string,error)
p.MakeFunc(&Foo,"Foo")
ret, err = Foo("something")
// ...

使用pluginwrap

安装命令: go get github.com/rocket049/pluginloader/cmd/pluginwrap

用法

pluginwrap path/to/plugin/foo

生成的文件名字:
fooWrap.go

把这个文件加入你的工程就可以方便的调用plugin的导出函数了。

功能

  1. 生成导出对象的接口,以便用于类型断言。
  2. 生成导出函数。

限制

本程序基于标准包pluginreflect实现,因为go语言的变量类型转换的使用有很多限制,所以本程序对导出函数的参数类型、返回值类型都有限制, 仅限于导出参数、返回值都是builtin类型的函数。

如果导出函数的参数或返回值使用了其他复杂类型,请使用 pluginloader.Callpluginloader.CallValue 调用。

示例

 // foo.so export funcs: func Hello(s string) /  func NewFoo()*Foo
    p, err := pluginloader.NewPluginLoader("foo.so")
    if err != nil {
        panic(err)
    }

    // MUST call InitxxxFuncs(p) before call funcs, xxx = plugin名字
    InitfooFuncs(p)

    // call Hello
    Hello("friend")

    // call NewFoo
    iface, err := p.Call("NewFoo")
    if err != nil {
        panic(err)
    }
    // convert return value to interface IFoo
    foo := iface.(IFoo)

相关文章

  • pluginloader:简化go语言plugin函数和对象调用

    go语言的plugin调用还是很繁琐,而且功能限制也不少,我开发了的这个程序包含一个包github.com/roc...

  • cgo

    cgo cgo是用来在Go语言中调用C语言的工具 Go语言调用C语言 简单C语言函数 在Go语言中需要通过impo...

  • 01-Go语言与C语言的异同

    Go语言程序组成 和C语言一样,Goa语言也是由众多函数组成 和C语言一样,程序运行会自动调用叫做main的函数 ...

  • (五)go语言数组和切片

    go语言数组 函数调用数组的时候 [10]int 和[20]int是不同类型调用func f (arr [10] ...

  • Go函数-延迟调用(三)

    在go语言里,defer可是实现延迟函数调用。语句defer向当前函数注册稍后执行的函数调用。这些调用被称做延迟调...

  • GO调用C函数

    GO调用C函数 在很多场景下,在Go的程序中需要调用c函数或者是用c编写的库(底层驱动,算法等,不想用Go语言再去...

  • 03-第一个Go语言程序-指趣学院

    Go语言程序组成 和C语言程序一样,Go语言程序也是由众多函数组成的 和C语言程序一样,程序运行时系统会自动调用名...

  • Learning Go(1)

    Go是面向接口和函数式编程的语言; Go只有值类型和指针类型 在写可调用方法时,方法名要大写; “=”和“:...

  • Go 实现简单的请求路由和中间件框架

    go 中区分函数和方法,方法依附于对象,需要先创建对象,才能调用对象的方法;而函数是包级的,只要是公开的,那么通过...

  • go语言plugin怎么返回对象

    golang的plugin功能用的比较少,官方的示例只有返回函数,而没有返回对象。但是实际应用中OOP可以极大提高...

网友评论

    本文标题:pluginloader:简化go语言plugin函数和对象调用

    本文链接:https://www.haomeiwen.com/subject/meqlwqtx.html