рдкрд┐рдЫрд▓реЗ рдПрдХ рджрд╢рдХ рдореЗрдВ, рд╣рдордиреЗ рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рджреЛрд╣рди рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЧреЛ
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдорд░реНрдерди рдерд╛: рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдБред
errors.New
рдФрд░
fmt.Errorf
рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджреЗрд╢ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ - рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЧреЛ-рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрд┐рд╕реА рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐
Error
рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
type QueryError struct { Query string Err error } func (e *QueryError) Error() string { return e.Query + ": " + e.Err.Error() }
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕реЗ рд▓реЗрдХрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рд╕рд░реНрд╡рд░ рдкрддреЗ рддрдХ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВред рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ, рдЕрдХреНрд╕рд░ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рд╣реИрдВред
рдкреИрдЯрд░реНрди, рдЬрдм рдПрдХ рддреНрд░реБрдЯрд┐ рдореЗрдВ рджреВрд╕рд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЧреЛ рдореЗрдВ рдЕрдХреНрд╕рд░ рд╕рд╛рдордирд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ 1.13 рдореЗрдВ рдПрдХ
рдЧрд░реНрдо рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж рдЗрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ: рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рддреАрди рдирдП рдХрд╛рд░реНрдп рдФрд░
fmt.Errorf
рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕реНрд╡рд░реВрдкрдг рдЖрджреЗрд╢ред
рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
1.13 рд╕реЗ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ
рддреНрд░реБрдЯрд┐ рдЕрдиреБрд╕рдВрдзрд╛рди
рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрд░реНрде рд╣реИрдВред рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╛рд░, рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдСрдкрд░реЗрд╢рди рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред
if err != nil {
рдХрднреА-рдХрднреА рд╣рдо
рдирд┐рдпрдВрддреНрд░рдг рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИред
var ErrNotFound = errors.New("not found") if err == ErrNotFound {
рддреНрд░реБрдЯрд┐ рдорд╛рди рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдпрд╛рди рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
type NotFoundError struct { Name string } func (e *NotFoundError) Error() string { return e.Name + ": not found" } if e, ok := err.(*NotFoundError); ok {
рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛
рдЕрдХреНрд╕рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реБрдЖ, рдЗрд╕рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдгред рдпрд╣ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдмрд╕ рдПрдХ рдирдИ рддреНрд░реБрдЯрд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдкрд╛рда рд╢рд╛рдорд┐рд▓ рд╣реЛ:
if err != nil { return fmt.Errorf("decompress %v: %v", name, err) }
fmt.Errorf
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдИ рддреНрд░реБрдЯрд┐
fmt.Errorf
рд╣рдо рдореВрд▓ рддреНрд░реБрдЯрд┐ рд╕реЗ рдкрд╛рда рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рддреНрдпрд╛рдЧ рджреЗрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ
QueryError
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдПрдХ рдирдИ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:
type QueryError struct { Query string Err error }
рдХрд╛рд░реНрдпрдХреНрд░рдо
*QueryError
рдЕрдВрджрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХрднреА-рдХрднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдЕрд▓рд┐рдЦрд┐рдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
if e, ok := err.(*QueryError); ok && e.Err == ErrPermission {
рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ
os.PathError
рдкреНрд░рдХрд╛рд░ рдПрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИред
1.13 рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ
рдЕрдирд╡рд╛рдк рд╡рд┐рдзрд┐
1.13 рдореЗрдВ,
errors
рдФрд░
fmt
рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдХреБрд▓
fmt
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдореНрдореЗрд▓рди рд╣реИ, рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ: рдПрдХ рддреНрд░реБрдЯрд┐ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реИ, рд╡рд╣
Unwrap
рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐
e1.Unwrap()
рд░рд┐рдЯрд░реНрди
e2
, рддреЛ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐
e1
e2
рдкреИрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк
e2
рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
e1
рдХреЛ
рдЕрдирдкреИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдЕрдзрд┐рд╡реЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдк
QueryError
рдкрджреНрдзрддрд┐ рдХреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд
QueryError
рдкреНрд░рдХрд╛рд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:
func (e *QueryError) Unwrap() error { return e.Err }
рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ
Unwrap
рд╡рд┐рдзрд┐ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдмрд╛рд░-рдмрд╛рд░ рдЕрдирдкреИрдХрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХреНрд░рдо, рд╣рдо
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ ред
Is рдФрд░ As рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ
1.13 рдореЗрдВ,
errors
рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП
errors
рдкреИрдХреЗрдЬ рдореЗрдВ рджреЛ рдирдП рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
Is
рдФрд░
As
ред
errors.Is
рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред
As
рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИред
рд╕рд░рд▓рддрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
errors.Is
ред
errors.Is
рдлрдВрдХреНрд╢рди рдПрдХ рдХрдВрдЯреНрд░реЛрд▓ рдПрд░рд░ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрд░рд░ред
errors.As
рдлрдВрдХреНрд╢рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреИрдХреНрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдпреЗ рдлрд╝рдВрдХреНрд╢рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВред рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░
QueryError
рдХреЗ
QueryError
рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ:
if e, ok := err.(*QueryError); ok && e.Err == ErrPermission {
errors.Is
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
errors.Is
рдлрд╝рдВрдХреНрд╢рди,
errors.Is
рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
if errors.Is(err, ErrPermission) {
errors
рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдирдпрд╛
Unwrap
рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЗ
Unwrap
рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ
Unwrap
рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ nil рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░
errors.Is
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░
errors.Is
рдпрд╛
errors.As
рдХреЗ рдмрд╛рдж рд╕реЗ, рд╡реЗ рдЖрдкрдХреЛ рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
% W рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬрд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП
fmt.Errorf
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рд╣реИред
if err != nil { return fmt.Errorf("decompress %v: %v", name, err) }
1.13 рдореЗрдВ,
fmt.Errorf
рдлрд╝рдВрдХреНрд╢рди рдирдП
%w
рдХрдорд╛рдВрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ
fmt.Errorf
рджреНрд╡рд╛рд░рд╛
fmt.Errorf
рдЧрдИ рддреНрд░реБрдЯрд┐ рдореЗрдВ
fmt.Errorf
рдкрджреНрдзрддрд┐ рд╣реЛрдЧреА рдЬреЛ
%w
рддрд░реНрдХ рд▓реМрдЯрд╛рддреА рд╣реИ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ,
%w
,
%v
рд╕рдорд╛рди рд╣реИред
if err != nil {
%w
рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ
errors.Is
рдпрд╣
errors.Is
рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИред
errors.Is
рдФрд░
errors.As
ред
err := fmt.Errorf("access denied: %w", ErrPermission) ... if errors.Is(err, ErrPermission) ...
рдХрдм рдкреИрдХ рдХрд░реЗрдВ?
рдЬрдм рдЖрдк
fmt.Errorf
рдпрд╛ рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдирдИ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдореВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдХреЛрдИ рдПрдХ рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдЙрд╕ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирдИ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИред рдЙрд╕реЗ рдХреЙрд▓рд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХ рдХрд░реЗрдВред рдпрджрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреИрдХреЗрдЬ рди рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ
io.Reader
рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬреЛ
io.Reader
рд╕реЗ рдПрдХ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ
io.Reader
ред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдЙрд╕ рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реБрдЖ рдерд╛ред рдпрджрд┐
io.Reader
рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдХреЙрд▓рд░ рдХреЛ
io.Reader
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдПрдХ рдЕрдиреНрдп рдорд╛рдорд▓рд╛: рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЗрди рдХреЙрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рддреЛ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдирд╛ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐
pkg
рдкреИрдХреЗрдЬ рд╕реЗ
LookupUser
рдлрд╝рдВрдХреНрд╢рди Go
database/sql
рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣
sql.ErrNoRows
рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк
fmt.Errorf("accessing DB: %v", err)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐
fmt.Errorf("accessing DB: %v", err)
, рддреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдВрджрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░
sql.ErrNoRows
рдвреВрдВрдв
sql.ErrNoRows
ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдлрд╝рдВрдХреНрд╢рди
fmt.Errorf("accessing DB: %w", err)
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ
fmt.Errorf("accessing DB: %w", err)
рд▓рд┐рдЦ рд╕рдХрддреА рд╣реИ:
err := pkg.LookupUser(...) if errors.Is(err, sql.ErrNoRows) тАж
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдореЗрд╢рд╛
sql.ErrNoRows
рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реБрдП рднреА рдирд╣реАрдВ рддреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкреИрдХреЗрдЬрд┐рдВрдЧ рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдкреИрдХреЗрдЬ рди рдХрд░реЗрдВред
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЪрд╛рд╣реЗ рдЖрдк рдЗрд╕реЗ рдкреИрдХ рдХрд░реЗрдВ рдпрд╛ рдирд╣реАрдВ, рддреНрд░реБрдЯрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧреАред
рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЗрд╕реЗ рд╕рдордЭреЗрдЧрд╛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛
рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдЕрдзрд┐рдХ рд╕реВрдЪрд┐рдд рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХреЗрдВ; рдпрд╛ рдпрджрд┐ рдЖрдк рдЕрдореВрд░реНрдд рдХреЗ рд╕реНрддрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдИрдЬрд╝ рдПрдВрдб рдЕрд╕ рдореЗрдердбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдХрд░рдирд╛
errors.Is
рдлрд╝рдВрдХреНрд╢рди рд▓рдХреНрд╖реНрдп рдорд╛рди рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рддреНрд░реБрдЯрд┐ рдЗрд╕ рдорд╛рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдпрджрд┐ рд╡реЗ рд╕рдордХрдХреНрд╖ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдХреНрд╖реНрдп рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреА рд╣реИред
Upspin рдкреИрдХреЗрдЬ рдХреЗ рдХрд╛рд░рдг рд╣реБрдИ рддреНрд░реБрдЯрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдиреЙрдирдЬрд░реЛ рдлрд╝реАрд▓реНрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреА рд╣реИ:
type Error struct { Path string User string } func (e *Error) Is(target error) bool { t, ok := target.(*Error) if !ok { return false } return (e.Path == t.Path || t.Path == "") && (e.User == t.User || t.User == "") } if errors.Is(err, &Error{User: "someuser"}) {
errors.As
ред
errors.As
рд╕рдорд╛рд░реЛрд╣ рднреА рд╡рд┐рдзрд┐ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╣реЛред
рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рдкреИрдХреЗрдЬ рдПрдкреАрдЖрдИ
рдПрдХ рдкреИрдХреЗрдЬ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреИрдХреЗрдЬ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ) рдХреЛ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрдХреЗрдЬ рдЙрди рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕реА рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднреА рдмрдЪ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдСрдкрд░реЗрд╢рди рд╕рдлрд▓ рд░рд╣рд╛ рдерд╛, рдХреНрд░рдорд╢рдГ, рдореВрд▓реНрдп рд╢реВрдиреНрдп рдпрд╛ рдЧреИрд░-рд╢реВрдиреНрдпред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рддрддреНрд╡ рдирд╣реАрдВ рдорд┐рд▓рд╛", рддреЛ рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдореВрд▓реНрдп рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
var ErrNotFound = errors.New("not found")
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдкреИрдЯрд░реНрди рд╣реИрдВ рдЬреЛ рдХреЙрд▓рд░ рдХреЛ рд╢рдмреНрджрд╛рд░реНрде рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реАрдзреЗ рдирд┐рдпрдВрддреНрд░рдг рдореВрд▓реНрдп, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░, рдпрд╛ рдПрдХ рдореВрд▓реНрдп рдЬреЛ рдПрдХ рд╡рд┐рдзреЗрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЛ рдкреНрд░рдХрдЯ рди рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ "рдЬрдм рдпрд╣ рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?", рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рди рдмрджрд▓реЗрдВ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рди рдХрд░реЗрдВред
f, err := os.Open(filename) if err != nil {
рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдкреИрдХреНрдб рд╕рд┐рдЧреНрдирд▓ рдорд╛рди рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕реАрдзреЗ рдореВрд▓ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рди рдХрд░реЗрдВред
var ErrPermission = errors.New("permission denied")
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрджреНрдпрдкрд┐ рд╣рдордиреЗ рдХреЗрд╡рд▓ рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдПрдХ рдкреНрд░рд╛рд░реВрдкрдг рдЖрджреЗрд╢ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЧреЛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬрд┐рдВрдЧ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рдмрди рдЬрд╛рдПрдЧрд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмреЗрд╣рддрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдФрд░ рдмрдЧ рдХреЛ рддреЗрдЬреА рд╕реЗ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐
рд░реЛрд╕ рдХреЙрдХреНрд╕ рдиреЗ
рдЧреЛрдлрд░рдХреЙрди 2019 рдореЗрдВ рдЕрдкрдиреЗ
рднрд╛рд╖рдг рдореЗрдВ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдЧреЛ 2 рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╣рдо рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдЬ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрдм, рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рднреЗрдЬрдирд╛, рд╣рдордиреЗ рдирдП рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред