zoukankan      html  css  js  c++  java
  • 2020-10-02:golang如何写一个插件?

    福哥答案2020-10-02:#福大大架构师每日一题#
    简单回答:
    buildmode=plugin
    plugin.Open
    p.Lookup

    [中级回答:](https://www.zhihu.com/question/423802485)
    golang的plugin是使用-buildmode=plugin 的编译flag编译出的软件包,用于生成共享库(.so)库文件。 Go包中导出的函数和变量显示为ELF符号,可以在另一个golang程序中使用golang中的`plugin`包在运行时查找和绑定它们。
    先写这样一段plugin代码:

    package main
    
    import "fmt"
    
    // 包含一个简单函数的模块
    func Add(a int, b int) int {
        fmt.Printf("
    Adding a=%d and b=%d", a, b)
        return a + b
    }
    

      

    用下面的指令编译成plugin:
    go build -buildmode=plugin -o math.so

    然后可以在另外一个golang代码中加载并调用编译好的plugin:

    // 加载plugin
    plugins, err := filepath.Glob("math.so")
    if err != nil {
        panic(err)
    }
    fmt.Printf("Loading plugin %s", plugins[0])
    p, err := plugin.Open(plugins[0])
    if err != nil {
        panic(err)
    }
    
    // 查找叫Add的函数
    symbol, err := p.Lookup("Add")
    if err != nil {
        panic(err)
    }
    addFunc, ok := symbol.(func(int, int) int)
    if !ok {
        panic("Plugin has no 'Add(int)int' function")
    }
    
    // 调用函数
    addition := addFunc(3, 4)
    fmt.Printf("
    Addition is:%d", addition)
    

      

    ***
    [评论](https://user.qzone.qq.com/3182319461/blog/1601595469)

  • 相关阅读:
    from import 的认识
    模块初识
    eq方法
    hash介绍
    item系列
    析构函数
    serializers进阶
    APIView源码解析
    RPC协议
    面试题补充
  • 原文地址:https://www.cnblogs.com/waitmoon/p/13762238.html
Copyright © 2011-2022 走看看