コンピュータ ソフトウェア システムの規模が拡大し続けるにつれて、プログラムの拡張性がほとんどの企業やチームの焦点になっています。スケーラビリティを実現する一般的な方法は、プラグ可能なアーキテクチャを使用することです。プラグイン機構により、プログラムのコードを直接変更することなく、いつでもプログラムの機能を拡張できます。従来のモジュラー アーキテクチャと比較して、プラグイン アーキテクチャはより柔軟で、凝集性が高く、管理しやすくなっています。この記事では、golang 言語でプラグイン機構を設計および実装する方法を紹介します。
package plugin type CalculatorPlugin interface { GetName() string Add(int, int) int Sub(int, int) int }プラグイン コードの記述
AddPlugin は、GetName() と Add() という 2 つのメソッドを実装します。
package main import ( "github.com/bwmarrin/discordgo" "github.com/derry6/DSGO_BOT/plugin" ) type AddPlugin struct { } func (ap *AddPlugin) GetName() string { return "加法插件" } func (ap *AddPlugin) Add(a, b int) int { return a + b } func New() plugin.CalculatorPlugin { return &AddPlugin{} } func main() {}
SubPlugin は、GetName() と Sub() という 2 つのメソッドを実装します。
package main import ( "github.com/bwmarrin/discordgo" "github.com/derry6/DSGO_BOT/plugin" ) type SubPlugin struct { } func (sp *SubPlugin) GetName() string { return "减法插件" } func (sp *SubPlugin) Sub(a, b int) int { return a - b } func New() plugin.CalculatorPlugin { return &SubPlugin{} } func main() {}
コード内で注意する必要があるのは、CalculatorPlugin インターフェイス タイプの値を返す New() 関数です。メイン プログラムは、この関数を使用してプラグインを動的に読み込みます。
プラグインのコンパイルgo build -buildmode=plugin -o add.so add.go go build -buildmode=plugin -o sub.so sub.goメイン プログラムへのプラグインのロード
func LoadPlugin(path string) (p plugin.CalculatorPlugin, err error) { plugin, err := plugin.Open(path) if err != nil { return nil, err } symbol, err := plugin.Lookup("New") if err != nil { return nil, err } return symbol.(func() plugin.CalculatorPlugin)(), nil }プラグイン関数の使用
package main import ( "fmt" "github.com/derry6/DSGO_BOT/plugin" ) func main() { addPlugin, _ := LoadPlugin("./add.so") subPlugin, _ := LoadPlugin("./sub.so") fmt.Println("插件名称: ", addPlugin.GetName()) fmt.Println("3 + 2 = ", addPlugin.Add(3, 2)) fmt.Println("插件名称: ", subPlugin.GetName()) fmt.Println("3 - 2 = ", subPlugin.Sub(3, 2)) }概要
以上がgolangでプラグインを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。