1// Copyright 2018 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package fmt 6 7import "errors" 8 9// Errorf formats according to a format specifier and returns the string as a 10// value that satisfies error. 11// 12// If the format specifier includes a %w verb with an error operand, 13// the returned error will implement an Unwrap method returning the operand. It is 14// invalid to include more than one %w verb or to supply it with an operand 15// that does not implement the error interface. The %w verb is otherwise 16// a synonym for %v. 17func Errorf(format string, a ...interface{}) error { 18 p := newPrinter() 19 p.wrapErrs = true 20 p.doPrintf(format, a) 21 s := string(p.buf) 22 var err error 23 if p.wrappedErr == nil { 24 err = errors.New(s) 25 } else { 26 err = &wrapError{s, p.wrappedErr} 27 } 28 p.free() 29 return err 30} 31 32type wrapError struct { 33 msg string 34 err error 35} 36 37func (e *wrapError) Error() string { 38 return e.msg 39} 40 41func (e *wrapError) Unwrap() error { 42 return e.err 43} 44