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
Freigeben: 2024-12-03 10:55:15
Original
854 Leute haben es durchsucht

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()
}
Nach dem Login kopieren

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(""))
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage