@LIUHUAN
2020-04-06T18:17:17.000000Z
字数 757
阅读 1120
Blog
// Add.go
package main
import (
"fmt"
)
type Number struct {
A, B int32
}
func (n *Number) String() string {
return fmt.Sprintf("[%d,%d]", n.A, n.B)
}
func (n *Number) Add() int32 {
return n.A + n.B
}
var Num Number
func Hello(s string) string {
return fmt.Sprintf("hello %s,%+v,%d", s, Num, Num.Add())
}
func main() {}
go build --buildmode=plugin Add.go
会生成Add.so
的动态链接库
插件使用
// main.go
package main
import (
"log"
"plugin"
)
func main() {
fname := "Add.so"
p, err := plugin.Open(fname)
if err != nil {
log.Println(err)
return
}
h, err := p.Lookup("Hello")
if err != nil {
log.Println(err)
return
}
hf := h.(func(string) string)
r := hf("liuhuan")
log.Println(r)
}
go run main.go
Add.so
放在当前目录下或者在代码(fname)里指定目录dlopen()
方法,所以plugin方式支持有目前有maxos,FreeBSD,linux等系统,不适用于Windows系统