Though it does SOUND like what you are wanting is different functionality based on where CallFunc was called from. Which does sound like something it would make sense to do with a parameter.
Dean’s suggestion is great if you’re looking for a call stack in a format that’s good for anyone familiar with Go stack traces. If you’re looking just for the calling function’s name, you can do something like this:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Println("from main:", CallerName(0))
func2()
}
func func2() {
fmt.Println("from func2:", CallerName(0))
fmt.Println(CallerName(0), "called by", CallerName(1))
}
func CallerName(skip int) string {
pc, _, _, ok := runtime.Caller(skip + 1)
if !ok {
return ""
}
f := runtime.FuncForPC(pc)
if f == nil {
return ""
}
return f.Name()
}
Note that this will contain the “fully-qualified” function name. Functions in the main package are just main.<func name>, but non-main packages will have something like the full package name (e.g. (*github.com/account/project/package.Type).Func)