golangでプラグインを実装する方法

王林
リリース: 2023-05-10 19:59:35
オリジナル
1050 人が閲覧しました

コンピュータ ソフトウェア システムの規模が拡大し続けるにつれて、プログラムの拡張性がほとんどの企業やチームの焦点になっています。スケーラビリティを実現する一般的な方法は、プラグ可能なアーキテクチャを使用することです。プラグイン機構により、プログラムのコードを直接変更することなく、いつでもプログラムの機能を拡張できます。従来のモジュラー アーキテクチャと比較して、プラグイン アーキテクチャはより柔軟で、凝集性が高く、管理しやすくなっています。この記事では、golang 言語でプラグイン機構を設計および実装する方法を紹介します。

    #プラグインの概念
プラグインは、動的にロードしてプログラム機能を拡張できるコンポーネントを指します。プラグインは通常、メイン プログラムから独立しており、メイン プログラムの実行中にロードまたはアンロードできます。通常、プラグインには、メイン プログラムと通信するための 1 つ以上のインターフェイスが含まれています。

プラグイン アーキテクチャでは、メイン プログラムは、プラグインのロードまたはアンロード、プラグインとの通信、およびプラグイン間のコラボレーションの調整を担当します。プラグインは、提供する機能を実装し、事前定義されたインターフェイスを介して呼び出しのためにメイン プログラムに公開する責任があります。

    golang プラグイン
golang では、ダイナミック リンク ライブラリ (Dynamic Linking Libraries) を使用してプラグインを実現できます。具体的な手順は次のとおりです。

## 必要に応じてプラグインのインターフェイスまたは構造タイプを定義します。
  • プラグイン コードを作成し、ダイナミック リンク ライブラリの形式でコンパイルします。
  • メイン プログラムで関数インターフェイスまたはダイナミック ライブラリ関数呼び出しを提供し、ダイナミック リンク ライブラリをロードして、実行時にプラグイン コードを呼び出します。
  • 以下では、上記の手順をステップごとに実装します。

プラグイン インターフェイスを定義する
  1. 実装するプラグインが何を行う必要があるか、またプラグインがどのようなインターフェイスを提供するかを決定する必要があります。単純な電卓プログラムを例として、プラグイン インターフェイスを次のように定義します。
package plugin

type CalculatorPlugin interface {
    GetName() string
    Add(int, int) int
    Sub(int, int) int
}
ログイン後にコピー

プラグイン コードの記述
  1. プラグインが 2 つあると仮定します。 -ins: AddPlugin と SubPlugin。これらはすべて CalculatorPlugin インターフェイスを実装しています。

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() 関数です。メイン プログラムは、この関数を使用してプラグインを動的に読み込みます。

プラグインのコンパイル
  1. go build コマンドを使用してプラグインをコンパイルし、ダイナミック リンク ライブラリを生成します。
go build -buildmode=plugin -o add.so add.go
go build -buildmode=plugin -o sub.so sub.go
ログイン後にコピー

メイン プログラムへのプラグインのロード
  1. メイン プログラムはプラグインのロードを担当します。プラグインをロードする関数を定義する必要があります。それが配置されているパスに従って。
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
}
ログイン後にコピー

プラグイン関数の使用
  1. メインプログラムがプラグインをロードした後、プラグインの名前を取得し、加算と減算を実行できます。プラグインによって提供されるメソッドを介した操作。以下はサンプル コードです:
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))
}
ログイン後にコピー

概要
  1. golang のプラグインはダイナミック リンク ライブラリを通じて実装されます。プラグイン メカニズムを使用すると、コードは拡張性と保守性が大幅に向上します。新しい機能を追加する必要がある場合、プログラムの元のコードを変更するのではなく、対応するプラグインを作成するだけで済みます。プラグイン アーキテクチャの設計アイデアと golang でコンパイルされたプラグインの実装により、ソフトウェア エンジニアリングをより適切に設計および開発できるようになります。

以上がgolangでプラグインを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート