Heim  >  Artikel  >  Backend-Entwicklung  >  So erhalten Sie den Methodennamen in Golang

So erhalten Sie den Methodennamen in Golang

PHPz
PHPzOriginal
2023-04-25 09:10:451693Durchsuche

Beim Schreiben von Go-Sprachcode müssen Sie manchmal den Namen der aktuellen Funktion oder Methode zum Protokollieren oder Debuggen abrufen. In diesem Artikel wird erläutert, wie Sie den Methodennamen in der Go-Sprache erhalten.

Die Go-Sprache bietet einen Reflexionsmechanismus, um Typinformationen zur Laufzeit abzurufen. Mithilfe des Reflexionsmechanismus können Sie die Typinformationen der aktuellen Funktion oder Methode abrufen und so den Methodennamen ermitteln. Das Folgende ist ein einfaches Beispielprogramm:

package main

import (
    "fmt"
    "reflect"
    "runtime"
)

func main() {
    foo := Foo{}
    foo.Bar()
}

type Foo struct{}

func (f Foo) Bar() {
    fmt.Println(getFunctionName())
}

func getFunctionName() string {
    pc, _, _, _ := runtime.Caller(1)
    fn := runtime.FuncForPC(pc)
    return reflect.ValueOf(fn.Name()).String()
}

Führen Sie das obige Programm aus. Die Ausgabe lautet:

main.(Foo).Bar

Wie Sie sehen können, gibt die Funktion getFunctionName() den Namen der Funktion oder Methode zurück, die sie gerade aufruft. Die Funktionen runtime.Caller() und runtime.FuncForPC() werden hier verwendet, um den PC-Wert und das Funktionsobjekt des Aufrufers der aktuellen Funktion bzw. Methode abzurufen und dann den Reflexionsmechanismus zu verwenden, um den Namen des Funktionsobjekts abzurufen .

Es ist zu beachten, dass der erhaltene Funktionsname den Namen des Typs enthält, zu dem er gehört, sowie den Funktionsnamen selbst. Daher muss der erhaltene Funktionsname im Programm verarbeitet werden, um den Methodennamen oder Funktionsnamen zu extrahieren.

Nachfolgend finden Sie ein komplexeres Beispielprogramm, das zeigt, wie Sie den Namen einer Funktion oder Methode aus dem Funktionsnamen extrahieren.

package main

import (
    "fmt"
    "reflect"
    "runtime"
    "strings"
)

func main() {
    foo := Foo{}
    foo.Bar()
}

type Foo struct{}

func (f Foo) Bar() {
    fmt.Println(getMethodName())
}

func getMethodName() string {
    pc, _, _, _ := runtime.Caller(1)
    fn := runtime.FuncForPC(pc)
    fullName := fmt.Sprintf("%s", fn.Name())
    lastDotIndex := strings.LastIndex(fullName, ".")
    return fullName[lastDotIndex+1:]
}

Führen Sie das obige Programm aus. Das Ausgabeergebnis lautet:

Bar

Wie Sie sehen können, gibt die Funktion getMethodName() den Namen der Methode zurück, die sie aktuell aufruft. Hier wird die Funktion strings.LastIndex() verwendet, um die Position des letzten „.“-Zeichens im Funktionsnamen zu ermitteln, und dann wird die Zeichenfolge hinter der Position abgefangen, um den Methodennamen zu erhalten.

Es ist zu beachten, dass die Funktion getMethodName() im obigen Beispielprogramm nur zum Abrufen des Methodennamens geeignet ist. Wenn Sie den Funktionsnamen benötigen, müssen Sie eine andere Verarbeitungslogik schreiben.

Kurz gesagt, die Go-Sprache selbst bietet einige Reflexionsmechanismen, mit denen leicht Funktions- oder Methodeninformationen abgerufen werden können. Durch den Reflexionsmechanismus können wir zur Laufzeit Typinformationen und dann den Namen, die Parameter und andere Informationen von Funktionen oder Methoden abrufen, was für die Programmentwicklung, das Debuggen und die Optimierung sehr hilfreich ist.

Das obige ist der detaillierte Inhalt vonSo erhalten Sie den Methodennamen in Golang. 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