ホームページ  >  記事  >  バックエンド開発  >  Go 関数の完全な署名をプログラムで文字列として取得するにはどうすればよいですか?

Go 関数の完全な署名をプログラムで文字列として取得するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-19 18:05:03254ブラウズ

How to Programmatically Get a Go Function's Full Signature as a String?

Go で関数の署名を文字列として取得する方法

Go 開発のコンテキストでは、関数の署名をプログラムで次のように取得する必要があるシナリオに遭遇することがあります。文字列。これを実現する方法を理解することは、高度な型イントロスペクションとエラー処理を実行するために非常に重要です。

バックグラウンド

Go のリフレクト パッケージは、関数のreflect.Type を取得する機能を含む広範なリフレクション機能を提供します。ただし、reflect.Type.String() は型名のみを返すため、必ずしも十分な情報が提供されるわけではありません。

署名の取得

完全な関数署名を取得するには、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()
}

使用例

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。