| // 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 ...any) 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 | |
| } |