Вы можете получить похожую информацию, если используете следующие функции:
Код может выглядеть так:
pc, file, line, ok := runtime.Caller(1)
if !ok { /*failed*/ }
println(pc, file, line, ok)
f := runtime.FuncForPC(pc)
if f == nil { /*failed*/ }
println(f.Name())
Если я поместил приведенный выше код (с изменением 1-й строки на runtime.Caller(0)
) в (произвольно выбранную) библиотеку Go, которую я установил в GOROOT
, она напечатает:
134626026 /tmp/go-build223663414/github.com/mattn/go-gtk/gtk/_obj/gtk.cgo1.go -4585 true
github.com/mattn/go-gtk/gtk.Init
или печатает:
134515752 /home/user/go/src/github.com/mattn/go-gtk/example/event/event.go 12 true
main.main
Имя файла в 1-й строке и 2-й строке, кажется, содержит информацию, которую вы ищете.
Есть две проблемы:
Может дать неверный результат, если функции автоматически встроены компилятором
Для любой функции F
, определенной в пакете main
, имя функции просто main.F
. Например, если runtime.Caller(0)
вызывается из main()
, имя функции будет main.main
, даже если функция main()
определена в файле Go, найденном в GOROOT/src/github.com/mattn/go-gtk/...
. В этом случае вывод из runtime.Caller
более полезен, чем вывод из runtime.FuncForPC
.