|  | // Copyright 2018 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package fmt | 
|  |  | 
|  | import "errors" | 
|  |  | 
|  | // Errorf formats according to a format specifier and returns the string as a | 
|  | // value that satisfies error. | 
|  | // | 
|  | // If the format specifier includes a %w verb with an error operand, | 
|  | // the returned error will implement an Unwrap method returning the operand. It is | 
|  | // invalid to include more than one %w verb or to supply it with an operand | 
|  | // that does not implement the error interface. The %w verb is otherwise | 
|  | // a synonym for %v. | 
|  | func Errorf(format string, a ...interface{}) error { | 
|  | p := newPrinter() | 
|  | p.wrapErrs = true | 
|  | p.doPrintf(format, a) | 
|  | s := string(p.buf) | 
|  | var err error | 
|  | if p.wrappedErr == nil { | 
|  | err = errors.New(s) | 
|  | } else { | 
|  | err = &wrapError{s, p.wrappedErr} | 
|  | } | 
|  | p.free() | 
|  | return err | 
|  | } | 
|  |  | 
|  | type wrapError struct { | 
|  | msg string | 
|  | err error | 
|  | } | 
|  |  | 
|  | func (e *wrapError) Error() string { | 
|  | return e.msg | 
|  | } | 
|  |  | 
|  | func (e *wrapError) Unwrap() error { | 
|  | return e.err | 
|  | } |