Heim > Backend-Entwicklung > Golang > Wie erhalte ich programmgesteuert die vollständige Signatur einer Go-Funktion als Zeichenfolge?

Wie erhalte ich programmgesteuert die vollständige Signatur einer Go-Funktion als Zeichenfolge?

Mary-Kate Olsen
Freigeben: 2024-11-19 18:05:03
Original
282 Leute haben es durchsucht

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

So erhalten Sie die Signatur einer Funktion als String in Go

Im Kontext der Go-Entwicklung können Sie auf Szenarien stoßen, in denen Sie die Signatur einer Funktion programmgesteuert als abrufen müssen eine Zeichenfolge. Zu verstehen, wie dies erreicht werden kann, ist für die Durchführung einer erweiterten Typintrospektion und Fehlerbehandlung von entscheidender Bedeutung.

Hintergrund

Das Reflect-Paket in Go bietet umfangreiche Reflektionsfunktionen, einschließlich der Möglichkeit, den Reflect.Type einer Funktion abzurufen. Reflect.Type.String() gibt jedoch nur den Typnamen zurück, der möglicherweise nicht immer ausreichende Informationen liefert.

Erhalten der Signatur

Um die vollständige Funktionssignatur zu erhalten, müssen wir uns mit dem Reflect befassen .Type, um die Parameter- und Ergebnistypen manuell zu extrahieren. Hier ist eine Funktion, die dies tut:

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

Beispielverwendung

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

Einschränkungen

Es ist wichtig, dies zu beachten Der Ansatz erfasst nicht die Namen von Parametern oder Ergebnistypen. Dies liegt daran, dass Go diese Informationen zur Laufzeit nicht speichert.

Das obige ist der detaillierte Inhalt vonWie erhalte ich programmgesteuert die vollständige Signatur einer Go-Funktion als Zeichenfolge?. 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