問題:
プラグインをロードするように設計された Go モジュールでは、事前に決定された名前と署名を持つ特定の関数がメイン パッケージ内に存在することを確認することが重要です。この関数が存在しないか、予期される署名と一致しない場合は、説明的なエラー メッセージが必要です。関数型変数が与えられた場合、基礎となるシグネチャはどのように取得できますか?
解決策:
単にreflect.Type.String()に依存するだけでは、型の名前が提供されるだけです。 main.ModuleInitFunc など。完全な署名を取得するには、reflect.Type によって提供される情報を使用して手動で構築する必要があります。
実装:
func signature(f interface{}) string { t := reflect.TypeOf(f) if t.Kind() != reflect.Func { return "<not a function>" } buf := strings.Builder{} buf.WriteString("func (") for i := 0; i < t.NumIn(); i++ { if i > 0 { buf.WriteString(", ") } buf.WriteString(t.In(i).String()) } buf.WriteString(")") if numOut := t.NumOut(); numOut > 0 { if numOut > 1 { buf.WriteString(" (") } else { buf.WriteString(" ") } for i := 0; i < t.NumOut(); i++ { if i > 0 { buf.WriteString(", ") } buf.WriteString(t.Out(i).String()) } if numOut > 1 { buf.WriteString(")") } } return buf.String() }
使用法:
関数変数をsignature()関数に渡すことで、対応する署名を 弦。例:
var myFunc ModuleInitFunc fmt.Println(signature(func(i int) error { return nil })) fmt.Println(signature(myFunc)) fmt.Println(signature(time.Now)) fmt.Println(signature(os.Open)) fmt.Println(signature(log.New)) fmt.Println(signature(""))
出力:
func (int) error func (int) error func () time.Time func (string) (*os.File, error) func (io.Writer, string, int) *log.Logger <not a function>
注:
それは不可能であることを認識することが重要ですGo は署名を保存したりアクセスを提供したりしないため、署名からパラメーターと結果の型の名前を抽出します。情報。
以上がGo 関数の署名を文字列として取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。