package errorsimport ()// Frame represents a program counter inside a stack frame.// For historical reasons if Frame is interpreted as a uintptr// its value represents the program counter + 1.typeFrameuintptr// pc returns the program counter for this frame;// multiple frames may have the same PC value.func ( Frame) () uintptr { returnuintptr() - 1 }// file returns the full path to the file that contains the// function for this Frame's pc.func ( Frame) () string { := runtime.FuncForPC(.pc())if == nil {return"unknown" } , := .FileLine(.pc())return}// line returns the line number of source code of the// function for this Frame's pc.func ( Frame) () int { := runtime.FuncForPC(.pc())if == nil {return0 } , := .FileLine(.pc())return}// name returns the name of this function, if known.func ( Frame) () string { := runtime.FuncForPC(.pc())if == nil {return"unknown" }return .Name()}// Format formats the frame according to the fmt.Formatter interface.//// %s source file// %d source line// %n function name// %v equivalent to %s:%d//// Format accepts flags that alter the printing of some verbs, as follows://// %+s function name and path of source file relative to the compile time// GOPATH separated by \n\t (<funcname>\n\t<path>)// %+v equivalent to %+s:%dfunc ( Frame) ( fmt.State, rune) {switch {case's':switch {case .Flag('+'):io.WriteString(, .name())io.WriteString(, "\n\t")io.WriteString(, .file())default:io.WriteString(, path.Base(.file())) }case'd':io.WriteString(, strconv.Itoa(.line()))case'n':io.WriteString(, funcname(.name()))case'v': .(, 's')io.WriteString(, ":") .(, 'd') }}// MarshalText formats a stacktrace Frame as a text string. The output is the// same as that of fmt.Sprintf("%+v", f), but without newlines or tabs.func ( Frame) () ([]byte, error) { := .name()if == "unknown" {return []byte(), nil }return []byte(fmt.Sprintf("%s %s:%d", , .file(), .line())), nil}// StackTrace is stack of Frames from innermost (newest) to outermost (oldest).typeStackTrace []Frame// Format formats the stack of Frames according to the fmt.Formatter interface.//// %s lists source files for each Frame in the stack// %v lists the source file and line number for each Frame in the stack//// Format accepts flags that alter the printing of some verbs, as follows://// %+v Prints filename, function, and line number for each Frame in the stack.func ( StackTrace) ( fmt.State, rune) {switch {case'v':switch {case .Flag('+'):for , := range {io.WriteString(, "\n") .Format(, ) }case .Flag('#'):fmt.Fprintf(, "%#v", []Frame())default: .formatSlice(, ) }case's': .formatSlice(, ) }}// formatSlice will format this StackTrace into the given buffer as a slice of// Frame, only valid when called with '%s' or '%v'.func ( StackTrace) ( fmt.State, rune) {io.WriteString(, "[")for , := range {if > 0 {io.WriteString(, " ") } .Format(, ) }io.WriteString(, "]")}// stack represents a stack of program counters.type stack []uintptrfunc ( *stack) ( fmt.State, rune) {switch {case'v':switch {case .Flag('+'):for , := range * { := Frame()fmt.Fprintf(, "\n%+v", ) } } }}func ( *stack) () StackTrace { := make([]Frame, len(*))for := 0; < len(); ++ { [] = Frame((*)[]) }return}func callers() *stack {const = 32var []uintptr := runtime.Callers(3, [:])varstack = [0:]return &}// funcname removes the path prefix component of a function's name reported by func.Name().func funcname( string) string { := strings.LastIndex(, "/") = [+1:] = strings.Index(, ".")return [+1:]}
The pages are generated with Goldsv0.6.7. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds.