Go生成go动态库或静态库的方法

互联网 19-11-28
  • plugin模式

  • 插件运行方式

  • go plugin包使用

相关知识(推荐:go语言教程)

go build 可以指定buildmode。分为了多种模式。具体模式如下。

模式说明
当前go版本1.10.3
archive编译成二进制文件。一般是静态库文件。 xx.a
c-archive编译成C归档文件。C可调用的静态库。xx.a。注意要编译成此类文件需要import C 并且要外部调用的函数要使用 “//export 函数名” 的方式在函数上方注释。否则函数默认不会被导出。
c-shared编译成C共享库。同样需要 import “C” 和在函数上方注释 // export xxx
default对于有main包的直接编译成可执行文件。没有main包的,编译成.a文件
exe编译成window可执行程序
plugin将main包和依赖的包一起编译成go plugin。非main包忽略。【类似C的共享库或静态库。插件式开发使用】

实例

结构:     -softplugin         //根目录         -soft           //软件目录         -plugins         //插件目录         -itf            //接口目录

无自定义数据

// plugins/hello.go package main import "fmt" func Hello(){     fmt.Println("hello") } // go build -buildmode=plugin -o hello.so hello.go   // soft/basetype.go package main import (     "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.go package itf type Printor interface{     Print(v interface{}) }  //------------------------------------------------------ // plugins/p1.go package main import (     "fmt"     "softplugin/itf" ) type ScreenPrintor struct{} func (ScreenPrintor)Print(v interface{}){     fmt.Println("p1p1 ",v) } func Install() Printor{     return &ScreenPrintor{} }  //----------------------------------------------------- // soft/s1.go package main import (     "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")     }      }

以上就是Go生成go动态库或静态库的方法的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: Go
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:go中的数据结构-接口interface(详解)

相关资讯