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


当前第2页 返回上一页

实例

1

2

3

4

5

结构:

    -softplugin         //根目录

        -soft           //软件目录

        -plugins         //插件目录

        -itf            //接口目录

无自定义数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

// 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。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

//------------------------------------------------------

// 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动态库或静态库的方法的详细内容,更多文章请关注木庄网络博客!!

返回前面的内容

相关阅读 >>

kubernetes-helm详细介绍及使用

Golang生成webpack打包文件

Go实现字符串的逆序

Go语言基础之数组

Golang 之 我被 for-range 循环进去了

Go 语言学习之初步认识

手撸Golang Go与微服务 chatserver之3 压测与诊断

使用 Go 1.16 的 signal.notifycontext 让你的服务重启更优雅

kubernetes学习笔记之csi external provisioner源码解析

Go语言中slice作为参数传递时遇到的一些“坑”

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...