plugin.go
- /************************************************************
- go build --buildmode=plugin plugin.go
- **********************************************************/
-
- package main
-
- import (
- "fmt"
- )
-
- func DCall(){
- fmt.Println("plugin.so was called")
- }
-
- func DCallWithParam(msg string){
- fmt.Println("参数内容为:",msg)
- }
-
-
- func main() {
- fmt.Println("goroute全部退出")
- }
pluginLoad.go
- package main
-
- import (
- "plugin"
- )
-
- func main() {
-
- //加载动态库
- p, err := plugin.Open("plugin.so")
- if err != nil {
- panic(err)
- }
- //查找函数
- f, err := p.Lookup("DCall")
- if err != nil {
- panic(err)
- }
- //转换类型后调用函数
- f.(func())()
-
- f2, err := p.Lookup("DCallWithParam")
- if err != nil {
- panic(err)
- }
-
- //带参函数的调用
- f2.(func(string))("hello world,plugin.so")
- }
生成动态库文件:
go build --buildmode=plugin plugin.go
执行go run指令
go run pluginLoad.go
注意:目前go动态库的生产只支持Linux
带返回参数的调用
plugin.go
- package main
-
- import "C"
- import (
- "fmt"
- )
-
- func DCall() int {
- return 2
- }
-
- func DCallWithParam(msg string) string {
- return msg
- }
-
-
- func main() {
- fmt.Println("goroute全部退出")
- }
pluginLoad.go
- package main
-
- import "C"
- import (
- "fmt"
- "plugin"
- )
-
- func main() {
- //加载动态库
- p, err := plugin.Open("plugin.so")
- if err != nil {
- panic(err)
- }
- //查找函数
- f, err := p.Lookup("DCall")
- if err != nil {
- panic(err)
- }
- //转换类型后调用函数
- res := f.(func() int)()
- fmt.Println(res)
-
- f2, err := p.Lookup("DCallWithParam")
- if err != nil {
- panic(err)
- }
-
- //带参函数的调用
- res2 := f2.(func(string) string)("hello world,plugin.so")
- fmt.Println(res2)
- }
本文参考:CSDN
原文地址:https://blog.csdn.net/x356982611/article/details/80701253