This is a fairly niche problem, but I'm currently trying to write a conventions-based settings storage library with golang. It would be a great API boon if I could programmatically determine the running package name that wants to store something (eg "github.net/author/projectname/pkg"
) calling my library function.
With Python a similar thing could be achieved with the inspect
module, or even with __main__.__file__
and a look at the file system.
You can get similar information if you use the following functions:
The code may look like this:
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())
If I put the above code (with the 1st line changed into runtime.Caller(0)
) into a (randomly chosen) Go library which I have installed in GOROOT
, it prints:
134626026 /tmp/go-build223663414/github.com/mattn/go-gtk/gtk/_obj/gtk.cgo1.go -4585 true
github.com/mattn/go-gtk/gtk.Init
Or it prints:
134515752 /home/user/go/src/github.com/mattn/go-gtk/example/event/event.go 12 true
main.main
The filename on the 1st line, and the 2nd line, seem to contain the information you are looking for.
There are two problems:
It may give incorrect result if functions are automatically inlined by the compiler
For any function F
defined in package main
, the function name is just main.F
. For example, if runtime.Caller(0)
is called from main()
, the function name is main.main
even if the main()
function is defined in a Go file found in GOROOT/src/github.com/mattn/go-gtk/...
. In this case, the output from runtime.Caller
is more useful than the output from runtime.FuncForPC
.