2013-07-14 15 views
8

czy jest jakaś funkcja w ruchu, która jest podobna do "_file_" lub w programie go, aby wiedzieć, kto wywołuje określoną funkcję w czasie wykonywania? W C mamy linię "_file_", którą można nazwać makrami. Jak to zrobić w podróży?_file_ lub _line_ podobne w golang

+1

[Zobacz również] (http://stackoverflow.com/q/17543546/720999) – kostix

Odpowiedz

14

Jeśli używasz pakietu log można polecić rejestratora do prefix the entries with various information. Najprawdopodobniej będziesz najbardziej zainteresowany stałą Lshortfile, co spowoduje prefiksy zgodne z d.go:23. Alternatywnie istnieje Llongfile, która drukuje pełną ścieżkę pliku (np. /a/b/c/d.go:23).

Jeśli nie chcesz korzystać z pakietu log, możesz również użyć runtime.Caller(), który jest używany przez pakiet dziennika wewnętrznie. Nie jest to tak proste jak makra C, ale można je ukryć za funkcją (i podać właściwą głębokość wywołania). Możesz na przykład see how the log package is implemented (linia 140).

+3

być jawne: 'log.SetFlags (log.Lshortfile)' 'log.Println a następnie (" Błąd! ")' wypisze "myfile.go: 8: Błąd!" – 425nesp

2

Zobacz pakiety runtime i runtime.debug aw szczególności Stack, PrintStack lub Callerfunctions.

Stos formatuje ślad stosu wywołującej goroutine do buf i zwraca liczbę bajtów zapisanych do buf. Jeśli wszystko jest prawdą, Stack formatuje ślady wszystkich innych goroutinów w buf po śladach aktualnej goroutine.

Jeśli kompilacji z informacjami debug, to wola powinna zawierać numer linii w źródle

7

(1) Napisz krótką funkcję, która wywołuje runtime.Caller()

(2) wywołać tą funkcję wszędzie chcesz uzyskać dostęp do pliku z kodem źródłowym i numer linii w czasie wykonywania.

przykład:

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 
} 

Uwaga: podanie 1 do abonenta() tak, że powraca liczbę linii, gdzie file_line() jest wywoływana, a nie w którym runtime.Caller() jest wywoływana.

fmt.Println(file_line()) // Prints this file and line number. 
Powiązane problemy