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