Heim >Backend-Entwicklung >Golang >Wie kann ich den aktuellen Funktionsnamen im Go-Code abrufen?

Wie kann ich den aktuellen Funktionsnamen im Go-Code abrufen?

Susan Sarandon
Susan SarandonOriginal
2024-12-15 08:45:14743Durchsuche

How Can I Get the Current Function Name in Go Code?

Introspektion des Go-Codes: Abrufen des aktuellen Funktionsnamens

In Go ist das Abrufen des aktuellen Funktionsnamens für das Debuggen und Tracing von entscheidender Bedeutung. Das Makro FUNCTION in gcc stellt diese Funktionalität bereit, und wir möchten sie in Go emulieren.

Lösung

Der Schlüssel liegt im Laufzeitpaket. Hier ist eine Lösung:

import (
    "fmt"
    "runtime"
)

func trace() {
    pc := make([]uintptr, 10) // Need at least 1 entry
    runtime.Callers(2, pc)
    f := runtime.FuncForPC(pc[0])
    file, line := f.FileLine(pc[0])
    fmt.Printf("%s:%d %s\n", file, line, f.Name())
}

Diese Funktion funktioniert wie folgt:

  1. Programmzähler (PC) abrufen:Wir verwenden runtime.Callers, um den PC abzurufen die aktuellen Funktions- und Aufrufstapelrahmen. Wir geben eine Tiefe von 2 an, um die Trace-Funktion selbst zu überspringen.
  2. Funktionsdetails abrufen: Mit runtime.FuncForPC rufen wir das Func-Objekt ab, das dem PC entspricht. Dieses Objekt bietet Zugriff auf den Funktionsnamen, die Zeilennummer und den Dateinamen.
  3. Funktionsinformationen drucken: Zum Schluss drucken wir den Dateinamen, die Zeilennummer und den Namen der Funktion aus.

Aktualisiertes Beispiel

Für Go-Versionen 1.7 ist die empfohlene Vorgehensweise die Verwendung runtime.CallersFrames anstelle von runtime.FuncForPC. Ein aktualisiertes Beispiel unten:

import (
    "fmt"
    "runtime"
)

func trace() {
    pc := make([]uintptr, 10) // Need at least 1 entry
    runtime.CallersFrames(2, pc)
    frame, _ := runtime.CallersFrames(2, pc)
    fmt.Printf("%s:%d %s\n", frame[0].File, frame[0].Line, frame[0].Function)
}

Das obige ist der detaillierte Inhalt vonWie kann ich den aktuellen Funktionsnamen im Go-Code abrufen?. 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