golang如何生成动态库和静态库
golang如何生成动态库和静态库?这篇文章运用了实例代码展示,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
预备知识
plugin模式
插件运行方式
go plugin包使用
go build 可以指定buildmode。分为了多种模式。具体模式如下。
实例
结构: -softplugin //根目录 -soft //软件目录 -plugins //插件目录 -itf //接口目录
无自定义数据
// plugins/hello.gopackage mainimport "fmt"func Hello(){ fmt.Println("hello")}// go build -buildmode=plugin -o hello.so hello.go// soft/basetype.gopackage mainimport ( "os" "path" "plugin" "fmt")func main(){ //加载插件 pluginDir := "../plugins" //扫描文件夹下所有so文件 f, err := os.OpenFile(pluginDir, os.O_RDONLY, 0666) if err != nil { panic(err) } fi, err := f.Readdir(-1) if err != nil { panic(err) } plugins := make([]os.FileInfo, 0) for _, ff := range fi { if ff.IsDir() || path.Ext(ff.Name()) != ".so" { continue } plugins = append(plugins, ff) pdll, err := plugin.Open(pluginDir + "/" + ff.Name()) if err != nil { fmt.Println(err) continue } plg, err := pdll.Lookup("Hello") if err != nil { panic(err) } plg.(func())() }}// go run basetype.go
定义插件接口 interface。
//------------------------------------------------------// itf/itf1.gopackage itftype Printor interface{ Print(v interface{})}//------------------------------------------------------// plugins/p1.gopackage mainimport ( "fmt" "softplugin/itf")type ScreenPrintor struct{}func (ScreenPrintor)Print(v interface{}){ fmt.Println("p1p1 ",v)}func Install() Printor{ return &ScreenPrintor{}}//-----------------------------------------------------// soft/s1.gopackage mainimport ( "softplugin/itf" "os" "path" "plugin" "fmt")var( printors = make([]itf.Printor, 0))func main(){ //加载插件 pluginDir := "../plugins" //扫描文件夹下所有so文件 f, err := os.OpenFile(pluginDir, os.O_RDONLY, 0666) if err != nil { panic(err) } fi, err := f.Readdir(-1) if err != nil { panic(err) } plugins := make([]os.FileInfo, 0) for _, ff := range fi { if ff.IsDir() || path.Ext(ff.Name()) != ".so" { continue } plugins = append(plugins, ff) pdll, err := plugin.Open(pluginDir + "/" + ff.Name()) if err != nil { fmt.Println(err) continue } plg, err := pdll.Lookup("Hello") if err != nil { panic(err) } printors = append(printors, (plg.(func() itf.Printor))()) } for _, p := range printors { p.Print("pppp") } }
到此为止, 关于golang生成动态库和静态库有了一个基础的认识, 但是对于具体的使用方法还是需要多加巩固和练习,如果想了解更多相关内容,请关注亿速云行业资讯。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。