Go Plugin 示例项目教程
1. 项目的目录结构及介绍
go-plugin-example/
├── eng/
│ ├── eng.so
│ └── greeter.go
├── chi/
│ ├── chi.so
│ └── greeter.go
├── Makefile
├── README.md
├── main.go
└── plugin.go
eng/
和chi/
目录:分别包含英文和中文的插件实现文件。每个目录下有一个.so
文件和一个greeter.go
文件。Makefile
:用于编译插件的 Makefile 文件。README.md
:项目说明文档。main.go
:主程序文件,用于加载和使用插件。plugin.go
:插件加载和使用的辅助文件。
2. 项目的启动文件介绍
main.go
main.go
是项目的启动文件,负责加载和调用插件。以下是 main.go
的主要内容:
package main
import (
"fmt"
"plugin"
)
func main() {
// 加载英文插件
p, err := plugin.Open("eng/eng.so")
if err != nil {
panic(err)
}
symGreeter, err := p.Lookup("Greeter")
if err != nil {
panic(err)
}
greeter := symGreeter.(func() string)
fmt.Println(greeter())
// 加载中文插件
p, err = plugin.Open("chi/chi.so")
if err != nil {
panic(err)
}
symGreeter, err = p.Lookup("Greeter")
if err != nil {
panic(err)
}
greeter = symGreeter.(func() string)
fmt.Println(greeter())
}
plugin.go
plugin.go
文件包含插件加载和使用的辅助函数。以下是 plugin.go
的主要内容:
package main
import (
"plugin"
)
// LoadPlugin 加载插件并返回 Greeter 函数
func LoadPlugin(path string) (func() string, error) {
p, err := plugin.Open(path)
if err != nil {
return nil, err
}
symGreeter, err := p.Lookup("Greeter")
if err != nil {
return nil, err
}
return symGreeter.(func() string), nil
}
3. 项目的配置文件介绍
该项目没有传统的配置文件,插件的加载和使用通过代码动态实现。插件的路径和名称在 main.go
中硬编码,可以根据需要进行修改。
Makefile
Makefile
用于编译插件,以下是 Makefile
的主要内容:
all: eng chi
eng:
go build -buildmode=plugin -o eng/eng.so eng/greeter.go
chi:
go build -buildmode=plugin -o chi/chi.so chi/greeter.go
clean:
rm -f eng/eng.so chi/chi.so
通过运行 make
命令,可以编译生成 eng/eng.so
和 chi/chi.so
插件文件。