Gibt es irgendeine Funktion in go, die ähnlich ist wie "_file_"
oder "_line_"
in gehen, um zu wissen, wer eine bestimmte Funktion während der Laufzeit aufruft? In C haben wir die "_file_"
Zeile, die als Makros aufgerufen werden kann. Wie geht das in gehen?_file_ oder _line_ ähnlich in golang
Antwort
Wenn Sie das log
Paket verwenden, können Sie den Logger prefix the entries with various information anweisen. Sie werden wahrscheinlich am meisten an der Konstante Lshortfile
interessiert sein, die zu Präfixen entlang der Linien führt. Alternativ gibt es Llongfile
, die den vollständigen Pfad der Datei (wie /a/b/c/d.go:23
) druckt. Wenn Sie das Paket log
nicht verwenden möchten, können Sie auch runtime.Caller()
verwenden, was das Protokollpaket intern verwendet. Es ist nicht so einfach wie die C-Makros, aber Sie können es hinter einer Funktion verbergen (und die korrekte Aufruftiefe angeben). Sie können see how the log package is implemented für ein Beispiel (Zeile 140).
Um explizite: 'log.SetFlags (log.Lshortfile)' und dann 'log.Println (" Fehler! ")' wird "myfile.go: 8: Fehler!" – 425nesp
Siehe runtime
und runtime.debug
Pakete und insbesondere die Stack
, PrintStack
oder Caller
functions.
Stack formatiert einen Stack-Trace der aufrufenden Goroutine in buf und gibt die Anzahl der auf buf geschriebenen Bytes zurück. Wenn alles wahr ist, stapelt das Stack-Format die Spuren aller anderen Goroutines nach der Trace für die aktuelle Goroutine in buf.
Wenn Sie mit Debug-Informationen kompilieren, dann ist dies die Zeilennummer in der Quelle enthalten sollte
(1) Schreiben Sie eine kurze Funktion, die runtime.Caller()
(2) Rufen Sie diese Funktion überall wollen Sie den Quellcode-Datei und die Zeilennummer zur Laufzeit für den Zugriff auf Anrufe.
Beispiel:
import "runtime"
func file_line() string {
_, fileName, fileLine, ok := runtime.Caller(1)
var s string
if ok {
s = fmt.Sprintf("%s:%d", fileName, fileLine)
} else {
s = ""
}
return s
}
Anmerkung: Durchgang 1 zu Caller() so, dass sie die Nummer der Zeile zurückkehrt, wo file_line() aufgerufen wird, statt wo runtime.Caller() aufgerufen wird.
fmt.Println(file_line()) // Prints this file and line number.
- 1. Scala: jaxb oder ähnlich?
- 2. Hat Golang "if x in" ähnlich wie Python?
- 3. Repeating-Funktionen (oder ähnlich)
- 4. Imagegrid-Komponente oder so ähnlich
- 5. Git und Trac (oder ähnlich)
- 6. XAML Vector in Illustrator oder ähnlich
- 7. Verwenden von Golang zum Abrufen der Windows-Leerlaufzeit (GetLastInputInfo oder ähnlich)
- 8. golang Sortierscheibe aufsteigend oder absteigend
- 9. Hilfe mit gdb Spuren (oder ähnlich)
- 10. Django oder ähnlich für zusammengesetzte Primärschlüssel
- 11. Sortieren nach Soundex (oder ähnlich) `Nähe`
- 12. Java-API für Google Maps (oder ähnlich)
- 13. Sind Delegierte und Rückrufe gleich oder ähnlich?
- 14. Vim für Word (oder so ähnlich)
- 15. Können Qt-Bibliothekskomponenten qDebug() oder ähnlich aufrufen?
- 16. Open Standard Medien (OSM) Spieler (oder ähnlich)
- 17. Java-Klasse, die String (oder ähnlich) erweitert
- 18. Bedingte Variablendeklaration in Golang?
- 19. Datenstrukturen in Golang
- 20. konvertieren Sie mehrere Dateien von .LWO in .OBJ oder ähnlich
- 21. in Golang
- 22. in golang
- 23. Rendering-Vorlage in Golang
- 24. Golang, Nullzeiger Dereferenz oder ungültige Speicheradresse
- 25. Golang. Was zu verwenden? http.ServeFile (..) oder http.FileServer (..)?
- 26. Ähnlich funktionieren in SQL
- 27. IDE spezifisch für Golang
- 28. Sollte ich ServeMux oder http direkt in Golang verwenden
- 29. Empty oder nicht erforderlich struct Felder in Golang
- 30. Überprüfen Sie leere float oder Integer-Wert in Golang
[Siehe auch] (http://stackoverflow.com/q/17543546/720999) – kostix