扩展我的评论,这是一些返回当前func调用者的代码
import( "fmt" "runtime")func getframe(skipframes int) runtime.frame { // We need the frame at index skipframes+2, since we never want runtime.Callers and getframe targetframeIndex := skipframes + 2 // Set size to targetframeIndex+2 to ensure we have room for one more caller than we need programCounters := make([]uintptr, targetframeIndex+2) n := runtime.Callers(0, programCounters) frame := runtime.frame{Function: "unknown"} if n > 0 { frames := runtime.Callersframes(programCounters[:n]) for more, frameIndex := true, 0; more && frameIndex <= targetframeIndex; frameIndex++ { var frameCandidate runtime.frame frameCandidate, more = frames.Next() if frameIndex == targetframeIndex { frame = frameCandidate } } } return frame}// MyCaller returns the caller of the function that called it :)func MyCaller() string { // Skip GetCallerFunctionName and the function to get the caller of return getframe(2).Function}// foo calls MyCallerfunc foo() { fmt.Println(MyCaller())}// bar is what we want to see in the output - it is our "caller"func bar() { foo()}func main(){ bar()}有关更多示例:https :
//play.golang.org/p/cv-SpkvexuM



