Go生成go动态库或静态库的方法
Go / 管理员 发布于 4年前 483
预备知识
相关知识(推荐: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.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") } }
以上就是Go生成go动态库或静态库的方法的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号