Heim >Backend-Entwicklung >Golang >Wie rufe ich die Signatur einer Go-Funktion als String ab?

Wie rufe ich die Signatur einer Go-Funktion als String ab?

Linda Hamilton
Linda HamiltonOriginal
2024-12-03 10:55:15843Durchsuche

How to Retrieve a Go Function's Signature as a String?

Abrufen der Signatur einer Funktion als String in Go

Problem:

In einem Go-Modul, das zum Laden von Plugins entwickelt wurde, Es ist wichtig sicherzustellen, dass im Hauptpaket eine bestimmte Funktion mit einem vorgegebenen Namen und einer vorgegebenen Signatur vorhanden ist. Fehlt diese Funktion oder entspricht sie nicht der erwarteten Signatur, ist eine beschreibende Fehlermeldung erforderlich. Wie kann bei gegebener Funktionstypvariable die zugrunde liegende Signatur erhalten werden?

Lösung:

Die bloße Verwendung von „reflect.Type.String()“ liefert nur den Namen des Typs. wie main.ModuleInitFunc. Um die vollständige Signatur abzurufen, müssen wir sie manuell anhand der von Reflect.Type bereitgestellten Informationen erstellen.

Implementierung:

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()
}

Verwendung:

Indem wir eine Funktionsvariable an die Funktion „signatur()“ übergeben, können wir die entsprechende Signatur als String erhalten. Zum Beispiel:

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(""))

Ausgabe:

func (int) error
func (int) error
func () time.Time
func (string) (*os.File, error)
func (io.Writer, string, int) *log.Logger
<not a function>

Hinweis:

Es ist wichtig zu erkennen, dass es unmöglich ist um die Namen der Parameter und Ergebnistypen aus der Signatur zu extrahieren, da Go diese Informationen nicht speichert oder Zugriff darauf bietet.

Das obige ist der detaillierte Inhalt vonWie rufe ich die Signatur einer Go-Funktion als String ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn