Golang 生成动态库及调用

Jackey Golang 4,763 次浏览 没有评论

plugin.go

  1. /************************************************************
  2. go build --buildmode=plugin plugin.go
  3. **********************************************************/
  4.  
  5. package main
  6.  
  7. import (
  8. "fmt"
  9. )
  10.  
  11. func DCall(){
  12. fmt.Println("plugin.so was called")
  13. }
  14.  
  15. func DCallWithParam(msg string){
  16. fmt.Println("参数内容为:",msg)
  17. }
  18.  
  19.  
  20. func main() {
  21. fmt.Println("goroute全部退出")
  22. }

 

pluginLoad.go

  1. package main
  2.  
  3. import (
  4. "plugin"
  5. )
  6.  
  7. func main() {
  8.  
  9. //加载动态库
  10. p, err := plugin.Open("plugin.so")
  11. if err != nil {
  12. panic(err)
  13. }
  14. //查找函数
  15. f, err := p.Lookup("DCall")
  16. if err != nil {
  17. panic(err)
  18. }
  19. //转换类型后调用函数
  20. f.(func())()
  21.  
  22. f2, err := p.Lookup("DCallWithParam")
  23. if err != nil {
  24. panic(err)
  25. }
  26.  
  27. //带参函数的调用
  28. f2.(func(string))("hello world,plugin.so")
  29. }

 

生成动态库文件:

go build --buildmode=plugin plugin.go

执行go run指令

go run pluginLoad.go

注意:目前go动态库的生产只支持Linux

带返回参数的调用

plugin.go

  1. package main
  2.  
  3. import "C"
  4. import (
  5. "fmt"
  6. )
  7.  
  8. func DCall() int {
  9. return 2
  10. }
  11.  
  12. func DCallWithParam(msg string) string {
  13. return msg
  14. }
  15.  
  16.  
  17. func main() {
  18. fmt.Println("goroute全部退出")
  19. }

pluginLoad.go

  1. package main
  2.  
  3. import "C"
  4. import (
  5. "fmt"
  6. "plugin"
  7. )
  8.  
  9. func main() {
  10. //加载动态库
  11. p, err := plugin.Open("plugin.so")
  12. if err != nil {
  13. panic(err)
  14. }
  15. //查找函数
  16. f, err := p.Lookup("DCall")
  17. if err != nil {
  18. panic(err)
  19. }
  20. //转换类型后调用函数
  21. res := f.(func() int)()
  22. fmt.Println(res)
  23.  
  24. f2, err := p.Lookup("DCallWithParam")
  25. if err != nil {
  26. panic(err)
  27. }
  28.  
  29. //带参函数的调用
  30. res2 := f2.(func(string) string)("hello world,plugin.so")
  31. fmt.Println(res2)
  32. }

本文参考:CSDN

原文地址:https://blog.csdn.net/x356982611/article/details/80701253

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go