package ln import ( "os" "runtime" "strings" ) type frame struct { filename string function string lineno int } // skips 2 frames, since Caller returns the current frame, and we need // the caller's caller. func callersFrame() frame { var out frame pc, file, line, ok := runtime.Caller(3) if !ok { return out } srcLoc := strings.LastIndex(file, "/src/") if srcLoc >= 0 { file = file[srcLoc+5:] } out.filename = file out.function = functionName(pc) out.lineno = line return out } func functionName(pc uintptr) string { fn := runtime.FuncForPC(pc) if fn == nil { return "???" } name := fn.Name() beg := strings.LastIndex(name, string(os.PathSeparator)) return name[beg+1:] // end := strings.LastIndex(name, string(os.PathSeparator)) // return name[end+1 : len(name)] }