golang如何生成动态库和静态库
golang如何生成动态库和静态库?这篇文章运用了实例代码展示,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

创新互联建站从2013年开始,是专业互联网技术服务公司,拥有项目网站设计制作、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元贵港做网站,已为上家服务,为贵港各地企业和个人服务,联系电话:18982081108
预备知识
plugin模式
插件运行方式
go plugin包使用
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")
}
}到此为止, 关于golang生成动态库和静态库有了一个基础的认识, 但是对于具体的使用方法还是需要多加巩固和练习,如果想了解更多相关内容,请关注创新互联行业资讯。
网站栏目:golang如何生成动态库和静态库
网站链接:http://www.jxjierui.cn/article/gseecj.html


咨询
建站咨询
