...

パッケージ plugin

import "plugin"
概要
目次

概要 ▾

plugin パッケージは,Go プラグインの読み込みやシンボル解決を実装します。

プラグインは,エクスポートされた関数と変数を含む Go メインパッケージです。

go build -buildmode=plugin

プラグインが最初に開かれると,まだプログラムの一部ではないすべてのパッケージの init 関数が呼び出されます。 メイン関数は実行されません。 プラグインは一度だけ初期化され,閉じることはできません。

現在プラグインは Linux と macOS でのみサポートされています。 問題があれば報告してください。

type Plugin 1.8

Plugin はロードされた Go プラグインです。

type Plugin struct {
    // エクスポートされていないフィールドがあります
}

func Open 1.8

func Open(path string) (*Plugin, error)

Open は Go プラグインを開きます。 パスがすでに開かれている場合は,既存の *Plugin が返されます。 複数のゴルーチンによる平行使用は安全です。

func (*Plugin) Lookup 1.8

func (p *Plugin) Lookup(symName string) (Symbol, error)

Lookup はプラグイン p で symName という名前のシンボルを検索します。 シンボルはエクスポートされた変数または関数です。 シンボルが見つからない場合はエラーを報告します。 複数のゴルーチンによる平行使用は安全です。

type Symbol 1.8

Symbol は,変数または関数へのポインタです。

例えば,以下のように定義されたプラグイン

package main

import "fmt"

var V int

func F() { fmt.Printf("Hello, number %d\n", V) }

は,Open 関数を使ってロードし,エクスポートされたパッケージシンボル V と F に​​アクセスすることができます。

p, err := plugin.Open("plugin_name.so")
if err != nil {
	panic(err)
}
v, err := p.Lookup("V")
if err != nil {
	panic(err)
}
f, err := p.Lookup("F")
if err != nil {
	panic(err)
}
*v.(*int) = 7
f.(func())() // "Hello, number 7" と表示します。
type Symbol interface{}