• 技术文章 >后端开发 >Golang

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

    尚2019-11-28 15:21:52转载2452

    预备知识

    相关知识(推荐: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动态库或静态库的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:Go
    上一篇:go中的数据结构-接口interface(详解) 下一篇:go语言查看环境信息的方法
    Web大前端开发直播班

    相关文章推荐

    • go语言的异常处理介绍• Go语言两种版本的Hello world你会吗• go语言中go build和go install的区别• go get命令详解

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网