Go: рдкреНрд░рд╕реНрддрд╛рд╡: рдЬрд╛рдУ 2: рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ || рдЧрд▓рдд рдкреНрд░рддреНрдпрдп

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЬреБрд▓ре░ 2017  ┬╖  519рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: golang/go

рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдП рд╣реИрдВ, рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рд╢рд┐рдХрд╛рдпрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреЛ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ

if err != nil {
    return err
}

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рд╕рд╛рдордиреЗ рдЖрддреА рд░рд╣рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдХреЗрд╡рд▓ рджреЛ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреАрди рд╣реИрдВ:

  1. рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ
  2. рдЕрд╕рдВрд╢реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ
  3. рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ

рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╕рд╛рди (рд╢рд╛рдпрдж рдмрд╣реБрдд рдЖрд╕рд╛рди) рд╣реИ (рджреЗрдЦреЗрдВ #20803)ред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрдИ рдореМрдЬреВрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд╕рдВрд╢реЛрдзрд┐рдд рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, #16225, #18721, #21146, #21155)ред рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░реНрд▓ рдФрд░ рдмреЙрд░реНрди рд╢реИрд▓ рднрд╛рд╖рд╛рдУрдВ, рднрд╛рд╖рд╛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдЙрдкрдЬрд╛рдК рд╕реНрд░реЛрддреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рдо рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рдорд╛рди рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ рдХреЙрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрд╛рдж || ред рд╡реНрдпрд╛рдХрд░рдг рд╣реИ:

PrimaryExpr Arguments "||" Expression

рдЗрд╕реА рддрд░рд╣ рд╣рдо рдПрдХ рдирдП рддрд░рд╣ рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ:

ExpressionList assign_op PrimaryExpr Arguments "||" Expression

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧреИрд░-рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг || рдмрд╛рдж рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЕрдиреБрдордд рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ error ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ || рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдЖрдмрдВрдЯрд┐рдд рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ error ред рдпрд╣ рдПрдХ рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдирд╛рдорд┐рдд рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рднреА error рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред (рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдж рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред)

рдЗрди рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдердиреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ error рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП error ред

рдЗрди рдХрдердиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдХреЙрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ, рддреЛ рдХреЙрд▓ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдмрд╛рдИрдВ рдУрд░ рдХреЗ рдСрдкрд░реЗрдВрдб рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЕрдВрддрд┐рдо рдХреЙрд▓ рдкрд░рд┐рдгрд╛рдо, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП error , рдХреА рддреБрд▓рдирд╛ nil ред рдпрджрд┐ рдЕрдВрддрд┐рдо рдХреЙрд▓ рдкрд░рд┐рдгрд╛рдо nil , рддреЛ рдПрдХ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрдИ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рддреЛ рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдоред || рдмрд╛рдж рдХрд╛ рд╡реНрдпрдВрдЬрдХ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдореЗрдВ error рдЯрд╛рдЗрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ error рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЧреИрд░-рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдЙрд╕ рджрд╛рдпрд░реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рдЪрд░ err рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реАрдзреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╣ рдкреВрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, os.Chdir рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИ

func Chdir(dir string) error {
    if e := syscall.Chdir(dir); e != nil {
        return &PathError{"chdir", dir, e}
    }
    return nil
}

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд, рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func Chdir(dir string) error {
    syscall.Chdir(dir) || &PathError{"chdir", dir, err}
    return nil
}

рдореИрдВ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЕрд╕рдВрд╢реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

FrozenDueToAge Go2 LanguageChange NeedsInvestigation Proposal error-handling

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░, рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдХрдареЛрд░ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ go1.10 рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ) рдПрдХ рдирдпрд╛ check рдХреАрд╡рд░реНрдб рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реИред

рдЗрд╕рдХреЗ рджреЛ рд░реВрдк рд╣реЛрдВрдЧреЗ: check A рдФрд░ check A, B ред

A рдФрд░ B рдХреЛ error ред рджреВрд╕рд░рд╛ рд░реВрдк рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐-рд╕рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рд░рд▓ рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдкрд╣рд▓рд╛ рдлреЙрд░реНрдо (рдЪреЗрдХ рдП)

check A рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ A ред рдЕрдЧрд░ nil , рддреЛ рдпрд╣ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ nil , рддреЛ check рдПрдХ return {<zero>}*, A рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг

  • рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ check рд╕рд╛рде рдЗрдирд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
err := UpdateDB()    // signature: func UpdateDb() error
if err != nil {
    return err
}

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

check UpdateDB()
  • рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рд╣рдо рдЕрднреА рдХрд░рддреЗ рд╣реИрдВред
a, b, err := Foo()    // signature: func Foo() (string, string, error)
if err != nil {
    return "", "", err
}

// use a and b

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

a, b, err := Foo()
check err

// use a and b

рджреВрд╕рд░рд╛ рдлреЙрд░реНрдо (рдЪреЗрдХ рдП, рдмреА)

check A, B рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ A ред рдЕрдЧрд░ nil , рддреЛ рдпрд╣ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ nil , рддреЛ check рдПрдХ return {<zero>}*, B рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рддреНрд░реБрдЯрд┐-рд╕рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рдЕрднреА рднреА A рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ B рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд return ред

рдЙрджрд╛рд╣рд░рдг

a, err := Bar()    // signature: func Bar() (string, error)
if err != nil {
    return "", &BarError{"Bar", err}
}

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

a, err := Foo()
check err, &BarError{"Bar", err}

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реИ

  • рдХрд╛ рдЙрдкрдпреЛрдЧ check рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рд╣реИ рдкрд░ рдмрдпрд╛рди error
  • рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ check рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдкрд╕реА рдорд╛рди { type }*, error

рджреЛ-рдПрдХреНрд╕рдкреАрдЖрд░ рдлреЙрд░реНрдо check A, B рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рд╣реИред B рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ A nil ред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдкрд░ рдиреЛрдЯреНрд╕

рд╕рдЬрд╛рд╡рдЯреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХреНрд▓рдВрдХреАрдпрд░ check A, B рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рддрднреА рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

if err != nil { return nil, nil, err } рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ (рдЬреЛ рдмрд╣реБрдд рдЖрдо рд╣реИ) рдХреЗ рд▓рд┐рдП check err рдЙрддрдирд╛ рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ рдЬрд┐рддрдирд╛ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдиреАрдЪреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдиреЛрдЯ рджреЗрдЦреЗрдВ)ред

рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рдиреЛрдЯреНрд╕

рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ ( check .. , рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, return ) рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рдЫреБрдкрд╛рдП рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдирд┐рд╣рд┐рдд рд░рд┐рдЯрд░реНрди рдкрд░рд┐рдЪрдпред

<do-stuff> || <handle-err> рдФрд░ <do-stuff> catch <handle-err> рдКрдкрд░, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд a, b = foo()? рдЬреИрд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд╢реЛрдзрди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд╛ рдЕрдиреБрд╕рд░рдг; рдкреВрд░реНрд╡ рдореЗрдВ || <handle-err> рдорд╢реАрдирд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреНрдпрдерд╛ рд╕рд╛рджреЗ-рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬреЛ рдмреАрдЪ рдореЗрдВ рдФрд░ рдХреЛрдб рдХреА рдПрдХ рд╕рд╛рджреЗ-рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдХрдИ рдмрд╛рд░ред

рдПрдХ check рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрджрд╛ рдмреНрд▓реЙрдХ рдореЗрдВ рдЯреЙрдк-рд▓реЗрд╡рд▓ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдХреА рдкреНрд░рдореБрдЦрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдХрдВрдЯреНрд░реЛрд▓ рдлреНрд▓реЛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реБрд░реБрдЖрддреА return )ред

рд╕рднреА 519 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

    syscall.Chdir(dir) || &PathError{"chdir", dir, e}

рд╡рд╣рд╛рдВ рд╕реЗ e рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ? рдЯрд╛рдЗрдкреЛ?

рдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдерд╛:

func Chdir(dir string) (e error) {
    syscall.Chdir(dir) || &PathError{"chdir", dir, e}
    return nil
}

(рдЕрд░реНрдерд╛рдд, рдХреНрдпрд╛ рдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐ != nil check рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд╣рд┐рдд рд╡рд╛рдкрд╕реА рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?)

рдЖрд╣, рдореЗрд░рд╛ рдЕрдкрдирд╛ рдЙрджрд╛рд╣рд░рдг рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджрд┐рдпрд╛ред рдЕрдм рддрдп: e рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП err ред рдкреНрд░рд╕реНрддрд╛рд╡ err рдХреЛ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдПрд░рд░ рд╡реИрд▓реНрдпреВ рдХреЛ рд╣реЛрд▓реНрдб рдХрд░рдиреЗ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд┐рдЪрд╛рд░ рдпрд╛ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╢реНрд░реЗрдп рджреЗрдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ @davecheney рдХреЗ рд▓рд┐рдП https://github.com/pkg/errors рд▓рд┐рдЦрд╛ рдерд╛

рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

if foo, err := thing.Nope() || &PathError{"chdir", dir, err}; err == nil || ignoreError {
}

(рдорд╛рдлреА рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ || &PathError{"chdir", dir, e} рднрд╛рдЧ рдХреЗ рд╕рд╛рде рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ; рдореИрдВ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рднреНрд░рдорд┐рдд рдУрд╡рд░рд░рд╛рдЗрдб рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╣рд┐рдд рд░рд┐рдЯрд░реНрди рд╣реИрдВ ... рдбрд░рдкреЛрдХ?)

@ object88 рдореИрдВ рдЗрд╕ рдирдП рдорд╛рдорд▓реЗ рдХреЛ рдПрдХ SimpleStmt рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ if рдФрд░ for рдФрд░ switch рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ thing.Nope() рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди &PathError{"chdir", dir, err} рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ err рд╣реИ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ thing.Nope() )ред рдпрджрд┐ thing.Nope() рдПрдХ nil рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ err == nil if рдХрдерди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рддреНрдп рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд╛ рд╢рд░реАрд░ рдпрджрд┐ рдХрдерди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ignoreError рдЪрд░ рдХрднреА рдирд╣реАрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдХреЛрдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдпрд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рд╣реИ; рдпрд╣рд╛рдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП || рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗрд╡рд▓ рддрднреА рд╕реНрд╡реАрдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм || рдмрд╛рдж рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдирд┐рд╣рд┐рдд рд░рд┐рдЯрд░реНрди рдбрд░рдкреЛрдХ рд╣реИрдВред

рд╣рд╛рдБ, рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА if , for , рдпрд╛ switch рдЕрдВрджрд░ рдСрдкрд░реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрднрд╛рд╡рд┐рдд рднреНрд░рдо рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЪреВрдВрдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рдЖрдо рддреМрд░ рдкрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдХрдард┐рди рдирд╣реАрдВ: https://play.golang.org/p/9B3Sr7kj39

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрди рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп рдФрд░ рд╡рд╛рдкрд╕реА рддрд░реНрдХреЛрдВ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ err рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд╛рдо рднреА рдмрдирд╛рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд▓реЛрдЧ (рдореЗрд░реЗ рд╕рд╣рд┐рдд!) рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдердХреЗ рд╣реБрдП рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдЬрдм рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ

if err != nil {
  return 0, nil, "", Struct{}, wrap(err)
}

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдердХрд╛рдК рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдХреБрдЫ рд╣рдж рддрдХ https://github.com/golang/go/issues/19642#issuecomment -288559297 рдореЗрдВ return ..., err рд▓рд┐рдП @nigeltao рдХрд╛ рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рдЖрдпрд╛

рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭреВрдВ, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛

boolean := BoolFunc() || BoolExpr

рддрдерд╛

err := FuncReturningError() || Expr

рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рдереЛрдбрд╝рд╛ рд╣реА рдХрд╛рдлреА рд╣реИ...

рдЬрдм рд╡рд╛рдкрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реВрдЪреА рдореЗрдВ рджреЛ рдЕрдпрд╕реНрдХ рдЕрдзрд┐рдХ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдШрдмрд░рд╛рд╣рдЯ рдЪрд╛рд╣рд┐рдПред

err := doSomeThing()
panicIf(err)

err = doAnotherThing()
panicIf(err)

@ianlancetaylor рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ err рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ 'рдЬрд╛рджреБрдИ' (рднрд╛рд╖рд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд) рдХреЗ рд░реВрдк рдореЗрдВ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛

func Chdir(dir string) error {
    return (err := syscall.Chdir(dir)) || &PathError{"chdir", dir, err}
}

?

рджреВрд╕рд░реА рдУрд░ (рдЪреВрдВрдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ...)
рдПрдХ рдирдП рдСрдкрд░реЗрдЯрд░ (!! рдпрд╛ ??) рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рдкрд░ рд╢реЙрд░реНрдЯрдХрдЯ рдХрд░рддрд╛ рд╣реИ! = nil (рдпрд╛ рдХреЛрдИ рдЕрд╢рдХреНрдд?)

func DirCh(dir string) (string, error) {
    return dir, (err := syscall.Chdir(dir)) !! &PathError{"chdir", dir, err}
}

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдмрд╣реБрдд рджреВрд░ рд╣реИ :)

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдРрддрд░рд╛рдЬ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рдкрдардиреАрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ "рд╕рд╛рдЗрдХреНрд▓реЛрдореИрдЯрд┐рдХ рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕рд┐рдЯреА" (рдЖрдк рдЗрд╕ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ) рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред "рдЕрдЧрд░" рдХрдерди рдЕрддрд┐рд░рд┐рдХреНрдд рд╢реЛрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ "||" рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдкреНрд░рддреАрдХ рдХреЛ рдЖрдорддреМрд░ рдкрд░ OR рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЙрди рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ?

рдореИрдВ рдпрд╣рд╛рдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдлреЗрдВрдХ рд░рд╣рд╛ рд╣реВрдВред рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг: https://play.golang.org/p/rtfoCIMGAb

рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@opennota рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБред рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╣рд▓реВ рдЕрдЬреАрдм рд╣реИред

@mattn рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рд╡рд╛рдкрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реВрдЪреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрдИ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

@mattn panicif рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкреНрд░рдореБрдЦ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреЛрдИ рднреА рдЖрдЬ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд panicif рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

@tandr рд╣рд╛рдВ, err рдХреЛ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рднрдпрд╛рдирдХ рд╣реИред рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рддреНрд░реБрдЯрд┐-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП error рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдП, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рднрдпрд╛рдирдХ рд╣реИред

@tandr рд╣рдо рдПрдХ рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рдмрдбрд╝рд╛ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдирд╣реАрдВ рд╣реИред

@henryas рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдИ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

@henryas рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЙрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬреЛ рдЪреАрдЬ рдирд╛рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреЗ рд╕рдмрд╕реЗ рдкреНрд░рдореБрдЦ рдкрд╣рд▓реВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореМрдЬреВрдж рдФрд░ рджреГрд╢реНрдпрдорд╛рди рд╣реЛ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рд▓рд╛рдЗрди рдкрд░ рдкрд╣рд▓реА рдЪреАрдЬ рд╣реЛред рдпрд╣ рдЖрдЬ рд╕рдЪ рд╣реИ, if err != nil рдореБрд╣рд╛рд╡рд░реЗ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдХреЗ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде, рдФрд░ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВ рддреЛ рдпрд╣ рд╕рд╣реА рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рджред

@ianlancetaylor рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдиреЗ рдореЗрд░реЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рд▓рд┐рдВрдХ рдХреА рдЬрд╛рдБрдЪ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ "рдШрдмрд░рд╛рд╣рдЯ" рдереА рдЬреЛ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рджреЗрддреА рд╣реИред

рдореИрдВ рдпрд╣рд╛рдВ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдкреБрди: рдкреЗрд╢ рдХрд░реВрдВрдЧрд╛:

func panicIf(err error, transforms ...func(error) error) {
  if err == nil {
    return
  }
  for _, transform := range transforms {
    err = transform(err)
  }
  panic(err)
}

рд╕рдВрдпреЛрдЧ рд╕реЗ, рдореИрдВрдиреЗ рдЧреЛрдлрд░рдХреЙрди рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ

func DirCh(dir string) (string, error) {
    dir := syscall.Chdir(dir)        =: err; if err != nil { return "", err }
}

рдЬрд╣рд╛рдВ =: рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдирдпрд╛ рдмрд┐рдЯ рд╣реИ, := рдХрд╛ рдПрдХ рджрд░реНрдкрдг рдЬреЛ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ рд╣рдореЗрдВ = рд▓рд┐рдП рднреА рдХреБрдЫ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛрдП рд╕реБрдЦреА рдорд╛рд░реНрдЧ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПред

рджреВрд╕рд░реА рдУрд░, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рдореЗрдВ рдХреБрдЫ рдЦреВрдмрд┐рдпрд╛рдВ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЕрддрд┐рджреЗрдп рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ @billyh рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд╕рдВрдж рд╣реИ

func Chdir(dir string) error {
    e := syscall.Chdir(dir) catch: &PathError{"chdir", dir, e}
    return nil
}

рдпрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг https://github.com/pkg/errors рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░

func parse(input io.Reader) (*point, error) {
    var p point

    err := read(&p.Longitude) catch: nil, errors.Wrap(err, "Failed to read longitude")
    err = read(&p.Latitude) catch: nil, errors.Wrap(err, "Failed to read Latitude")
    err = read(&p.Distance) catch: nil, errors.Wrap(err, "Failed to read Distance")
    err = read(&p.ElevationGain) catch: nil, errors.Wrap(err, "Failed to read ElevationGain")
    err = read(&p.ElevationLoss) catch: nil, errors.Wrap(err, "Failed to read ElevationLoss")

    return &p, nil
}

рдПрдХ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░, рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдХрдареЛрд░ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ go1.10 рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ) рдПрдХ рдирдпрд╛ check рдХреАрд╡рд░реНрдб рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реИред

рдЗрд╕рдХреЗ рджреЛ рд░реВрдк рд╣реЛрдВрдЧреЗ: check A рдФрд░ check A, B ред

A рдФрд░ B рдХреЛ error ред рджреВрд╕рд░рд╛ рд░реВрдк рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐-рд╕рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рд╕рд░рд▓ рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдкрд╣рд▓рд╛ рдлреЙрд░реНрдо (рдЪреЗрдХ рдП)

check A рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ A ред рдЕрдЧрд░ nil , рддреЛ рдпрд╣ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ nil , рддреЛ check рдПрдХ return {<zero>}*, A рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг

  • рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ check рд╕рд╛рде рдЗрдирд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
err := UpdateDB()    // signature: func UpdateDb() error
if err != nil {
    return err
}

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

check UpdateDB()
  • рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рд╣рдо рдЕрднреА рдХрд░рддреЗ рд╣реИрдВред
a, b, err := Foo()    // signature: func Foo() (string, string, error)
if err != nil {
    return "", "", err
}

// use a and b

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

a, b, err := Foo()
check err

// use a and b

рджреВрд╕рд░рд╛ рдлреЙрд░реНрдо (рдЪреЗрдХ рдП, рдмреА)

check A, B рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ A ред рдЕрдЧрд░ nil , рддреЛ рдпрд╣ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ nil , рддреЛ check рдПрдХ return {<zero>}*, B рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рддреНрд░реБрдЯрд┐-рд╕рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рдЕрднреА рднреА A рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ B рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд return ред

рдЙрджрд╛рд╣рд░рдг

a, err := Bar()    // signature: func Bar() (string, error)
if err != nil {
    return "", &BarError{"Bar", err}
}

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

a, err := Foo()
check err, &BarError{"Bar", err}

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реИ

  • рдХрд╛ рдЙрдкрдпреЛрдЧ check рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рд╣реИ рдкрд░ рдмрдпрд╛рди error
  • рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ check рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдкрд╕реА рдорд╛рди { type }*, error

рджреЛ-рдПрдХреНрд╕рдкреАрдЖрд░ рдлреЙрд░реНрдо check A, B рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рд╣реИред B рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ A nil ред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдкрд░ рдиреЛрдЯреНрд╕

рд╕рдЬрд╛рд╡рдЯреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХреНрд▓рдВрдХреАрдпрд░ check A, B рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рддрднреА рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

if err != nil { return nil, nil, err } рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ (рдЬреЛ рдмрд╣реБрдд рдЖрдо рд╣реИ) рдХреЗ рд▓рд┐рдП check err рдЙрддрдирд╛ рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ рдЬрд┐рддрдирд╛ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдиреАрдЪреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдиреЛрдЯ рджреЗрдЦреЗрдВ)ред

рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рдиреЛрдЯреНрд╕

рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ ( check .. , рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, return ) рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рдЫреБрдкрд╛рдП рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдирд┐рд╣рд┐рдд рд░рд┐рдЯрд░реНрди рдкрд░рд┐рдЪрдпред

<do-stuff> || <handle-err> рдФрд░ <do-stuff> catch <handle-err> рдКрдкрд░, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд a, b = foo()? рдЬреИрд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд╢реЛрдзрди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд╛ рдЕрдиреБрд╕рд░рдг; рдкреВрд░реНрд╡ рдореЗрдВ || <handle-err> рдорд╢реАрдирд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреНрдпрдерд╛ рд╕рд╛рджреЗ-рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬреЛ рдмреАрдЪ рдореЗрдВ рдФрд░ рдХреЛрдб рдХреА рдПрдХ рд╕рд╛рджреЗ-рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдХрдИ рдмрд╛рд░ред

рдПрдХ check рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрджрд╛ рдмреНрд▓реЙрдХ рдореЗрдВ рдЯреЙрдк-рд▓реЗрд╡рд▓ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдХреА рдкреНрд░рдореБрдЦрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдХрдВрдЯреНрд░реЛрд▓ рдлреНрд▓реЛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реБрд░реБрдЖрддреА return )ред

@ALTree , рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕рд╛ рд╣реИ:

a, b, err := Foo()
check err

рдореВрд▓ рд╕реЗ рддреАрди рдореВрд▓реНрдпрд╡рд╛рди рд░рд┐рдЯрд░реНрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:

return "", "", err

рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдШреЛрд╖рд┐рдд рд░рд┐рдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ? рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдз рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВ() рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛?

рд╣рдо рдЬрд┐рд╕ рднреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╡реНрдпрд╛рдкрдХрддрд╛ рдХреЛ рдХрдо рд╕реЗ рдХрдо рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ check рд╣реЛрдиреЗ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рджреЗрдЦрдирд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЙрд╕ рдкреНрд░рд╛рдердорд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рдирд╛ рд╣реИред рдпрдерд╛рд╕рдВрднрд╡ред рд╕рд╛рде рд╣реА, рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдХрд┐рд╕реА рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрдж рдЬреИрд╕реЗ check рдпрд╛ catch рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдЖрдзреБрдирд┐рдХ рд╕рдВрдкрд╛рджрдХ рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрдж рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рднреА рдмрдирд╛ рджреЗрдЧрд╛ред рдЕрдЧрд░ рдпрд╣ рджрд╛рдИрдВ рдУрд░ рд╣реИред

@ рдмрд┐рд▓реАрд╣ рдпрд╣ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕ рд▓рд╛рдЗрди рдкрд░ рдЬреЛ рдХрд╣рддреА рд╣реИ:

рдпрджрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪреЗрдХ рдПрдХ return {<zero>}*, A рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ

check рддреНрд░реБрдЯрд┐ рдХреЛ рдЫреЛрдбрд╝рдХрд░ (рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ) рдХрд┐рд╕реА рднреА рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛ред

рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдиреНрдп рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

рдлрд┐рд░ рдЖрдк if err != nil { рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рддреНрд░реБрдЯрд┐-рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ, рдпрд╛ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрди рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЗ рдЯреВрд▓рдмреЙрдХреНрд╕ рдореЗрдВ рдЕрднреА рднреА рд╕рд╛рдорд╛рдиреНрдп if err рдореБрд╣рд╛рд╡рд░рд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдирдпрд╛ рдмреНрд▓реЙрдХ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдСрдкрд░реЗрд╢рди, рдЪрд╛рд╣реЗ рдХрд┐рддрдирд╛ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛ, рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдЬрд┐рд╕ рднреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╡реНрдпрд╛рдкрдХрддрд╛ рдХреЛ рдХрдо рд╕реЗ рдХрдо рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдКрдкрд░ рдореЗрд░рд╛ рдЬрд╡рд╛рдм рджреЗрдЦреЗрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА if рдФрд░ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдЖрдкрдХреЛ рдЕрднреА рджреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдЪреАрдЬрд╝реЗрдВ рд╣реЛрдВрдЧреАред

рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдЖрдзреБрдирд┐рдХ рд╕рдВрдкрд╛рджрдХ рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрдж рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ

рд╢рд╛рдпрджред рд▓реЗрдХрд┐рди рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛, рдЬрд┐рд╕реЗ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдмрдЧ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдбрдмрд▓ рд░рд┐рдЯрд░реНрди рд╕реБрд╡рд┐рдзрд╛ рд╢реБрд░реВ рдХрд░рдХреЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди a() 123 рджреЗрддрд╛ рд╣реИ:

рдлрдВрдХ рдП () рдЗрдВрдЯ {
рдмреА()
рд╡рд╛рдкрд╕реА 456
}
рдлрдВрдХ рдмреА () {
рд╡рд╛рдкрд╕реА рд╡рд╛рдкрд╕реА рдЗрдВрдЯ(123)
}

рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func рд╣реИрдВрдбрд▓ (var * foo, рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐) (var * foo, рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐) {
рдЕрдЧрд░ рдЧрд▓рддреА!= рд╢реВрдиреНрдп {
рд╡рд╛рдкрд╕реА рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп, рддреНрд░реБрдЯрд┐
}
рд╡рд╛рдкрд╕реА рд╕рдВрд╕реНрдХрд░рдг, рд╢реВрдиреНрдп
}

func рдХреНрд▓рд╛рдЗрдВрдЯ_рдХреЛрдб () (* рдХреНрд▓рд╛рдЗрдВрдЯ_рдСрдмреНрдЬреЗрдХреНрдЯ, рддреНрд░реБрдЯрд┐) {
рд╡рд░ obj, рдЧрд▓рддреА = рд╕рдВрднрд╛рд▓ (something_that_can_fail ())
// рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
// рдЕрдиреНрдпрдерд╛ рдХреНрд▓рд╛рдЗрдВрдЯ_рдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреИрдХ рддрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░реЗрдЧрд╛
рдЬреЛрд░ рджреЗрдВ (рдЧрд▓рддреА == рд╢реВрдиреНрдп)
}

рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдЯреИрдХ рддрдХ рдлреИрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ
рдРрд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдп рдореБрдЦреНрдп рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореБрдЭреЗ рдпрд╣ рдЧрд▓рдд рд▓рдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдп рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, vet рдЪреЗрддрд╛рд╡рдиреА рдпрд╛ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

func Chdir(dir string) (err error) {
    syscall.Chdir(dir) || err
    return nil
}

@rodcorsi рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛

if err := syscall.Chdir(dir); err != nil {
    return err
}

рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рджреА рдЧрдИ рд╣реИ:
type ErrorContext interface { HasError() bool SetError(msg string) Error() string }
рдЕрдм рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдХрд╛рд░реНрдп рдореЗрдВ ...
func MyFunction(number int, ctx ErrorContext) int { if ctx.HasError() { return 0 } return number + 1 }
рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ...
func MyIntermediateFunction(ctx ErrorContext) int { if ctx.HasError() { return 0 } number := 0 number = MyFunction(number, ctx) number = MyFunction(number, ctx) number = MyFunction(number, ctx) return number }
рдФрд░ рдКрдкрд░реА рд╕реНрддрд░ рдХреЗ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ
func main() { ctx := context.New() no := MyIntermediateFunction(ctx) if ctx.HasError() { log.Fatalf("Error: %s", ctx.Error()) return } fmt.Printf("%d\n", no) }
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкрд╛рдардХ рдХреЛ рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдкрде рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдкрде рд╕реЗ рд╡рд┐рдЪрд▓рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо "рдЕрдЧрд░" рдХрдерди рд╣реИред

рджреВрд╕рд░рд╛, рдпрд╣ рддреНрд░реБрдЯрд┐ рдЫреБрдкрд╛рддрд╛ рдирд╣реАрдВ рд╣реИред рдореЗрдердб рд╕рд┐рдЧреНрдиреЗрдЪрд░ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ ErrorContext рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдлрдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ (рдЬреИрд╕реЗ "рдЕрдЧрд░") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рддреАрд╕рд░рд╛, рддреНрд░реБрдЯрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрдЪреНрдЫреБрдХ рдкрд╛рд░реНрдЯреА рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд╛рдореА рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рддреНрд░реБрдЯрд┐ рд╕рдВрд╕рд╛рдзрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдордзреНрдпрд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ:
func MyIntermediateFunction(ctx ErrorContext) int { if ctx.HasError() { return 0 } number := 0 number = MyFunction(number, ctx) number = MyFunction(number, ctx) number = MyFunction(number, ctx) if ctx.HasError() { ctx.SetError(fmt.Sprintf("wrap msg: %s", ctx.Error()) return } number *= 20 number = MyFunction(number, ctx) return number }
рдореВрд▓ рд░реВрдк рд╕реЗ, рдЖрдк рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдмрд▓ рдЕрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдЖрдк рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд░реНрддрдорд╛рди рдЧреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдпрд╣ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ ...
````
// рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рджреА рдЧрдИ рд╣реИ
func MyFunction (рд╕рдВрдЦреНрдпрд╛ int) рддреНрд░реБрдЯрд┐

// рдлрд┐рд░ рдпрд╣ рдХрд░реЗрдВ
MyFunction(8)//рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд┐рдирд╛
With the ErrorContext, you as the function owner can make the error checking optional with this:
func MyFunction (ctx ErrorContext) {
рдЕрдЧрд░ ctx != nil && ctx.HasError() {
рд╡рд╛рдкрд╕реА
}
//...
}
Or make it compulsory with this:
func MyFunction (ctx ErrorContext) {
рдЕрдЧрд░ ctx.HasError () {// рдЕрдЧрд░ рд╕реАрдЯреАрдПрдХреНрд╕ рд╢реВрдиреНрдп рд╣реИ рддреЛ рдШрдмрд░рд╛рдПрдЧрд╛
рд╡рд╛рдкрд╕реА
}
//...
}
If you make error handling compulsory and yet the user insists on ignoring error, they can still do that. However, they have to be very explicit about it (to prevent accidental ignore). For instance:
func рдЕрдкрд░рдлрдВрдХреНрд╢рди (ctx ErrorContext) {
рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛: = рд╕рдВрджрд░реНрднред рдирдпрд╛ ()
MyFunction (рдЕрдирджреЗрдЦрд╛) // рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

 MyFunction(ctx) //this one is handled

}
````
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

@ALTree рдЕрд▓реНрдмрд░реНрдЯреЛ, рдЖрдкрдХреЗ check рдорд┐рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдФрд░ @ianlancetaylor рдиреЗ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛?

рдЗрд╕рд▓рд┐рдП

func F() (int, string, error) {
   i, s, err := OhNo()
   if err != nil {
      return i, s, &BadStuffHappened(err, "oopsie-daisy")
   }
   // all is good
   return i+1, s+" ok", nil
}

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

func F() (int, string, error) {
   i, s, err := OhNo()
   check i, s, err || &BadStuffHappened(err, "oopsie-daisy")
   // all is good
   return i+1, s+" ok", nil
}

рд╕рд╛рде рд╣реА, рд╣рдо check рдХреЛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХрд╛рдзрд┐рдХ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд╛рдо рдФрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ "рдЗрди-рдкреНрд▓реЗрд╕" рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░рд▓ "рд░рд┐рдЯрд░реНрди" рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ

func F() (a int, s string, err error) {
   i, s, err = OhNo()
   check err |=  &BadStuffHappened(err, "oopsy-daisy")  // assigns in place and behaves like simple "return"
   // all is good
   return i+1, s+" ok", nil
}

рдпрджрд┐ return рдПрдХ рджрд┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛, рддреЛ check рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдПрдХ рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рдмрди рдЬрд╛рддрд╛ рд╣реИ

func check(e error) bool {
   return e != nil
}

func F() (a int, s string, err error) {
   i, s, err = OhNo()
   check(err) || return &BadStuffHappened(err, "oopsy-daisy")
   // all is good
   return i+1, s+" ok", nil
}

рдЖрдЦрд┐рд░реА рд╕рдорд╛рдзрд╛рди рдкрд░реНрд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рд╣рд╛рд▓рд╛рдВрдХрд┐

рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдХрд┐рд╕рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдЪрд╛рд░ рд╣реИ (рд╣рд░ рдХрд┐рд╕реА рдХрд╛ рдкрд╕рдВрджреАрджрд╛ рдмрд╛рдЗрдХреЗрдб :-)ред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдмрд░реНрддрди рдореЗрдВ рдлреЗрдВрдХ рд░рд╣реЗ рд╣реИрдВ ...

x, y := try foo()

рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:

x, y, err := foo()
if err != nil {
    return (an appropriate number of zero values), err
}

рддрдерд╛

x, y := try foo() catch &FooErr{E:$, S:"bad"}

рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:

x, y, err := foo()
if err != nil {
    return (an appropriate number of zero values), &FooErr{E:err, S:"bad"}
}

try рдлреЙрд░реНрдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ, рдХрдИ рдмрд╛рд░, рдореЛрдбреБрд▓реЛ рд╕рддрд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдВрддрд░реЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред try ... catch рдлрд╝реЙрд░реНрдо рдЕрдХреНрд╕рд░ рдХрдо рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ @ALTree рдХреЗ check A, B рдирд┐рд░реНрдорд╛рдг рдФрд░ @tandr рдХреЗ рдЕрдиреБрд╡рд░реНрддреА рд╕реБрдЭрд╛рд╡ рдХреЗ рд╕рдорд╛рди рд╣реИред рдПрдХ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдПрдХ рдмрдпрд╛рди рдирд╣реАрдВ, рддрд╛рдХрд┐ рдЖрдк рдХрд╣ рд╕рдХреЗрдВ:

z(try foo() catch &FooErr{E:$, S:"bad"})

рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдХрдерди рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдпрд╛рд╕/рдкрдХрдбрд╝ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

p = try q(0) + try q(1)
a = try b(c, d() + try e(), f, try g() catch &GErr{E:$}, h()) catch $BErr{E:$}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рднреА рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ e() рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП h() рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, try рдФрд░ catch рдЬреИрд╕реЗ рдирдП рдХреАрд╡рд░реНрдб рдЧреЛ 1.x рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдирд┐рдЪреЛрдбрд╝ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдХреМрди-рд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛? рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЛ рдпрд╛ рдПрдХ рдореЗрдВ рдХрдо рдХрд░реЗрдВ? рдпрд╣ рд╡рд╛рдкрд╕реА рдХреА рднрд╛рд╖рд╛ рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ/рдпрджрд┐ред

if err != nil {
    return err
}

рдпрд╛ рдЧрд▓рддреА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░реЗрдВ? рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕/рдкрдХрдбрд╝ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЙрдЪрд┐рдд рд╢реЙрд░реНрдЯрдХрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рддреАрди рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ:

  1. рдпрд╣ рдЙрд╕ рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреА рд╡рд╣ рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддрд╛рдХрд┐ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдкрде рдкреНрд░рдореБрдЦ рд╣реЛред
  2. рдЗрд╕реЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рдЪрд░реЛрдВ рдХреЛ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЪрд░ рд╣реЛрдиреЗ рдкрд░ рдкрд╛рдардХ рднреНрд░рдорд┐рдд рди рд╣реЛрдВред
  3. рдЗрд╕реЗ рдПрдХ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреНрд░рд┐рдпрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, return err ) рдХреЛ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рди рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрднреА-рдХрднреА рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЬреИрд╕реЗ t.Fatal рдХреЙрд▓ рдХрд░рдирд╛)ред рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЙрди рдмрд╛рдзрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ рдПрдХ рдиреНрдпреВрдирддрдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛

STMT SEPARATOR_TOKEN VAR BLOCK

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

syscall.Chdir(dir) :: err { return err }

рдЬреЛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

if err := syscall.Chdir(dir); err != nil {
    return err
}
````
Even though it's not much shorter, the new syntax moves the error path out of the way. Part of the change would be to modify `gofmt` so it doesn't line-break one-line error-handling blocks, and it indents multi-line error-handling blocks past the opening `}`.

We could make it a bit shorter by declaring the error variable in place with a special marker, like

syscall.Chdir(dir) :: {рд╡рд╛рдкрд╕реА @err }
```

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЧреИрд░-рд╢реВрдиреНрдп-рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, bufio.Peek рд╕рдВрднрд╡рддрдГ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдФрд░ ErrBufferFull рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

@mattn рдЖрдк рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@nigeltao рд╣рд╛рдБ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрднрд╡рддрдГ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХреЛрдб рдкрд░ рдПрдХ рдмрдЧ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ bufio.Peek рднреА рдЧреИрд░-рд╢реВрдиреНрдп рдФрд░ рд╢реВрдиреНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ рдирд┐рд╣рд┐рдд рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐ рджреЛрдиреЛрдВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рддреЛ рдореВрд▓реНрдп рдФрд░ рддреНрд░реБрдЯрд┐ рджреЛрдиреЛрдВ рдХреЛ рдХреЙрд▓рд░ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

ret, err := doSomething() :: err { return err }
return ret, err

@jba рдЖрдк рдЬреЛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝реНрдб рдлрд╝рдВрдХреНрд╢рди-рдХрдВрдкреЛрдЬрд╝рд┐рд╢рди рдСрдкрд░реЗрдЯрд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

syscall.Chdir(dir) тл▒ func (err error) { return &PathError{"chdir", dir, err} }

рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдзрд┐рдХрддрд░-рдЕрдирд┐рд╡рд╛рд░реНрдп рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо рджреВрд╕рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рдВрджреБ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд▓реНрджреА рд▓реМрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИред

рддреЛ рдЕрдм рдореИрдВ рддреАрди рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ:

  1. рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЧреЛ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рддреНрд░реБрдЯрд┐ рдореЛрдиреИрдб рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ: рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп рдЕрдзрд┐рдХрддрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рддреНрд░реБрдЯрд┐ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП) рдмрдЬрд╛рдп рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдорд╛рди (рдЬрд┐рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдЪрд░ рд╕реЗ рдмрд╛рдВрдзрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред

  2. рдЧреЛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ (x, y, error) рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╕рдВрдШ (#19412) (x, y) | error ред

  3. рдЙрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЬреЛ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЕрдирдкреИрдХ рдпрд╛ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рдХрд░рддреА рд╣реИрдВ, рдорд╛рдорд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдХреЛрдк рд╣реИрдВ, рдФрд░ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдЬреЛ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИ, рд╡рд╣ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдШреЛрд╖рд┐рдд рдЪрд░ рдХреЗ рдЫрд╛рдпрд╛рдВрдХрди рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдЙрди рд╕реНрдХреЛрдк (# 21114) рдХреЛ рдЕрд▓рдЧ рдХрд░рдХреЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рд╢рд╛рдпрдж рд╣рдо рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ =: рдСрдкрд░реЗрдЯрд░ рдЬреИрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдШ-рдорд┐рд▓рд╛рди рд╕рд╢рд░реНрдд рдХреЗ рд╕рд╛рде:

syscall.Chdir(dir) =? err { return &PathError{"chdir", dir, err} }

```рдЬрд╛рдУ
n:= io.WriteString(w, s) =? рдЧрд▓рддреА {рд╡рд╛рдкрд╕реА рдЧрд▓рддреА}

and perhaps a boolean version for `, ok` index expressions and type assertions:
```go
y := m[x] =! { return ErrNotFound }

рджрд╛рдпрд░реЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдпрд╣ рдХреЗрд╡рд▓ gofmt рдХреЛ рдПрдХ-рд▓рд╛рдЗрдирд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ:

err := syscall.Chdir(dir); if err != nil { return &PathError{"chdir", dir, err} }

```рдЬрд╛рдУ
n, рддреНрд░реБрдЯрд┐: = io.WriteString (w, s); рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп {рд╡рд╛рдкрд╕реА рдЧрд▓рддреА}

```go
y, ok := m[x]; if !ok { return ErrNotFound }

рд▓реЗрдХрд┐рди рд╕реНрдХреЛрдк рдмрд╣реБрдд рдмрдбрд╝реА рдмрд╛рдд рд╣реИ! рд╕реНрдХреЛрдкрд┐рдВрдЧ рдореБрджреНрджреЗ рд╡реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдб "рдХреБрдЫ рд╣рдж рддрдХ рдмрджрд╕реВрд░рдд" рд╕реЗ "рд╕реВрдХреНрд╖реНрдо рдмрдЧ" рддрдХ рдХреА рд░реЗрдЦрд╛ рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИред

@ianlancetaylor
рдЬрдмрдХрд┐ рдореИрдВ рд╕рдордЧреНрд░ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ, рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдкреНрдЯрд┐рдХ рдкрд░реНрд▓-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕рдорд░реНрдердХ рдирд╣реАрдВ рд╣реВрдВред рд╢рд╛рдпрдж рдПрдХ рдЕрдзрд┐рдХ рдЪрд┐рдВрддрд╛рдЬрдирдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣реЛрдЧреА, рдЬреИрд╕реЗ:

syscall.Chdir(dir) or dump(err): errors.Wrap(err, "chdir failed")

syscall.Chdir(dir) or dump

рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдкреЙрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

resp := http.Get("https://example.com") or dump

рдЖрдЗрдП рдпрд╣ рди рднреВрд▓реЗрдВ рдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЪрд▓рддреЗ-рдлрд┐рд░рддреЗ рдореВрд▓реНрдп рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред
рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдЕрдиреНрдп structs рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рджреВрд╕рд░реА рддрд░рдл рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ structs рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИ)

рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдирдП рдФрд░ рдкреБрд░рд╛рдиреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВред

рдпрд╣ рдЕрдХреЗрд▓реЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ IMHO рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ

err := syscall.Chdir(dir)
if err != nil {
    return err
}
return nil

рдКрдкрд░

if err := syscall.Chdir(dir); err != nil {
    return err
}
return nil

рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдЕрдзрд┐рдХ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдЪреНрдЫрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреА рд╣реИред рдпрд╣ рдкреНрд░рдкрддреНрд░ рдореЗрд░реЗ рд▓рд┐рдП рд╕рд░реНрд╡рд╛рдзрд┐рдХ рдкрдардиреАрдп рд╣реИред

@рдмреАрд╕реАрдорд┐рд▓реНрд╕ :

рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ-рд▓рд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрддреНрддрд░рджрд╛рдпреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП gofmt рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ

рд╕рд┐рд░реНрдл рдЧреБрдВрдЬрд╛рдЗрд╢ рдирд╣реАрдВ; рдмрд╛рдпрд╛рдВ рдХрд┐рдирд╛рд░рд╛ рднреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдардиреАрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ

syscall.Chdir(dir) =: err; if err != nil { return &PathError{"chdir", dir, err} } 

рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ

err := syscall.Chdir(dir); if err != nil { return &PathError{"chdir", dir, err} } 

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреА рдЖрдВрдЦ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рдХреЛ рд╕реНрдХреИрди рдХрд░ рд╕рдХрддреА рд╣реИред

рд╡рд┐рдЪрд╛рд░ @bcmills рдХреЛ рдорд┐рд▓рд╛рдХрд░ рд╣рдо рд╕рд╢рд░реНрдд рдкрд╛рдЗрдк рдЕрдЧреНрд░реЗрд╖рдг рдСрдкрд░реЗрдЯрд░ рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

F2 рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЕрдВрддрд┐рдо рдорд╛рди nil рдирд╣реАрдВ рд╣реИ ред

func F1() (foo, bar){}

first := F1() ?> last: F2(first, last)

рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкрд╛рдЗрдк рдЕрдЧреНрд░реЗрд╖рдг рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛

func Chdir(dir string) error {
    syscall.Chdir(dir) ?> err: return &PathError{"chdir", dir, err}
    return nil
}

рдПрдХ рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ @urandom рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг
рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдлреЛрдХрд╕ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп

func configureCloudinit(icfg *instancecfg.InstanceConfig, cloudcfg cloudinit.CloudConfig) (cloudconfig.UserdataConfig, error) {
    // When bootstrapping, we only want to apt-get update/upgrade
    // and setup the SSH keys. The rest we leave to cloudinit/sshinit.
    udata := cloudconfig.NewUserdataConfig(icfg, cloudcfg) ?> err: return nil, err
    if icfg.Bootstrap != nil {
        udata.ConfigureBasic() ?> err: return nil, err
        return udata, nil
    }
    udata.Configure() ?> err: return nil, err
    return udata, nil
}

func ComposeUserData(icfg *instancecfg.InstanceConfig, cloudcfg cloudinit.CloudConfig, renderer renderers.ProviderRenderer) ([]byte, error) {
    if cloudcfg == nil {
        cloudcfg = cloudinit.New(icfg.Series) ?> err: return nil, errors.Trace(err)
    }
    _ = configureCloudinit(icfg, cloudcfg) ?> err: return nil, errors.Trace(err)
    operatingSystem := series.GetOSFromSeries(icfg.Series) ?> err: return nil, errors.Trace(err)
    udata := renderer.Render(cloudcfg, operatingSystem) ?> err: return nil, errors.Trace(err)
    logger.Tracef("Generated cloud init:\n%s", string(udata))
    return udata, nil
}

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдирд╣реАрдВ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдЬрдм рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ if error not nil then рдкрд░ рдореБрдЦрд░ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ - рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж if there is an error then ред

if err != nil {
    // handle error
}

рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдпреЛрдЧреНрдпрддрд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ-рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред

if err {
    // handle error
}

рдмрд╕ рдореЗрд░рд╛ рд╡рд┐рдирдореНрд░ рд╕реБрдЭрд╛рд╡ :)

рдпрд╣ рдкрд░реНрд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдЬрд╛рджреВ рдЪрд░ рднреА рд╣реИ
рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдкрд░реНрд▓ рдореЗрдВ рдЖрдк рдХрд░реЗрдВрдЧреЗ

рдЦреБрд▓рд╛ (рдлрд╝рд╛рдЗрд▓, $ рдлрд╝рд╛рдЗрд▓) рдпрд╛ рдорд░ ("$ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдЦреЛрд▓ рд╕рдХрддрд╛: $!");

рдЖрдИрдПрдордПрдЪрдУ, рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдмрд┐рдВрджреБ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рд╣реИ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди
рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ 'рдЖрдкрдХреЗ рдЪреЗрд╣рд░реЗ рдореЗрдВ'

рдЕрдЧрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдХреЗ рд░рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рдЬрд╛рджреВ рдЪрд░ рди рд╣реЛ, рд╣рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рддреНрд░реБрдЯрд┐ рдЪрд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо

e:= syscall.Chdir(dir) ?> e: &PathError{"chdir", dir, e}

рдФрд░ рд╣рдо || . рд╕реЗ рднрд┐рдиреНрди рдкреНрд░рддреАрдХ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ,
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'рдпрд╛' рдЬреИрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд┐рдВрдмрд▓ рдкреАрдЫреЗ рдХреА рдУрд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИрдВ
рдЕрдиреБрдХреВрд▓рддрд╛

n, _, рдЧрд╝рд▓рддреА, _ = somecall(...) ?> рдЧрд╝рд▓рддреА: &PathError {"somecall", n, рдЧрд╝рд▓рдд}

рдордВрдЧрд▓рд╡рд╛рд░, 1 рдЕрдЧрд╕реНрдд, 2017 рдХреЛ рджреЛрдкрд╣рд░ 2:47 рдмрдЬреЗ, рд░реЛрдбреНрд░рд┐рдЧреЛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рд╡рд┐рдЪрд╛рд░ рдХреЛ рдорд┐рд▓рд╛рдХрд░ @bcmills https://github.com/bcmills рд╣рдо рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╕рд╢рд░реНрдд рдкрд╛рдЗрдк рдЕрдЧреНрд░реЗрд╖рдг рдСрдкрд░реЗрдЯрд░ред

F2 рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЕрдВрддрд┐рдо рдорд╛рди рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ ред

func F1 () (рдлреВ, рдмрд╛рд░) {}
рдкреНрд░рдердо := F1() ?> рдЕрдВрддрд┐рдо: F2 (рдкреНрд░рдердо, рдЕрдВрддрд┐рдо)

рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкрд╛рдЗрдк рдЕрдЧреНрд░реЗрд╖рдг рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛

func Chdir (рдбреАрдЖрдИрдЖрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рддреНрд░реБрдЯрд┐ {
syscall.Chdir(dir)?> рддреНрд░реБрдЯрд┐: рд╡рд╛рдкрд╕реА рдФрд░ рдкрде рддреНрд░реБрдЯрд┐ {"chdir", dir, рддреНрд░реБрдЯрд┐}
рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп
}

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг
https://github.com/juju/juju/blob/01b24551ecdf20921cf620b844ef6c2948fcc9f8/cloudconfig/providerinit/providerinit.go
рдПрдХ рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ @urandom https://github.com/urandom рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдпрд╛ рдЧрдпрд╛
рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдлреЛрдХрд╕ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп

func configCloudinit(icfg *instancecfg.InstanceConfig, Cloudcfg Cloudinit.CloudConfig) (cloudconfig.UserdataConfig, рддреНрд░реБрдЯрд┐) {
// рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдХреЗрд╡рд▓ рдЙрдкрдпреБрдХреНрдд-рдЕрдкрдбреЗрдЯ/рдЕрдкрдЧреНрд░реЗрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
// рдФрд░ SSH рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░реЗрдВред рдмрд╛рдХреА рд╣рдо Cloudinit/sshinit рдкрд░ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
udata := cloudconfig.NewUserdataConfig(icfg, cloudcfg) ?> рдЗрд░реЗрдЯ: рд░рд┐рдЯрд░реНрди nil, рдЗрд░реЗрдЯ
рдЕрдЧрд░ icfg.рдмреВрдЯрд╕реНрдЯреНрд░реИрдк != nil {
udata.ConfigureBasic() ?> err: рд░рд┐рдЯрд░реНрди nil, err
рд╡рд╛рдкрд╕реА рдЙрдбрддрд╛, рд╢реВрдиреНрдп
}
udata.Configure() ?> рдЗрд░реЗрдЯ: рд░рд┐рдЯрд░реНрди nil, рдЗрд░реЗрдЯ
рд╡рд╛рдкрд╕реА рдЙрдбрддрд╛, рд╢реВрдиреНрдп
}
func ComposeUserData(icfg *instancecfg.InstanceConfig, Cloudcfg Cloudinit.CloudConfig, рд░реЗрдВрдбрд░рд░ рд░реЗрдВрдбрд░рд░реНрд╕.рдкреНрд░реЛрд╡рд╛рдЗрдбрд░рд░реЗрдВрдбрд░рд░) ([]рдмрд╛рдЗрдЯ, рдПрд░рд░) {
рдЕрдЧрд░ рдХреНрд▓рд╛рдЙрдбрд╕реАрдПрдлрдЬреА == рд╢реВрдиреНрдп {
Cloudcfg = Cloudinit.New(icfg.Series)?> рдПрд░рд░: рд░рд┐рдЯрд░реНрди nil, рдПрд░рд░реНрд╕ред рдЯреНрд░реЗрд╕ (рдЗрд░реЗрдЯ)
}
configCloudinit(icfg, cloudcfg)?> рддреНрд░реБрдЯрд┐: рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп, рддреНрд░реБрдЯрд┐рдпрд╛рдБред рдЯреНрд░реЗрд╕ (рдЧрд▓рддреА)
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо := Series.GetOSFromSeries(icfg.Series) ?> рдПрд░рд░: рд░рд┐рдЯрд░реНрди nil, рдПрд░рд░реНрд╕ред рдЯреНрд░реЗрд╕ (рдЗрд░реЗрдЯ)
udata := renderer.Render(cloudcfg, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо) ?> рдПрд░рд░: рд░рд┐рдЯрд░реНрди nil, рдПрд░рд░реНрд╕ред рдЯреНрд░реЗрд╕ (рдЗрд░реЗрдЯ)
logger.Tracef("рдЬреЗрдирд░реЗрдЯреЗрдб рдХреНрд▓рд╛рдЙрдб рдЗрдирд┐рдЯ:\n%s", string(udata))
рд╡рд╛рдкрд╕реА рдЙрдбрддрд╛, рд╢реВрдиреНрдп
}

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/21161#issuecomment-319359614 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AbwRO_J0h2dQHqfysf2roA866vFN4_1Jks5sTx5hgaJpZM4Oi1c-
.

рдХреНрдпрд╛ рдореИрдВ рдЕрдХреЗрд▓рд╛ рд╣реВрдВ рдЬреЛ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд░реВрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдВрдЧреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рджрдЧреА рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рд╕рдорд╛рди рдпрд╛ рд╡рд┐рдирд┐рдореЗрдп рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рдБ, рдпреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЫреЛрдЯреА рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдпреЗ рдЙрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдпрд╛ рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ред

@rodcorsi рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдореВрд▓реА рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдореМрдЬреВрджрд╛ if рдФрд░ for рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рджреЛрдиреЛрдВ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ select рдФрд░ switch рджреЛрдиреЛрдВ рдХрд░реНрд▓реА-рдмреНрд░реЗрд╕-рд╕реАрдорд╛рдВрдХрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рднреА рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдкрд╛рд░реНрд╕ рдЯреНрд░реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдирдП рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдмрд╛рдж рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реЗ рд╕реНрдХреЗрдЪ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдорди рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВ:


NonZeroGuardStmt = ( Expression | IdentifierList ":=" Expression |
                     ExpressionList assign_op Expression ) "=?" [ identifier ] Block .
ZeroGuardStmt = ( Expression | IdentifierList ":=" Expression |
                  ExpressionList assign_op Expression ) "=!" Block .

рдПрдХ NonZeroGuardStmt Block NonZeroGuardStmt рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ Expression рдХрд╛ рдЕрдВрддрд┐рдо рдорд╛рди рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреЛрдИ identifier рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╡рд╣ Block рднреАрддрд░ рдЙрд╕ рдорд╛рди рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред рдПрдХ ZeroGuardStmt Block ZeroGuardStmt рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ Expression рдХрд╛ рдЕрдВрддрд┐рдо рдорд╛рди рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рдХреЗ рд▓рд┐рдП := рдлрд╛рд░реНрдо, рдХреЗ рдЕрдиреНрдп (рдкреНрд░рдореБрдЦ) рдорд╛рди Expression рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ IdentifierList рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ ShortVarDecl ред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпреБрдХреНрдд рджрд╛рдпрд░реЗ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ Block рднреАрддрд░ рднреА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВред

assign_op рдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдСрдкрд░реЗрдВрдб рдкрддрд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рдореИрдк рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди, рдпрд╛ (рдХреЗрд╡рд▓ = рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП) рд░рд┐рдХреНрдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдСрдкрд░реЗрдВрдб рдХреЛ рдХреЛрд╖реНрдардХ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджрд╛рдИрдВ рдУрд░ рдХреЗ рдЕрдиреНрдп (рдЕрдЧреНрд░рдгреА) рдорд╛рди Expression рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди Assignment рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ Block рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдП рдмрд┐рдирд╛ рдХрд┐ Block рдлрд┐рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред


рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡реНрдпрд╛рдХрд░рдг рдЧреЛ 1 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ: ? рдПрдХ рдорд╛рдиреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрд╕ рдЪрд░рд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдИ рдореМрдЬреВрджрд╛ рдЧреЛ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ ! рдПрдХ рд╡реИрдз рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдХреЛрдИ рдирд╣реАрдВ рд╣реИ рдореМрдЬреВрджрд╛ рдЙрддреНрдкрд╛рджрди рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рдж { ред

@bcmills LGTM ,

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк =? рдФрд░ =! рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдмрдирд╛ рджреЗрдВрдЧреЗ, рдЬреЛ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд рдмрдирд╛ рджреЗрдЧрд╛ред

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рддреБрдо рдмрдирд╛рдУрдЧреЗ =? рдФрд░ =! рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЯреЛрдХрди рд╣реИ, рдЬреЛ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд рдмрдирд╛ рджреЗрдЧрд╛ред

рд╣рдо рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЗрдХреНрд╕рд░ рдореЗрдВ рдирд╣реАрдВ: рдЕрдиреБрдХреНрд░рдо "=!" рдорд╛рдиреНрдп рдЧреЛ 1 рдХреЛрдб (https://play.golang.org/p/pMTtUWgBN9) рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред

рдХрд░реНрд▓реА-рдмреНрд░реЗрд╕ рд╡рд╣ рд╣реИ рдЬреЛ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ: =! рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмреВрд▓рд┐рдпрди рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдпрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдШреЛрд╖рдгрд╛рдПрдВ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░реНрд▓реА-рдмреНрд░реЗрд╕ (https) рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ://play.golang.org/p/ncJyg-GMuL) рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдирд┐рд╣рд┐рдд рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо (https://play.golang.org/p/lhcqBhr7Te) рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

@romainmenke рдирд╣реАрдВред рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВ рд╣реЛред рдореИрдВ рдПрдХ-рд▓рд╛рдЗрдирд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдорд╛рди рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реВрдВред рдЖрдк рдПрдХ рд▓рд╛рдЗрди рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рднрд╛рдЧ рдЫрд┐рдкрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдЙрдиреНрд╣реЗрдВ рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдЖрд╕рд╛рди рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝-рдЖрдЦрд┐рд░рдХрд╛рд░ рдпрд╣рд╛рдВ рдХрдИ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рд╣реИред

рдореБрдЭреЗ check рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛ рднреА рд╕рдХрддреЗ рд╣реИрдВ

f, err := os.Open(myfile)
check err
defer check f.Close()

рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ defer рд╕рд╛рде рднреА рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред check рднреА рдмрд╣реБрдд рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рддреЛ Google рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ error рдкреНрд░рдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреБрдЫ рднреА рдЬреЛ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рддреЛ, рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдХреЗ рдкрд╛рд╕ check рд▓рд┐рдП Next() bool ред

рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рд╕реНрдХреИрдирд░ рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рджрд┐рдЦрддрд╛ рд╣реИ

func (s *Scanner) Next() bool {
    if s.Error != nil || s.pos >= s.RecordCount {
        return false
    }
    s.pos++

    var rt uint8
    if !s.read(&rt) {
        return false
    }
...

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд╣ рдЖрдЦрд┐рд░реА рдмрд┐рдЯ check s.read(&rt) рд╕рдХрддрд╛ рд╣реИред

@carlmjohnson

рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ defer рд╕рд╛рде рднреА рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдпрд╣ рдорд╛рди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЖрдк рдЙрд╕ рдзрд╛рд░рдгрд╛ рдХреЛ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

defer f.Close() =? err { return err }

рдЪреВрдВрдХрд┐ @ALTree рдХрд╛ check рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдЕрд▓рдЧ рдмрдпрд╛рди рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ defer рд╕рд╛рде рдХреИрд╕реЗ рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдХрд░рддрд╛ рд╣реИред

defer func() {
  err := f.Close()
  check err, fmt.Errorf(тАж, err) // But this func() doesn't return an error!
}()

рдЕрдВрддрд░:

defer f.Close() =? err { return fmt.Errorf(тАж, err) }

рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХрд╛ рдФрдЪрд┐рддреНрдп рдмреЗрд╣рддрд░ "рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕" рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдХрдо рд╣реИред рдпреЗ рдХреЛрдб рдХреА рд░рдЦрд░рдЦрд╛рд╡ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ? рд░рдЪрдирд╛рд╢реАрд▓рддрд╛? рдкрдардиреАрдпрддрд╛? рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА?

@jimmyfrasche

рдпреЗ рдХреЛрдб рдХреА рд░рдЦрд░рдЦрд╛рд╡ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ? рд░рдЪрдирд╛рд╢реАрд▓рддрд╛? рдкрдардиреАрдпрддрд╛? рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА?

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рд╢рд╛рдпрдж рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕реНрдкрд╖реНрдЯ рджрд╛рдпрд░реЗ рдФрд░ err рдЪрд░ рд╕реЗ рдЖрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: #19727, #20148, #5634, #21114, рдФрд░ рд╢рд╛рдпрдж рд╡рд┐рднрд┐рдиреНрди рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рджреЗрдЦреЗрдВред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИред

@bcmills рдПрдХ рдкреНрд░реЗрд░рдгрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЦреЗрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдпрд╛рдж рдХрд┐рдпрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрд╕ рдЖрдзрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, "рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕реНрдкрд╖реНрдЯ рджрд╛рдпрд░реЗ" рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдЪрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдЪрд░ рдХреЗ рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рднреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдЬрдм := рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЧреЛ рдирдЯреНрд╕ рдкрд░ рдЙрд╕ рдзрд╛рдЧреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд▓рд╛рд╣рд▓ рдерд╛, рдЬреЛ рдХрд┐ рдирд┐рд╣рд┐рдд рдХреЗ рдмрдЬрд╛рдп рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдореЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП "рдХреЗрд╡рд▓ рдЙрд╕ рдЪрд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░рд╛" рдЬреЛ рдХрд┐ рд╕рднреА рд╕реВрдХреНрд╖реНрдо рдХрдард┐рди-рд╕реЗ-рджреЗрдЦрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИрдВред

рдореБрдЭреЗ рд╡рд╣ рдзрд╛рдЧрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд▓рд┐рдВрдХ рд╣реИ?

рдРрд╕реА рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди := рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдиреЗ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдПрдХ рдЧрдВрднреАрд░ рдЧрд▓рддреА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рд░рд╛ред рд╢рд╛рдпрдж := рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рджреЛрдмрд╛рд░рд╛ рдЧреМрд░ рдХрд░рдирд╛ рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЕрдиреНрдп рдЪрд░рдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ?

@jimmyfrasche

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрд╕ рдЖрдзрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, "рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕реНрдкрд╖реНрдЯ рджрд╛рдпрд░реЗ" рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдЪрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдВред рдпрд╣ рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдореБрдЭреЗ =? рдпрд╛ :: рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рд╣реИ рдЬрд┐рд╕реЗ @jba рдФрд░ рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ: рдпрд╣ рдЧреИрд░-рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ (рдПрдХ рд╕реАрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рд╕рдмрд╕реЗрдЯ) рддрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдЯреИрдЧ-рд╕рдВрдШ/varint/рдмреАрдЬрдЧрдгрд┐рддреАрдп рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдореЗрдВ рдЕрдзрд┐рдХ рдЦреБрд╢ рд░рд╣реВрдВрдЧрд╛ (# 19412 рднреА рджреЗрдЦреЗрдВ), рд▓реЗрдХрд┐рди рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ: рдпрд╣ рджреЗрдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рд╡рд╛рдкрд╕ рд▓реЗрдВрдЧреЗ рдорд┐рд╢реНрд░рд┐рдд рдЧреЛ 1 / рдЧреЛ 2 рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдкрд░ред

рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА?

рдореЗрд░реЗ рдФрд░ @bcmills рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ, рдЖрдкрдХреА рдЖрдВрдЦ рдмрд╛рдИрдВ рдУрд░ рдиреАрдЪреЗ рдХреА рдУрд░ рд╕реНрдХреИрди рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рд▓реЗ рд╕рдХрддреА рд╣реИред

@bcmills рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ # 19412 рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЖрдзреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдореБрдЭреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмреЗрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ;)

рдЬрдм рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдЪрд╛рд░ рдорд╛рдорд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ

  1. рдмрд╕ рдПрдХ рддреНрд░реБрдЯрд┐ (рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ)
  2. рд╕рд╛рдорд╛рди рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ (рдЖрдк рдЗрд╕реЗ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рд╕рдВрднрд╛рд▓реЗрдВрдЧреЗ рдЬреИрд╕реЗ рдЖрдк рдЕрднреА рдХрд░реЗрдВрдЧреЗ)
  3. рдПрдХ рдмрд╛рдд рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ (рдЖрдк рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! :tada: )
  4. рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдЪреАрдЬреЗрдВ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐

рдпрджрд┐ рдЖрдк 4 рд╣рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЪреАрдЬреЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ (рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рд░рд╣рд┐рдд рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░) рдпрджрд┐ рдЖрдк "рдпрд╣ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐" рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрдВрдбрд▓ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреЗрд╕ 3 рдореЗрдВ рдХрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЯрдкрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рд╕рдВрдЧрддрддрд╛ рдореБрджреНрджреЛрдВ рдФрд░ рдЕрдЬреАрдм рдУрд╡рд░рд▓реИрдкреНрд╕ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ ( func() (int, string, error) рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЯрдкрд▓ рд╣реИ рдпрд╛ рдПрдХрд╛рдзрд┐рдХ рд░рд┐рдЯрд░реНрди рдорд╛рди рдПрдХ рдЕрд▓рдЧ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИрдВ? рдпрджрд┐ рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЯрдкрд▓ рд╣реИ рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм func() (n int, msg string, err error) рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ!? рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рддреЛ рдореИрдВ рдлрд╝реАрд▓реНрдб рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪреВрдВ рдпрджрд┐ рдореИрдВ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ!)

рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрдИ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ рддреЛ рд╡реЗ рдЗрд╕реЗ рдФрд░ рднреА рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдорд╛рдорд▓реЗ рдХреЛ рдХреЗрд╡рд▓ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдкреВрд░реНрдг 'рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреНрд░реБрдЯрд┐' рдпреЛрдЧ рдХреЛ рдЫрд╛рдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@jba рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рдВрдЫрдиреАрдп рд╕рдВрдкрддреНрддрд┐ рдХреИрд╕реЗ рд╣реИред рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рджреЛ рдЖрдпрд╛рдореА рдмрдирд╛рдиреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рд╕рд╣рдЬрддрд╛ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдХрдореА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдЗрд╕рдХрд╛ рд▓рд╛рдн рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдЯрдкрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ [тАж]

рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдХреЙрд▓ рд╕рд╛рдЗрдЯреЗрдВ рд╣реЛрдВрдЧреА (рдХреЛрдИ рдФрд░ рдЧрд▓рддреА рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╕реНрдерд┐рддрд┐рддреНрдордХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдирд╣реАрдВ!), рдФрд░ # 12854 рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд░рд┐рдЯрд░реНрди рд╕реЗ рдЬреБрдбрд╝реЗ рдмрд╣реБрдд рд╕реЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ред

рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╡рд╛рд╕рди рд╣реИ: рд╣рдо рдЧреЛ 1 рдХреЗ "рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐" рдореЙрдбрд▓ рд╕реЗ рдЧреЛ 2 рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд "рдорд╛рди рдпрд╛ рддреНрд░реБрдЯрд┐" рдореЙрдбрд▓ рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдЬреИрд╕реЗ io.Writer рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдорд╛рди" рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐"?

рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрдИ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЕрдирдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЖрдЬ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЖрдк "рдЕрд╕рдордорд┐рдд рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди" рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ =? рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

i := match strconv.Atoi(str) | err error { return err }

рдЬрд╣рд╛рдВ match рдкрд╛рд░рдВрдкрд░рд┐рдХ рдПрдордПрд▓-рд╢реИрд▓реА рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдСрдкрд░реЗрд╢рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЧреИрд░-рд╡рд┐рд╕реНрддреГрдд рдорд┐рд▓рд╛рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ( interface{} рдпрджрд┐ рд╕рдВрдШ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмреЗрдЬреЛрдбрд╝ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ) рдПрдХ рдЧреИрд░-рд╡рд┐рд╕реНрддреГрдд рдореИрдЪ рд╡рд┐рдлрд▓рддрд╛ рд╕реЗ рдШрдмрд░рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдпред

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА https://github.com/mpvl/errd рдкрд░ рдПрдХ рдкреИрдХреЗрдЬ рдХреА рдЬрд╛рдБрдЪ рдХреА рд╣реИ рдЬреЛ рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдореБрджреНрджреЛрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдХреЛрдИ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ)ред рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рди рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЦрд╛рд╕рдХрд░ defer рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдореЗрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЗрд╕реЗ "рдмрд░реНрдирд░" рдкреИрдХреЗрдЬ рдорд╛рдирддрд╛ рд╣реВрдВ; рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрднрд╡ рдФрд░ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ, рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЪреАрдЬ рдмрди рдЬрд╛рдПрдЧрд╛ред

рдЕрднреА рдХреБрдЫ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреИрдХреЗрдЬ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

@bcmills a рдорд┐рд▓рд┐рдпрди:+1: #12854 рдХреЗ рд▓рд┐рдП

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, "рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ рдФрд░ рдПрд░рд░" рдФрд░ "рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ рдпрд╛ рдПрд░рд░" рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдореИрдХреНрд░реЛ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдВрдЧ рдкрд░ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрдЧ рд╣реЛрдВрдЧреЗ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рд░рдирдЯрд╛рдЗрдо рдкреИрдирд┐рдХ рдЬрдм рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ "рдПрдХреНрд╕ рдФрд░ рддреНрд░реБрдЯрд┐" func рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛)ред

рдореБрдЭреЗ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдпрд╣ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬреЛ рдХрд┐ рдЗрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдкреНрд░рдореБрдЦ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЧреЛ рдЪреАрдиреА рдпрд╛ рдЬрд╛рджреВ рдкрд░ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдкреНрд▓рд╕ рд╣реИред

рдПрдХ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЫрд▓рд╛рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдбрд╝рддрд╛ рдФрд░ рдмрд╣реБрдд рдХрдо рдЬрд╛рдирдХрд╛рд░реА рд╣реИред

рдЕрдЧрд░ рдЧреЛ 2 рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдорд┐рд▓рддреЗ рд╣реИрдВ-рдЬреЛ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЭрдЯрдХрд╛ рджреЗрдЧрд╛ (рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ!)-рдЕрдЧрд░ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ "рдирдИ рд╢реИрд▓реА" рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзреАрдореА рдХреНрд░рдорд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕ рдмреАрдЪ рдпрд╣рд╛рдВ рднреА рд╣реЛрдЧрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рдЦрдВрдбрди рдФрд░ рднреНрд░рдо, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╢реБрджреНрдз рд╕рдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рддреБрд░рдВрдд рддреАрди рдЪреИрдирд▓реЛрдВ рдХреЗ рдмрдЬрд╛рдп chan union { Msg1 T; Msg2 S; Err error } рдЬреИрд╕реЗ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛)ред

рдЕрдЧрд░ рдпрд╣ рдкреНрд░реА-рдЧреЛ1 рд╣реЛрддрд╛ рдФрд░ рдЧреЛ рдЯреАрдо рдХрд╣ рд╕рдХрддреА рдереА рдХрд┐ "рд╣рдо рдЕрдЧрд▓реЗ рдЫрд╣ рдорд╣реАрдиреЗ рд╕рдм рдХреБрдЫ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдПрдВрдЧреЗ рдФрд░ рдЬрдм рдпрд╣ рд╕рд╛рдорд╛рди рддреЛрдбрд╝ рджреЗрдЧрд╛, рддреЛ рдмрдиреЗ рд░рд╣реЗрдВ" рдпрд╣ рдПрдХ рдмрд╛рдд рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЕрднреА рд╣рдо рдореВрд▓ рд░реВрдк рд╕реЗ рдлрдВрд╕ рдЧрдП рд╣реИрдВ рднрд▓реЗ рд╣реА рд╣рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдорд┐рд▓реЗред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, "рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ рдФрд░ рдПрд░рд░" рдФрд░ "рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ рдпрд╛ рдПрд░рд░" рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдореИрдХреНрд░реЛ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ рдХреЛ рдорд╛рдВрдЧ рдкрд░ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ рдПрдВрдб рдПрд░рд░" рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рднреА рд╣реЛред рдпрджрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЗ "рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ рдпрд╛ рддреНрд░реБрдЯрд┐" рд╣реИрдВ, рдФрд░ рдирдпрд╛ рддрд░реАрдХрд╛ рдХреЗрд╡рд▓ рдЙрд╕реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рджреБрд░реНрд▓рдн "рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ рдФрд░ рддреНрд░реБрдЯрд┐" рдХреЗ рд▓рд┐рдП 1 рд╕рдВрдЧрдд рддрд░реАрдХрд╛ рдкрд░ рдЬрд╛рдПрдВред

@nigeltao рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ рдкреВрд░реЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдореМрдЬреВрджрд╛ рд╢реИрд▓реА рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред

@jimmyfrasche рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдЖрдк рдореЗрд░реА рдмрд╛рдд рджреЗрдЦ рд╕рдХрддреЗ README рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рджреГрд╢реНрдп рд╕рд╛рдХреНрд╖реНрдп рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдореНрдореЛрд╣рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ред

@jba рдиреЗ рдмрд╛рдд рджреЗрдЦреА рдФрд░ README рдкрдврд╝рд╛ред рдЕрдм рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреЛрд╖реНрдардХ/рдлреБрдЯрдиреЛрдЯ/рдПрдВрдбрдиреЛрдЯ/рд╕рд┐рдбреЗрдиреЛрдЯ рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдВ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ (рдФрд░ рдореИрдВ рд╕рд┐рдбреЗрдиреЛрдЯреНрд╕ (рдФрд░ рдХреЛрд╖реНрдардХ) рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ)ред

рдпрджрд┐ рд▓рдХреНрд╖реНрдп, рдПрдХ рдмреЗрд╣рддрд░ рд╢рдмреНрдж рдХреА рдХрдореА рдХреЗ рд▓рд┐рдП, рджреБрдЦреА рдкрде рдХреЛ рдкрдХреНрд╖ рдореЗрдВ рд░рдЦрдирд╛ рд╣реИ, рддреЛ рдПрдХ $EDITOR рдкреНрд▓рдЧрдЗрди рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рд╕рднреА рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ред

рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХ рд╕реБрдЧрдард┐рдд рдмрдирд╛рддрд╛ рд╣реИред @bcmills рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕рдореЗрдВ := рд╕реЗ рдЕрд▓рдЧ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдирд┐рдпрдо рди рд╣реЛрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрдЧрд╛ред

@bcmills рдореБрдЭреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣реА рд╣реИред рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреБрд░рд╛рдирд╛ рддрд░реАрдХрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

err := foo()
if err != nil {
  return n, err  // n can be non-zero
}

рдирдпрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрддрд╛ рд╣реИ

check foo()

рдпрд╛

foo() || &FooError{err}

рдпрд╛ рдмрд╛рдЗрдХрд╢реЗрдб рдХрд╛ рд░рдВрдЧ рдЬреЛ рднреА рд╣реЛред рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдХреНрд░рдордг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕реЗ рд╕рднреА рдХреЛ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред

@ianlancetaylor рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП: рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рди рдХреЗрд╡рд▓ рдЪреАрдЬреЛрдВ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдирд┐рдХ рдФрд░ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдирд╛ рд╕рд╣реА рд╣реЛрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Google рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд╣рд╛рдБ рд╣рдо рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдкрд░ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдирд╛ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
    client, err := storage.NewClient(ctx)
    if err != nil {
        return err
    }
    defer client.Close()

    w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
    defer func() {
        if r := recover(); r != nil {
            w.CloseWithError(fmt.Errorf("panic: %v", r))
            panic(r)
        }
        if err != nil {
            _ = w.CloseWithError(err)
        } else {
            err = w.Close()
        }
    }
    _, err = io.Copy(w, r)
    return err
}

рдЗрд╕ рдХреЛрдб рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕реЗ рддреНрд░реБрдЯрд┐ рдЪреБрдкрдХреЗ рд╕реЗ рдирд╛рдорд┐рдд рд╡рд╛рдкрд╕реА рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ defer рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
  • рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо r рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЖрддрдВрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВред
  • рдкрд╣рд▓реЗ рдмрдВрдж рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реЗ рдЖрд▓рд╕реА-рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЖрд░реНрдЯрд┐рдлреИрдХреНрдЯ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рдкреИрдХреЗрдЬ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

func writeToGS(ctx context.Context, bucket, dst, src string, r io.Reader) error {
    return errd.Run(func(e *errd.E) {
        client, err := storage.NewClient(ctx)
        e.Must(err)
        e.Defer(client.Close, errd.Discard)

        w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
        e.Defer(w.CloseWithError)

        _, err = io.Copy(w, r)
        e.Must(err)
    })
}

errd.Discard рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рд╣реИред рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдкреЗрдЯрдиреЗ, рд▓реЙрдЧ рдХрд░рдиреЗ, рдЬреЛ рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

e.Must foo() || wrapError . рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

e.Defer рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ рдФрд░ рдЯрд╛рд▓рдордЯреЛрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддрд╛ рд╣реИред

рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдб рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

func writeToGS(ctx context.Context, bucket, dst, src string, r io.Reader) error {
    return errd.Run(func(e *errd.E) {
        client := e.Must(storage.NewClient(ctx))
        e.Defer(client.Close, errd.Discard)

        w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
        e.Defer(w.CloseWithError)

        _ = e.Must(io.Copy(w, r))
    })
}

рдпрджрд┐ рд╣рдо рдбреЗрдлрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдорд╛рдирдХреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдРрд╕рд╛ рднреА рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

func writeToGS(ctx context.Context, bucket, dst, src string, r io.Reader) error {
    return errd.Run(func(e *errd.E) {
        client := e.DeferClose(e.Must(storage.NewClient(ctx)), errd.Discard)
       e.Must(io.Copy(e.DeferClose(client.Bucket(bucket).Object(dst).NewWriter(ctx)), r)
    })
}

рдЬрд╣рд╛рдВ DeferClose рдпрд╛ рддреЛ Close рдпрд╛ CloseWithError рдХреЛ рдЪреБрдирддрд╛ рд╣реИред рдпрд╣ рдирд╣реАрдВ рдХрд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдПрдореНрд╕реНрдЯрд░реНрдбрдо рдореАрдЯрдЕрдк рдореЗрдВ рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рджреА рдереА рдФрд░ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЗрд╕реЗ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЙрдкрдпреЛрдЧреА рдорд╛рдиреА рдЬрд╛рддреА рд╣реИред

рдПрдХ рд╕рдорд╛рдзрд╛рди рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЪреАрдЬреЛрдВ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

@ALTree рддреНрд░реБрдЯрд┐ рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ "рдкрд░рд┐рд╖реНрдХреГрдд рддреНрд░реБрдЯрд┐-рд╡рд╕реВрд▓реА" рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИред

@jimmyfrasche : errd рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдореЗрдВ рднреА рдмреБрдирддрд╛ рд╣реИред

@jimmyfrasche : рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛрдб рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

@romainmenke : рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдлреЛрдХрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@jba : рдЧрд▓рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗрд╡рд▓ рдмрд╛рдИрдВ рдУрд░ рджреЗрдЦрдХрд░ рддреНрд░реБрдЯрд┐ рдмрдирд╛рдо рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ (рдИ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝ рддреНрд░реБрдЯрд┐ рдпрд╛ рд╕реНрдердЧрд┐рдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реИ)ред рдпрд╣ рд╕реНрдХреИрди рдХрд░рдирд╛ рднреА рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рддреНрд░реБрдЯрд┐ рдпрд╛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреМрди рд╕рд╛ рдирд╣реАрдВред

@bcmills : рд╣рд╛рд▓рд╛рдБрдХрд┐ errd рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд рддреНрд░реБрдЯрд┐ рдЪрд░ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди, AFAICT рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд▓рддреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрддрдВрдХ рдФрд░ рд╡рд╕реВрд▓реА рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рджрдВрдб рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдПрдХ рд╕рдордЧреНрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред

@urandom : рд╣реБрдб рдХреЗ рддрд╣рдд рдЗрд╕реЗ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХрд▓ рд╕реНрдердЧрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдореВрд▓ рдХреЛрдб:

  • рдиреЛ рдбрд┐рдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рджрдВрдб рдмрдбрд╝рд╛ рд╣реИ, рд▓рдЧрднрдЧ 100ns*ред
  • рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╡рд┐рд▓рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдЪрд▓рдиреЗ рдХрд╛ рд╕рдордп рдпрд╛ рддреНрд░реБрдЯрд┐ рдПрдХ рд╣реА рдХреНрд░рдо рдХрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рд╣рдж рддрдХ рдзреАрдорд╛
  • рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдЪрд▓рдиреЗ рдХрд╛ рд╕рдордп рд▓рдЧрднрдЧ рдмрд░рд╛рдмрд░ рд╣реИ; рдпрджрд┐ рд╡рд┐рд▓рдВрдм рдХреА рд╕рдВрдЦреНрдпрд╛> 1 . рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рддреЗрдЬреА рд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИ

рдЕрдиреНрдп рдЙрдкрд░рд┐рд╡реНрдпрдп:

  • Defer рдХреЛ рдкрд╛рд╕рд┐рдВрдЧ рдХреНрд▓реЛрдЬрд░ (w.Close) рд╡рд░реНрддрдорд╛рди рдореЗрдВ DeferClose рдпрд╛ DeferFunc API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 25ns* рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рд░рд┐рд▓реАрдЬрд╝ v0.1.0 рджреЗрдЦреЗрдВ)ред @rsc рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ред
  • рд╣реИрдВрдбрд▓рд░ ( e.Must(err, msg("oh noes!") ) рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рддреНрд░реБрдЯрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рд▓рд╛рдЧрдд рдЧреЛ 1.8 рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ 30ns рд╣реИред рдЯрд┐рдк (1.9) рдХреЗ рд╕рд╛рде, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрднреА рднреА рдПрдХ рдЖрд╡рдВрдЯрди, рдореИрдВрдиреЗ 2ns рдкрд░ рд▓рд╛рдЧрдд рджреЗрдЦреАред рдмреЗрд╢рдХ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд рдЕрднреА рднреА рдирдЧрдгреНрдп рд╣реИред

(*) рдореЗрд░реЗ 2016 рдореИрдХрдмреБрдХ рдкреНрд░реЛ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдирдВрдмрд░ред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдпрджрд┐ рдЖрдкрдХрд╛ рдореВрд▓ рдХреЛрдб defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ рд▓рд╛рдЧрдд рд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдЧрддреА рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдСрд╕реНрдЯрд┐рди рдЖрд╕реНрдердЧрди рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдордп рдХреЗ рд╕рд╛рде рд▓рд╛рдЧрдд рдХрдо рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╡реИрд╕реЗ рднреА, рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреИрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдФрд░ рдЕрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдЧреЛ 2 рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рднрд╛рд╖рд╛ рдЬреЛрдбрд╝ рдмрдирд╛ рд╕рдХреЗрдВред рд╡рд░реНрддрдорд╛рди рдЪрд░реНрдЪрд╛ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдпрд╣ рдПрдХ рдХреЛ рдХрдо рдХрд░рдиреЗ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ, рдЬрдмрдХрд┐ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ рдФрд░ рдпрдХреАрдирди рдЕрдиреНрдп рдмрд┐рдВрджреБ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

@jimmyfrasche :

рддрдм рдПрдХ $EDITOR рдкреНрд▓рдЧрдЗрди рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛

рд╣рд╛рдВ, рдореИрдВ рдмрд╛рддрдЪреАрдд рдореЗрдВ рдпрд╣реА рддрд░реНрдХ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣рд╛рдБ рдореИрдВ рдпрд╣ рддрд░реНрдХ рджреЗ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрджрд┐ рд╣рдо рдХреЛрдИ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ "рд╕рд┐рдбреЗрдиреЛрдЯ" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@nigeltao

рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреБрд░рд╛рдирд╛ рддрд░реАрдХрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдореИрдВ рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВред

рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░ рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо "рдорд╛рди рдпрд╛ рддреНрд░реБрдЯрд┐" рдорд╛рдирдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЪреБрдирддреЗ рд╣реИрдВ - рдЬреИрд╕реЗ || , try тАж catch , рдпрд╛ match - рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ "рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐" рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣реИ, рдФрд░ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХреМрди рд╕рд╛ рд╣реИред

рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рдордп, рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐" рдФрд░ "рдорд╛рди рдпрд╛ рддреНрд░реБрдЯрд┐" рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ:

func Atoi(string) (int, error)

рддрдерд╛

func WriteString(Writer, String) (int, error)

рд╕рдорд╛рди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВред

@mpvl рдореИрдВ

рдпрджрд┐ рд╣рдо рд╡рд┐рдердбрд┐рдлреЙрд▓реНрдЯ () рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп funcs рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╣рдо рд╣рдореЗрд╢рд╛ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдирд┐рд░реНрдгрдп рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкреВрд░реНрдг рдиреНрдпреВрдирддрдо рдирдВрдЧреЗ рдПрдкреАрдЖрдИ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдиреАрдЪреЗ?

type Handler = func(ctx context.Context, panicing bool, err error) error
Run(context.Context, func(*E), defaults ...Handler) //egregious style but most minimal
type struct E {...}
func (*E) Must(err error, handlers ...Handler)
func (*E) Defer(func() error, handlers ...Handler)

рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдореБрдЭреЗ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ IsSentinel рдореВрд▓ рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@jimmyfrasche

@bcmills рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЦреНрдп рд╕реБрдзрд╛рд░ err рдЪрд░ рдХреЛ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдиреЗ рдореЗрдВ рд╣реИред рдЗрд╕рд╕реЗ рдмрдЧ рд╕реЗ рдмрдЪрдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ https://github.com/golang/go/issues/19727 рд╕реЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП

    res, err := ctxhttp.Get(ctx, c.HTTPClient, dirURL)
    if err != nil {
        return Directory{}, err
    }
    defer res.Body.Close()
    c.addNonce(res.Header)
    if res.StatusCode != http.StatusOK {
        return Directory{}, responseError(res)
    }

    var v struct {
        тАж
    }
    if json.NewDecoder(res.Body).Decode(&v); err != nil {
        return Directory{}, err
    }

рдмрдЧ рдЕрдВрддрд┐рдо if-statement рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ: Decode рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдХреЗ рдЪреЗрдХ рд╕реЗ err рдЕрднреА рднреА рджрд╛рдпрд░реЗ рдореЗрдВ рдерд╛ред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, :: рдпрд╛ =? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛:

    res := ctxhttp.Get(ctx, c.HTTPClient, dirURL) =? err { return Directory{}, err }
    defer res.Body.Close()
    c.addNonce(res.Header)
    (res.StatusCode == http.StatusOK) =! { return Directory{}, responseError(res) }

    var v struct {
        тАж
    }
    json.NewDecoder(res.Body).Decode(&v) =? err { return Directory{}, err }

рдпрд╣рд╛рдВ рджреЛ рд╕реНрдХреЛрдкрд┐рдВрдЧ рд╕реБрдзрд╛рд░ рд╣реИрдВ рдЬреЛ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ:

  1. рдкрд╣рд▓рд╛ err (рдкрд╣рд▓реЗ Get рдХреЙрд▓ рд╕реЗ) рдХреЗрд╡рд▓ return рдмреНрд▓реЙрдХ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрд╛рдж рдХреА рдЬрд╛рдВрдЪ рдореЗрдВ рдЧрд▓рддреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  2. рдЪреВрдВрдХрд┐ err рд╕реЗ Decode рдХреЛ рдЙрд╕реА рдХрдерди рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рд╢реВрдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдШреЛрд╖рдгрд╛ рдФрд░ рдЪреЗрдХ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╡рд┐рд╖рдорддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

(1) рдЕрдХреЗрд▓реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛, рд▓реЗрдХрд┐рди (2) рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдЧрд╛рд░реНрдб рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдмрдЪрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

@bcmills рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рддреЛ, res := ctxhttp.Get(ctx, c.HTTPClient, dirURL) =? err { return Directory{}, err } рдореЗрдВ =? рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИ

var res *http.Reponse
{
  var err error
  res, err = ctxhttp.Get(ctx, c.HTTPClient, dirURL)
  if err != nil {
    return Directory{}, err 
  }
}

рдЕрдЧрд░ рдпрд╣ рд╕рд╣реА рд╣реИ рддреЛ рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣реА рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ := рд╕реЗ рдЕрд▓рдЧ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рднреНрд░рдо рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ:

func f() error {
  var err error
  g() =? err {
    if err != io.EOF {
      return err
    }
  }
  //one could expect that err could be io.EOF here but it will never be so
}

рдЬрдм рддрдХ рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрд╛ред

рд╣рд╛рдБ, рдпрд╣ рд╕рд╣реА рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ := рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рд╣реА рднреНрд░рдо рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛

рдпрд╣ рд╕рдЪ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдЧрд╛рд░реНрдб рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ ":" рд╡реЗрд░рд┐рдПрдВрдЯ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ "=" рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗрд╡рд▓ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ)ред

(рдФрд░ рдЕрдм рд╣реИ рдХрд┐ рдХреЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рд╡рд░реНрддрдиреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ? рдФрд░ ! рдХреЗ рдмрдЬрд╛рдп =? рдФрд░ =! ред)

res := ctxhttp.Get(ctx, c.HTTPClient, dirURL) ?: err { return Directory{}, err }

рд▓реЗрдХрд┐рди

func f() error {
  var err error
  g() ?= err { (err == io.EOF) ! { return err } }
  // err may be io.EOF here.
}

@mpvl errd рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рд╣реИрдВрдбрд▓рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╣реИ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдХреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ-рд╢реИрд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓рдмреИрдХ/рдирд┐рд░рдВрддрд░рддрд╛ рд╢реИрд▓реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ (рджреЛрдиреЛрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рдУрдВ рдЬреИрд╕реЗ рдЧреЛ рдФрд░ рд╕реА ++ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореЗрдВ) рдПрдордПрд▓ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓) рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдХреНрд╕рд░ рдмрд╣реБрдд рдХрдард┐рди рдмрд░рд╛рдмрд░ рдЕрдиреБрдХреНрд░рдорд┐рдХ / рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рд╣реИ, рдЬреЛ рднреА рдЬрд╛рдУ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреЗ рдмрд╛рдХреА рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рд╕реЗ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдПрдкреАрдЖрдИ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ Handler -рд╕реНрдЯрд╛рдЗрд▓ рдЪреЗрди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдкрдХреА Handler рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдВрдб-рдЗрди рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ Block рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рдЪреАрдЬрд╝ рдПрд╕?)

@bcmills рдореИрдВ рдЕрднреА рднреА рдЬрд╛рджреВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рдкрд░ рдирд╣реАрдВ рд╣реВрдВ рдЬреЛ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рджрд░реНрдЬрдиреЛрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдВрддрддрдГ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ x, err := f(); if err != nil { return err } рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реЗ рдЫреЛрдЯреЗ рддрд░реАрдХреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХреНрдпреЛрдВ рд╣реИрдВ

@bcmills рдореИрдВрдиреЗ @mpvl рдХреЗ рдкреНрд░реЗрд░рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛, рдЬрд┐рд╕рдореЗрдВ рдирд╡реАрдирддрдо =? рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдЧрдВрднреАрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИ, рдЬреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдирдпрд╛ рддреНрд░реБрдЯрд┐ рдЪрд░ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
        client := storage.NewClient(ctx) =? err { return err }
        defer client.Close()

        w := client.Bucket(bucket).Object(dst).NewWriter(ctx)

        defer func() {
                if r := recover(); r != nil { // r is interface{} not error so we can't use it here
                        _ = w.CloseWithError(fmt.Errorf("panic: %v", r))
                        panic(r)
                }

                if err != nil { // could use =! here but I don't see how that simplifies anything
                        _ = w.CloseWithError(err)
                } else {
                        err = w.Close()
                }
        }()

        io.Copy(w, r) =? err { return err } // what about n? does this need to be prefixed by a '_ ='?
        return nil
}

рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ =? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ред рджреВрд╕рд░реЗ рдореЗрдВ рдЗрд╕рдиреЗ рдХреЛрдб рдХреЛ рд▓рдВрдмрд╛ рдмрдирд╛ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ io.Copy рджреЛ рдЪреАрдЬреЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рд╡рд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ред

@jimmyfrasche рд╡рд╣ рдХреЛрдб рдЕрдкрд╡рд╛рдж рд╣реИ, рдирд┐рдпрдо рдирд╣реАрдВред рд╣рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рде рд╣реА, рдореИрдВ рд╕рд╡рд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ recover рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдЕрдЧрд░ w.Write рдпрд╛ r.Read (рдпрд╛ io.Copy !) рдШрдмрд░рд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдмрд┐рдирд╛ recover , рд╡рд╣рд╛рдБ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ defer , рдФрд░ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдиреАрдЪреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

_ = io.Copy(w, r) =? err { _ = w.CloseWithError(err); return err }
return w.Close()

@jimmyfrasche

// r is interface{} not error so we can't use it here

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЗрд░рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рдмреНрджрд╛рдВрдХрди ( https://github.com/golang/go/issues/21161#issuecomment-319434101 рдореЗрдВ) рд╢реВрдиреНрдп-рдорд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВред

// what about n? does this need to be prefixed by a '_ ='?

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред

рдореИрдВ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ @mpvl рдХреЗ recover рдЙрдкрдпреЛрдЧ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛: рдпрд╣ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдЖрддрдВрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рднреА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрд╛рд╣рд░реА recover рдХреЙрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ( рдЬреИрд╕реЗ fmt ) рдЧреЛ 2 рдореЗрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗред

рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдореИрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦреВрдВрдЧрд╛:

func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
        client := storage.NewClient(ctx) =? err { return err }
        defer client.Close()

        w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
        io.Copy(w, r) =? err {
                w.CloseWithError(err)
                return err
        }
        return w.Close()
}

рджреВрд╕рд░реА рдУрд░, рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдПрдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд╕рд╛рде рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдмрд╣реБрдд рдХрдо рдЕрд╡рд╕рд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, Close рдСрдкрд░реЗрд╢рди рд╕реЗ рд░рд┐рдХрд╡рд░реА рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рд╕реЗ IMO рдХреБрдЫ рд╣рдж рддрдХ рдХреНрд▓реАрдирд░ рдХреЛрдб рдмрди рдЬрд╛рддрд╛ рд╣реИред

func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
        client := storage.NewClient(ctx) =? err { return err }
        defer client.Close()

        w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
        defer func() {
                if err != nil {
                        _ = w.CloseWithError(err)
                } else {
                        err = w.Close()
                }
        }()
        defer func() {
                recover() =? r {
                        err = fmt.Errorf("panic: %v", r)
                        panic(r)
                }
        }()

        io.Copy(w, r) =? err { return err }
        return nil
}

@jba рдбрд┐рдлрд░ рд╣реИрдВрдбрд▓рд░ рд░реА-

@bcmills рдХрд┐ рдЕрдВрддрд┐рдо рд╕рдВрд╢реЛрдзрди рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рдЖрдкрдиреЗ =? рдирд┐рдХрд╛рд▓ рд▓рд┐рдпрд╛ рд╣реЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ)

@рдЬреЗрдмреАрдП :

_ = io.Copy(w, r) =? err { _ = w.CloseWithError(err); return err }
return w.Close()

рдЬреЛ рдЕрднреА рднреА рдкрд╛рдардХ рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ рдпрд╣ рдПрдХ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдШрдмрд░рд╛рд╣рдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣рд╛рдВ рдмрдВрдж рдХрд░рдирд╛ рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реИред

рд╡рд╣ рдХреЛрдб рдЕрдкрд╡рд╛рдж рд╣реИ, рдирд┐рдпрдо рдирд╣реАрдВред рд╣рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@jba : рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рдЕрд╕рд╣рдордд рд╣реВрдВред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдХрдо рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдорд┐рд▓реЗрдЧрд╛ред рдореИрдВ рдХреБрдЫ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреИрд╕реЗ errd , рд░реВрдврд╝рд┐рд╡рд╛рджреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдирд┐рдпрдореЛрдВ рдХреЛ рд╢рд┐рдерд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рди рдХрд┐ рдХреБрдЫ рднреА рдЬреЛ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рднреА рдЪрд▓рддрд╛ рд╣реИред

@jimmyfrasche : рдЖрдкрдХреЗ рд╕рд░рд▓реАрдХрд░рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдЖрдк рд▓рдЧрднрдЧ рд╕рд╣реА рд╣реИрдВред

  • IsSentinel рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдЖрд╕рд╛рди рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛, рдЕрднреА рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдоред
  • рд░рд╛рдЬреНрдп рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЧрд▓рддреА рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХрд╛ рдПрдкреАрдЖрдИ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
  • рд╣реИрдВрдбрд▓рд░ рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВред рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рд▓реЛрдЧреЛрдВ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдореВрд╣ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред (рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЧрд▓рддреА рдкрд░ рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рджреЗрдЦреЗрдВ)
  • рдкреНрд░рд╕рдВрдЧ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИред AppEngine рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рддрдм рддрдХ рд╣рдЯрд╛ рджреВрдВрдЧрд╛ рдЬрдм рддрдХ рд▓реЛрдЧ рдЭреБрдХ рдирд╣реАрдВ рдЬрд╛рддреЗред

@mpvl рдореИрдВ рдмрд╕ рдЗрд╕реЗ рдХреБрдЫ рдЪреАрдЬреЛрдВ рддрдХ

@jimmyfrasche : рд╕рдордЭрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЕрдЧрд░ рдХрд┐рд╕реА рдПрдкреАрдЖрдИ рдХреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред :)

@bcmills : рд╣реИрдВрдбрд▓рд░ рдХреБрдЫ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреА рдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╣рддреНрд╡ рдХреЗ рдХреНрд░рдо рдореЗрдВ:

  • рдПрдХ рддреНрд░реБрдЯрд┐ рд▓рдкреЗрдЯреЗрдВ
  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ (рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)
  • рд▓реЙрдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдВ
  • рддреНрд░реБрдЯрд┐ рдореЗрдЯреНрд░рд┐рдХреНрд╕

рдлрд┐рд░ рд╕реЗ рдорд╣рддреНрд╡ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдЗрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рдЦрдВрдб рдореИрдерд╛
  • рд░реЗрдЦрд╛
  • рдкреИрдХреЗрдЬ

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ рдХрд┐ рдХрд╣реАрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдП,
рд▓реЗрдХрд┐рди рдореИрдВ рдмреНрд▓реЙрдХ-рд▓реЗрд╡рд▓ рдХреЗ рд╕рд╛рде рд╣реА рдЬреА рд╕рдХрддрд╛ рдерд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреАрдЖрдИ рдерд╛ред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдзреАрдореЗ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдмрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдирд╛рдбрд╝реА рдПрдкреАрдЖрдИ рд╣реБрдЖ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреЙрд▓рдмреИрдХ рд╕рдорд╕реНрдпрд╛ рдЗрддрдиреА рдЦрд░рд╛рдм рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд░рдирд░ рдХреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдкрд╛рд╕ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗрд╡рд▓ рдХреБрдЫ рд▓рдкреЗрдЯрд╛ рд╣реБрдЖ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░рд╢рдГ рдкрд╛рд░рд┐рдд рдЗрдирд▓рд╛рдЗрди рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рдЦреЗрд▓ рд▓реВрдВрдЧрд╛ред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЕрдЧрд░ рд╣рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╢рд╛рдпрдж рд╕рдВрджрд░реНрдн рд╕рдорд░реНрдерди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@рдЬреЗрдмреАрдП :

рд╕рд╛рде рд╣реА, рдореИрдВ рд╕рд╡рд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд░рд┐рдХрд╡рд░реА рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ w.Write рдпрд╛ r.Read (рдпрд╛ io.Copy!) рдШрдмрд░рд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдпрджрд┐ рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рд╣реИ, рддреЛ рд░рд╛рдЗрдЯрдЯреЙрдЧреНрд╕ рдЕрднреА рднреА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ (!!!) рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ CloseWithError рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗред рдпрджрд┐ рдЖрддрдВрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдердЧрд┐рдд рдХреЛ рдЕрднреА рднреА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрд▓рддреА == рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рджреВрд╖рд┐рдд рдлрд╝рд╛рдЗрд▓ рднреМрддрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ CloseWithError рдХреЛ рдХреБрдЫ рдЕрд╕реНрдерд╛рдпреА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдШрдмрд░рд╛рд╣рдЯ рдЬрд╛рд░реА рд░рдЦреЗрдВред

рдореБрдЭреЗ рдЧреЛ рдХреЛрдб рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓рд╛ред Io.Pipes рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдХреНрд╕рд░ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рд╕реВрдХреНрд╖реНрдо рдХреЛрдб рд╣реЛрддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЕрдХреНрд╕рд░ рдЙрддрдирд╛ рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рд╣реИред

@рдмреАрд╕реАрдорд┐рд▓реНрд╕

рдореБрдЭреЗ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ @mpvl рдХрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдЖрддрдВрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ,

рдкреИрдирд┐рдХ рдХреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ CloseWithError рдХреЗ рдареАрдХ рдмрд╛рдж рдШрдмрд░рд╛рд╣рдЯ рдлрд┐рд░ рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдПрдХ рджрд╣рд╢рдд рдПрдХ рджрд╣рд╢рдд рдмрдиреА рд░рд╣рддреА рд╣реИред
рдпрд╣рд╛рдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рдХрд╛рд░рдг рд╕реНрдердЧрд┐рдд рдХреЛ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдм рддрдХ рдЬреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рд╣рдж рддрдХ рдорд╛рдиреНрдп рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдордирдорд╛рдиреА рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рднреА (рд░реАрдбрд░ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ :))ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реБрдЦ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрднреА-рдХрднреА рд╣реЛрддрд╛ рд╣реИ (рдХреЛрдб рдореЗрдВ рдмрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдХрд╛рд░рдг рдШрдмрд░рд╛рд╣рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред

BTW, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ errd рдкреИрдХреЗрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдИ рднреА рдЕрдиреНрдп рддрдВрддреНрд░ рдЬреЛ рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рдЯрд╛рд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдареАрдХ рд╣реИред рдбрд┐рдлрд░реЗрдВрд╕ рдХреЛ рдкреИрдирд┐рдХ рдкрд░ рдХреЙрд▓ рди рдХрд░рдирд╛ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред

рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рдордп, рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐" рдФрд░ "рдорд╛рди рдпрд╛ рддреНрд░реБрдЯрд┐" рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ:

@bcmills рдУрд╣, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдБред рдмрд╛рдЗрдХрд╢реЗрдб рдХрд╛ рдПрдХ рдФрд░ рдХреИрди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ

func Atoi(string) ?int

рдХреЗ рдмрдЬрд╛рдП

func Atoi(string) (int, error)

рд▓реЗрдХрд┐рди WriteString рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛:

func WriteString(Writer, String) (int, error)

рдореБрдЭреЗ рд╕рдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ @bcmills / @jba рджреНрд╡рд╛рд░рд╛ =? / =! / :=? / :=! рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИред рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЧреБрдг рд╣реИрдВ:

  • рдХрдВрдкреЛрдЬрд╝реЗрдмрд▓ (рдЖрдк =? рдЙрдкрдпреЛрдЧ =? рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)
  • рд╕рд╛рдорд╛рдиреНрдп (рдХреЗрд╡рд▓ рд╢реВрдиреНрдп рдорд╛рди рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ)
  • рдмреЗрд╣рддрд░ рдЧреБрдВрдЬрд╛рдЗрд╢
  • defer рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЙрдкрд░реЛрдХреНрдд рдПрдХ рднрд┐рдиреНрдирддрд╛ рдореЗрдВ)

рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЧреБрдг рднреА рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдЙрддрдиреЗ рдЕрдЪреНрдЫреЗ рдирд╣реАрдВ рд▓рдЧрддреЗред

рд░рдЪрдирд╛ рдШреЛрдВрд╕рд▓реЗред рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдЖрдЧреЗ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдЗрдВрдбреЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ред рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдмреБрд░реА рдЪреАрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╡рд░реНрддрдорд╛рди рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдПрдХ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ =? рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдФрд░ if err != nil рднреАрддрд░реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рддреНрд░реБрдЯрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдпрд╛ рд╕рд┐рд░реНрдл рдЖрдо рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдкрдЯрдиреЗ рд╣реИ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдореНрдореЛрд╣рдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рдпрд╣ рдЕрдкрдиреА рд╡реНрдпрд╛рдкрдХрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдорд┐рдереНрдпрд╛рддреНрд╡ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред рдорд┐рдереНрдпрд╛рддреНрд╡ рдХреЛ "рд╢реВрдиреНрдп рдорд╛рди рд╣реИ (рдирд╣реАрдВ)" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди if err != nil { if err { рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВред рдореИрдВ рдЬрдВрдЧрд▓реА рдореЗрдВ рдЧрд░реНрднрдкрд╛рдд рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ рдЬреЛ =? /etc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЕрдкрдиреЗ рдорд┐рдереНрдпрд╛рддреНрд╡ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкрд░ред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдореБрд╣рд╛рд╡рд░рд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕ рдкрд░ рддрдВрдЬ рдХрд╕реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрдЧрд╛ред рдЬрдмрдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рджреБрд░реБрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╡рд┐рд░реБрджреНрдз рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдд рд╣реИред

рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕реНрдХреЛрдкрд┐рдВрдЧ (рдЙрдирдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд▓рд┐рдП) рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЛ рдареАрдХ рдХрд░реЗрдВред

"рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо" рд╢рдмреНрджрд╛рд░реНрде рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рддрд░реНрдХ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдПрдХ рднрд╛рд╡рдирд╛ рд╣реИред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рдХреНрддрд┐ рдирд╣реАрдВред рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореИрдХреНрд░реЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрдЧрд╛: рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЦрдВрдб рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рдРрд╕рд╛ рдХреЛрдИ рднреА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдмреЗрд╣рдж рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЯрд╛рдЗрдк-рдЕрд╡реЗрдпрд░ рдФрд░ рд╣рд╛рдЗрдЬреАрдирд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ "рдмрд╕ рдПрдХ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдмрдирд╛рдУ" рдХрд╣рдХрд░ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪреАрдиреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рдЬреЛ рдЖрдк рдЕрднреА рдЧреЛ рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ; рдпрд╣ рдЖрдкрдХреЛ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЪреАрдиреА рдХреЗ рдХрдЯреНрдЯрд░ рд╡рд┐рд░реЛрдзреА рдирд╣реАрдВ рд╣реВрдВред рдзреНрдпрд╛рди рд╕реЗ рдЪреБрдиреЗ рдЧрдП рднрд╛рд╖рд╛рдИ рдЕрдореВрд░реНрддрддрд╛ рдореЗрдВ рд╢рдХреНрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЪреАрдиреА рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕реЗ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдирд┐рд░реНрджреЛрд╖ рд╕рд╛рдмрд┐рдд рди рд╣реЛ, рдРрд╕рд╛ рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред

рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдПрд▓рдПрдЪрдПрд╕ рдПрдХ рдмрдпрд╛рди рд╣реИрдВ рд▓реЗрдХрд┐рди рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реАрдорд┐рдд рд╕рдмрд╕реЗрдЯ рд╣реИред рдЙрд╕ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рддрддреНрд╡ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдпрджрд┐ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкреБрди: рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреБрдЫ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ

func F() (S, T, error)

func MustF() (S, T) {
  return F() =? err { panic(err) }
}

рдЕрдиреБрдорддрд┐ рдкрд╛рдирд╛?

рдЕрдЧрд░

defer f.Close() :=? err {
    return err
}

рдЕрдиреБрдорддрд┐ рд╣реИ рдХрд┐ (рдХрд┐рд╕реА рддрд░рд╣) рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

func theOuterFunc() (err error) {
  //...
  defer func() {
    if err2 := f.Close(); err2 != nil {
      err = err2
    }
  }()
  //...
}

рдЬреЛ рдмрд╣реБрдд рд╣реА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП рдмрд╣реБрдд рд╣реА рдЕрди-рдЧреЛ-рдЬреИрд╕реЗ рддрд░реАрдХреЗ рд╕реЗ рдпрд╣ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред рд╡рд┐рдХрд▓реНрдк рд╣реИ return рдирд┐рд╣рд┐рдд рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рд╡рд╛рдкрд╕реА рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ error рдПрдХ рд╕реЗ func() рдЬреЛ рдПрдХ рд╕рд╛ рд╣реИ рдХреБрдВрджред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐, рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдлрд┐рдХреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ if err != nil { return err } рдПрдХ рдЙрдкрджреНрд░рд╡ рд╣реИ, рдореИрдВрдиреЗ #21182 рдореЗрдВ рд╡реНрдпрдХреНрдд рдХреА рдЧрдИ рдорд╛рдореВрд▓реА рдкрдардиреАрдпрддрд╛ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред рджреЛ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ

  1. рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИтАФрдФрд░ рдХреЛрдИ рднрд╛рд╖рд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА
  2. рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛тАФ errors рдкреИрдХреЗрдЬ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдореНрдореЗрд▓рди рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЖрдЧреЗ рддрдХ рдЬрд╛рдПрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдпрд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдХрдИ рдЕрдиреНрдп рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЕрдзрд┐рдХ рддрддреНрдХрд╛рд▓ рд╕рдВрдмрдВрдзрд┐рдд рдкрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡реЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рди рдФрд░ рдкрд░реЗрд╢рд╛рдиреА рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред

рдЬрдм рдореИрдВрдиреЗ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рдХреА рд╣реИ рддреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рд╣рдореЗрд╢рд╛ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА (рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рдпрд╣ рдкрд░рд┐рджреГрд╢реНрдп рдирд╣реАрдВ)ред рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдкрд░рдВрдкрд░рд╛рдПрдВ рд╕реНрд░реЛрдд рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпреЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рдпрд╣ рднреА рд░реБрдЪрд┐ рдХрд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрд╛ рд╣реИ (рдмрд╣реБрдд рдХреБрдЫ! рдХреНрд╖рдорд╛ рдХрд░реЗрдВ!) рд▓реЗрдХрд┐рди рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдпреЛрдЧреНрдпрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╛рд░ рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЕрдкрдирд╛ рд╡рдЬрди рдЦреАрдВрдЪрддрд╛ рд╣реИред

@jimmyfrasche

рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдЬрдм := рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЧреЛ рдирдЯ рдкрд░ рдЙрд╕ рдзрд╛рдЧреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд▓рд╛рд╣рд▓ рдерд╛ рдХрд┐ рдХреМрди рд╕реЗ рдирд╛рдо рдирд┐рд╣рд┐рдд рдХреЗ рдмрдЬрд╛рдп рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП "рдХреЗрд╡рд▓ рддрднреА рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рд╡рд╣ рдЪрд░ рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░реЗ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛ "рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕рднреА рд╕реВрдХреНрд╖реНрдо рдХрдард┐рди-рд╕реЗ-рджреЗрдЦреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИрдВред

рдореБрдЭреЗ рд╡рд╣ рдзрд╛рдЧрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд▓рд┐рдВрдХ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧрд╛ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реЛрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЧреЛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдереЗ рдЬрдм рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред 2009/11/9 рдХреА рдХрд▓реНрдкрдирд╛, рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ, рдореЗрдВ рд╣реИ:

рдирд┐рдпрдорд┐рдд рдЪрд░ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рд▓рдШреБ рдЪрд░ рдШреЛрд╖рдгрд╛ рдЪрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ рдмрд╢рд░реНрддреЗ рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╣реА рдмреНрд▓реЙрдХ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реЛрдВ, рдФрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреИрд░-рд░рд┐рдХреНрдд рдЪрд░ рдирдпрд╛ рд╣реЛред

рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд▓реНрдкрдирд╛ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдФрд░ рдпрд╣ рд╕реЛрдЪрдХрд░ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рд╛рди рдирд┐рдпрдо рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ := рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЙрд╕ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд┐рдпрдо рдХреЗ рдмрд┐рдирд╛, рдФрд░ рдЙрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдирдП рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдердХрд╛рдК рдерд╛ред

@mpvl
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХреА рдЪрд╛рд▓рдмрд╛рдЬреА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдзрд┐рдХ рд╣реИ
рдЧреЛ рдХреА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдЬрд┐рд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐
рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдиреЗ рдкрд░ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП
рд╕рд╛рдорд╛рдиреНрдп "defer w.Close ()" рдореБрд╣рд╛рд╡рд░рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдмрдВрдж рдХрд░реЗрдВ рдЬрдм рдХреЛрдИ рд╣реЛ
рдШрдмрд░рд╛рд╣рдЯ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
    client, err := storage.NewClient(ctx)
    if err != nil {
        return err
    }
    defer client.Close()

    w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
    defer w.Close()
    _, err = io.Copy(w, r)
    if err != nil {
        w.CloseWithError(err)
    }
    return err
}

рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдЗрд╕ рддрд░рд╣ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ Close . рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛
CloseWithError рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдиреЛ-рдСрдк рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдм рдпрд╣ рдЗрддрдирд╛ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рднреА рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдЦреА рдирд╣реАрдВ рдЬрд╛рддреА рд╣реИ, рдЬрдм рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИ, рдЗрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдЬреЛрдбрд╝рдХрд░ рдЬрд┐рд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

    w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
    defer w.Close()
    _, err = io.Copy(w, r)
    return w.Finalize(err)

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреИрдирд┐рдХ рдПрд░рд░ рдореИрд╕реЗрдЬ рдХреЛ рдЕрдЯреИрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреНрдп рд▓реЙрдЧрд┐рдВрдЧ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИред
(рдмрдВрдж рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЙрд▓ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╣реИ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ ...)

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреИрдирд┐рдХ-рд░рд┐рдХрд╡рд░реА рдкрд╣рд▓реВ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рд░реЗрдб рд╣реЗрд░рд┐рдВрдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ 99+% рдорд╛рдорд▓реЗ рдкреИрдирд┐рдХ рд░рд┐рдХрд╡рд░реА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

@рд░реЛрдЧрдкреЗрдкреНрдкреЗ :

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреИрдирд┐рдХ рдПрд░рд░ рдореИрд╕реЗрдЬ рдХреЛ рдЕрдЯреИрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреНрдп рд▓реЙрдЧрд┐рдВрдЧ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рдореБрджреНрджрд╛ рд╣реИред

рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рдХрдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдареАрдХ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХреЛрдб рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

r, w := io.Pipe()
go func() {
    var err error                // used to intercept downstream errors
    defer func() {
        w.CloseWithError(err)
    }()

    r, err := newReader()
    if err != nil {
        return
    }
    defer func() {
        if errC := r.Close(); errC != nil && err == nil {
            err = errC
        }
    }
    _, err = io.Copy(w, r)
}()
return r

рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ, рдпрд╣ рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЧрдиреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ): рдпрд╣ рдЪреБрдкрдХреЗ рд╕реЗ рдПрдХ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рднреА рд╣реИ рдХреНрд▓рдВрдХреА рдЕрдЧрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рд╣реА рддреНрд░реБрдЯрд┐ рдкрд╛рд░рд┐рдд рдХреА рдЧрдИ рд╣реИред рджреЛрдиреЛрдВ "рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ" рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдкрд░ рд╣рд╛рд╡реА рд╣реИред рдФрд░ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рддрдХ рджрд╣рд╢рдд рдХреЛ рднреА рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП, errd рдпрд╣ _would_ рдкреИрдирд┐рдХ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:

r, w := io.Pipe()
go errd.Run(func(e *errd.E) {
    e.Defer(w.CloseWithError)

    r, err := newReader()
    e.Must(err)
    e.Defer(r.Close)

    _, err = io.Copy(w, r)
    e.Must(err)
})
return r

рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдкрд╛рдардХ ( errd рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдардХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ io.Reader newReader рдкреИрдирд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрднреА рднреА рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рджреЛрд╖рдкреВрд░реНрдг рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ (рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдорд╛рдкрди рдореЗрдВ рджреМрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдШрдмрд░рд╛рд╣рдЯ рдореЗрдВ рдкрд╛рдЗрдк рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЬреАрдПрд╕ рдлрд╝рд╛рдЗрд▓ред)

рдпрд╣ рдмрд╛рдд рднреА рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреЛрдб errd рд╕рд╛рде рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛, рддреЛ рдореБрдЭреЗ рдмрдЧреНрдЧреА рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓рд╛ред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╕реАрдЦрд╛ рдХрд┐ рдЙрдЪрд┐рдд рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд▓рд┐рдЦрдирд╛ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рд╕реВрдХреНрд╖реНрдо рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, errd рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордпред :)

рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдШрдмрд░рд╛рд╣рдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рджреЗрд░реА рдХреЛ рди рд╕рдВрднрд╛рд▓реЗрдВред рдЗрд╕рдХреЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рд╢рд╛рдпрдж рдЗрд╕реЗ рдкреВрд░реНрд╡рд╡рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЧреБрдг рд╣реЛрдВрдЧреЗред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреБрдЫ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рдЬреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред

@mpvl
рдореИрдВ рдЕрдХреНрд╕рд░ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдкрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рд╕реЗ рдЪреАрдЬреЗрдВ рд╕рд╛рдл рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореИрдВ рдЖрдкрдХрд╛ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛:

func something() {
    r, w := io.Pipe()
    go func() {
        err := copyFromNewReader(w)
        w.CloseWithError(err)
    }()
    ...
}

func copyFromNewReader(w io.Writer) error {
    r, err := newReader()
    if err != nil {
        return err
    }
    defer r.Close()
    _, err = io.Copy(w, r)
    return err
}()

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ r.Close рдПрдХ рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рдпрджрд┐ рдЖрдкрдиреЗ рдПрдХ рдкрд╛рдардХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ io.EOF рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред

рдореИрдВ рдЧрд▓рдд рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реВрдВ - рдпрд╣ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЧреЛрд░реЛрдЗрдиреНрд╕ рдХреЗ рдкреНрд░рддрд┐ рдмрд╣реБрдд рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: https://play.golang.org/p/iT441gO5us рдХреНрдпрд╛ рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЛрд░реВрдЯреАрди рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
function in рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди errd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдкреИрдирд┐рдХ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдореВрд░реНрдд рд╕реАрдорд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЧреЛ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред

@mpvl

рд╕реНрдердЧрд┐рдд w.CloseWithError (рдЧрд▓рддреА)

рдмреАрдЯреАрдбрдмреНрд▓реВ, рдпрд╣ рд▓рд╛рдЗрди рд╣рдореЗрд╢рд╛ CloseWithError рдХреЛ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рдерд╛
рд▓рд┐рдЦреЛ:

defer func() { 
   w.CloseWithError(err)
}()

@mpvl

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Close рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ io.Reader рдкрд░ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рд▓рдЧрднрдЧ рдХрднреА рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ (рд╕реВрдЪреА рджреЗрдЦреЗрдВ https://github.com/golang/go/issues/20803#issuecomment-312318808 )

рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЖрдЬ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

r, w := io.Pipe()
go func() (err error) {
    defer func() { w.CloseWithError(err) }()

    r, err := newReader()
    if err != nil {
        return err
    }
    defer r.Close()

    _, err = io.Copy(w, r)
    return err
}()
return r

... рдЬреЛ рдереЛрдбрд╝рд╛ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдШрдмрд░рд╛рд╣рдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ w.CloseWithError рдПрдХ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡реИрд╕реЗ рднреА рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрднреА рднреА рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмрдВрдж рди рдХрд░реЗрдВ, рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд╛рдо рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддрд┐ рд╣реИ:

-go func() (err error) {
-   defer func() { w.CloseWithError(err) }()
+go func() (rerr error) {
+   rerr = errors.New("goroutine exited by panic")
+   defer func() { w.CloseWithError(rerr) }()

@rogpeppe : рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдзрдиреНрдпрд╡рд╛рджред :)

рд╣рд╛рдВ, рдореБрдЭреЗ рдЧреЛрд░реЛрдЗрди рдореБрджреНрджреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЬрд╛рдВрдЪ рд╕реЗ рдкрдХрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╡реИрд╕реЗ рднреА, рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдПрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рдеред

рдЖрдк рдкреИрдирд┐рдХ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдореВрд░реНрдд рд╕реАрдорд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЧреЛ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред

рдореИрдВ рдпрд╣реА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдкреАрдЖрдИ рд╕рдлрд▓рддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдЬрдм рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдерд╛ред рдЖрдкрдХрд╛ рдЕрдВрддрд┐рдо рдХреЛрдб рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЗрдЦрдХ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реВрдХреНрд╖реНрдо рд╣реИред рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЬрд╛рдВрдЪ рдХрд╛ рдПрдХ рд╕реЗрдЯ defers рдХреЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХреЗред рдлрд┐рд░ рднреА, рдореВрд▓ "рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░" рдХреЛрдб рдФрд░ рдЖрдкрдХреЗ рдЕрдВрддрд┐рдо рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рджреЛрдиреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реА рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдХреЛрдб рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЯреБрдХрдбрд╝рд╛ рд╣реИред рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЛрдб рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдорд╕реНрддрд┐рд╖реНрдХ рдЪрдХреНрд░реЛрдВ рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрддреНрдкрд╛рджрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреЛ рдореИрдВ errd рд╕реЗ рд╕реАрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдЬреЛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрд╕рд╕реЗ рдХрдИ рдЬрдЯрд┐рд▓рддрд╛рдПрдВ рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕рдВрд╣рд┐рддрд╛рдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@jimmyfrasche

рдпрд╣ рдЕрдкрдиреА рд╡реНрдпрд╛рдкрдХрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдорд┐рдереНрдпрд╛рддреНрд╡ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдорд┐рдереНрдпрд╛рддреНрд╡ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рдмреВрд▓рд┐рдпрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рдиреЗ рдпрд╛ рдХрд┐рд╕реА рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓рдиреЗ рд╕реЗ рдЖрддреА рд╣реИрдВред

рд╣рдо рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рд╢рд╛рдпрдж рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк =! , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХрддрд░ рдмреЗрдХрд╛рд░ рд╣реЛрдЧрд╛)ред

рд╣рдо рдкреВрд░реНрд╡ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдХреЗрд╡рд▓ рдкреЙрдЗрдВрдЯрд░ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдХреЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдЪрд░ рдПрдХ рдмреВрд▓рд┐рдпрди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдмреВрд▓рд┐рдпрди рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рддред

рдХреНрдпрд╛ [ MustF ] рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА?

рд╣рд╛рдВред

рдЕрдЧрд░ [ defer f.Close() :=? err { ] рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдЬреЛ (рдХрд┐рд╕реА рддрд░рд╣) рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
[ defer func() { тАж }() ]ред

рдЬрд░реВрд░реА рдирд╣реАрдВ, рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╢рдмреНрджрд╛рд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЕрдЬреНрдЮрд╛рдд рдлрд╝рдВрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ call/cc рдЕрдзрд┐рдХ)ред рдореИрдВрдиреЗ =? рдореЗрдВ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ (рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА), рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд┐рддрдиреА рдЬрдЯрд┐рд▓ рд╣реЛрдЧреА .

рджреЛ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ [тАж]

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд▓рдЧрддрд╛ рд╣реИ (рдЬреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ)ред

( @rogpeppe , @davecheney , @dsnet , @crawshaw , I, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп

@bcmills : рдЗрд╕ рдХреЛрдб рдореЗрдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ 1) рдЬреИрд╕рд╛ рдХрд┐ @rogpeppe рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ: CloseWithError рдХреЛ рдкрд╛рд╕ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрддреА рд╣реИ, рдФрд░ 2) рдпрд╣ рдЕрднреА рднреА рдкреИрдирд┐рдХ рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдлрд▓рддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ рдЬрдм рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдЧреА ( рд▓реМрдЯрд╛ рд╣реБрдЖ r рдПрдХ io.EOF рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдирд╣реАрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реЛрдВ), рднрд▓реЗ рд╣реА 1 рддрдп рд╣реЛред

рдЕрдиреНрдпрдерд╛ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдмрдВрдж рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдХреНрд╕рд░ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ (рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред

рдореБрдЭреЗ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╕реАрдзреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ (рд╕реНрд╡рдпрдВ рд╕реЗ рдПрдХ рд╕рд╣рд┐рдд) рдкрд░ 4 рдпрд╛ 5 рджреЛрд╖рдкреВрд░реНрдг рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рдереЗ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рддрд░реНрдХ рджреЗрдирд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдорд╛рдореВрд▓реА рдирд╣реАрдВ рд╣реИред :)

@рдмреАрд╕реАрдорд┐рд▓реНрд╕ :

рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдпрд╣ рдШрдмрд░рд╛рд╣рдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ w.CloseWithError рдХреЛ рдПрдХ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡реИрд╕реЗ рднреА рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣? рдЙрд╕ рдЧреЛрд░реМрдЯрд╛рдЗрди рдХреЗ рдбрд┐рдлрд░реНрд╕ рдХреЛ рдЕрднреА рднреА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╡реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рджреМрдбрд╝реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрдВрдж рдПрдХ io.EOF рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, https://play.golang.org/p/5CFbsAe8zF рджреЗрдЦреЗрдВред рдЧреЛрд░реЛрдЗрди рдХреЗ рдЖрддрдВрдХ рдХреЗ рдмрд╛рдж рднреА рдпрд╣ рдЦреБрд╢реА рд╕реЗ "рдлреВ" рдХреЛ рджреВрд╕рд░реЗ рдЧреЛрд░реЛрдЗрди рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИ рдЬреЛ рддрдм рднреА рдЗрд╕реЗ рд╕реНрдЯрдбрдЖрдЙрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред

рдЗрд╕реА рддрд░рд╣, рдЕрдиреНрдп рдХреЛрдб рдХреЛ рдПрдХ рдкреИрдирд┐рдХрд┐рдВрдЧ рдЧреЛрд░реМрдЯрд╛рдЗрди (рдЬреИрд╕реЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ) рд╕реЗ рдПрдХ рдЧрд▓рдд io.EOF рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдлрд▓рддрд╛ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдШрдмрд░рд╛рд╣рдЯ рд╡рд╛рд▓реЗ рдЧреЛрд░реМрдЯрд╛рдЗрди рдХреЗ рдЖрддрдВрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЦреБрд╢реА рд╕реЗ рдЬреАрдПрд╕ рдХреЛ рдПрдХ рдлрд╛рдЗрд▓ рд╕рдмрдорд┐рдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдЕрдЧрд▓реЗ рддрд░реНрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рдХреЛрдб рди рд▓рд┐рдЦреЗрдВ, рд▓реЗрдХрд┐рди:

  • рдлрд┐рд░ рдЗрди рдмрдЧреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдПрдВ, рдФрд░
  • рдУрдУрдПрдо рдЬреИрд╕реЗ рдмрд╛рд╣рд░реА рдХрд╛рд░рдХреЛрдВ рдХреЗ рдХрд╛рд░рдг рдШрдмрд░рд╛рд╣рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдпрджрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрднреА рднреА рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмрдВрдж рди рдХрд░реЗрдВ, рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд╛рдо рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддрд┐ рд╣реИ:

рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ io.EOF рдХреЛ рд╕рд┐рдЧреНрдирд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдмрдВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдпрд╣ рдХрд╛рдо рди рдХрд░реЗред

рдпрджрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрднреА рднреА рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмрдВрдж рди рдХрд░реЗрдВ, рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд╛рдо рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддрд┐ рд╣реИ:

рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ io.EOF рдХреЛ рд╕рд┐рдЧреНрдирд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдмрдВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдпрд╣ рдХрд╛рдо рди рдХрд░реЗред

рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдЕрдВрдд рдореЗрдВ return err rerr рд╕реЗ nil ред

@bcmills : рдЖрд╣ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдм рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рд╣рд╛рдБ, рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рдмрд▓реНрдХрд┐ рдХреЛрдб рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╣реА рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡реЗрд░рд┐рдПрдмрд▓ рд╢реИрдбреЛрдЗрдВрдЧ, рдЗрд╕рдореЗрдВ рдЪрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реИ (рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдмрджрддрд░ рдмрдирд╛ рд░рд╣реА рд╣реИред) рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реЗрд░рд┐рдПрдмрд▓ рд╢реИрдбреЛрдЗрдВрдЧ рдмрдЧреНрд╕ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдЪреНрдЫреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдордирдорд╛рдирд╛ рдЖрддрдВрдХ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред

рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреА рдмрд╣реБрдд рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдмрдЧ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦреЗрдВрдЧреЗред рдореИрдВ рдкрд╛рдЧрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдХрдо рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рдФрд░ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВред рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЗрдирджреЗрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ (рдЬреИрд╕реЗ рдЬреАрдПрд╕ рдлрд╛рдЗрд▓реЗрдВ рд▓рд┐рдЦрдирд╛ред)

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдореБрдЭреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдкрд╣реГрдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рд▓реЛрдЧ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ:

return err if f, err := os.Open("..."); err != nil

@SirCmpwn рдЬреЛ

рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдореБрдЭреЗ рдЕрд╕рд╣рдЬ рднреА рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдПрдХ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ (||) рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдореНрдореАрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ || рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдПред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдХреБрдЫ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

@SirCmpwn рд╣рд╛рдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдХрд╣рд╛ рдерд╛ "рдореИрдВ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдВрджрд░реНрдн рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЕрд╕рдВрд╢реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред ред" рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрддрдирд╛ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд┐рддрдирд╛ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рдордЭрд╛ред

рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдЯреНрдЯрд░рдкрдВрдереА рд╣реИ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ-рдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░реЗред

f = try!(os.Open("..."))

try! рдЯреБрдкрд▓ рдореЗрдВ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдЦрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдпрджрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдиреНрдпрдерд╛ рд╢реЗрд╖ рдЯреНрдпреВрдкрд▓ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рдорд╕реНрдпрд╛ рдХрдерди рд╣реИ,

рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдФрд░ рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╣реИред рдЧреЛ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдкреНрд░рд╛рд░реВрдк рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рджреЗрдЦрдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдЪрд╛рд▓рддрд╛ рдЕрдкреНрд░рднрд╛рд╡реА рд╣реИред рдЖрдЬ рддрдХ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рдХрд╛рд░реАрдЧрд░реЛрдВ рдХреЗ рдПрдХрдореБрд╢реНрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдЗрд▓рд╛рдХреЗ рдХреЛ рдХрдо рдХрд░рдирд╛ рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдирд╛ред рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдХрд╛ рдПрдХ рд▓рдХреНрд╖реНрдп рд▓реЗрдЦрдХ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдирд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдХреЛрдИ рднреА рд╕реБрдзрд╛рд░ рднреА рдЙрд╕ рд▓рдХреНрд╖реНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрдерди рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ Go 2.x рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ:

  1. рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдкрде рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЗрд░рд╛рджреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
  2. рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
  3. рд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рд╕рд░рд▓рддрд╛ рдХреЗ рдЧреЛ рдбрд┐рдЬрд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред
  4. рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рд╡реНрдпрд╛рдкрдХ рд╕рдВрднрд╡ рд╕реАрдорд╛ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди:

f.Close() =? err { return fmt.Errorf(тАж, err) }

рдЙрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд▓рдХреНрд╖реНрдп # 1 рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ # 2 рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдореЗрд░реЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдиреЗ рдЗрд╕ рдХрдордЬреЛрд░реА рдХреЛ # 2 рдкрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛)ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #3 рдФрд░ #4 рдкрд░ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐:
1) рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рдХрд╣рд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдорд╛рди рдЬрд╛рдБрдЪ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ; рддрдерд╛
2) =? рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд╕рдорд╛рди рд▓реЗрдХрд┐рди рднрд┐рдиреНрди =! рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдирдХреЗ рдЕрд░реНрдереЛрдВ рдХреЗ рдЕрднреНрдпрд╕реНрдд рд╣реЛрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛; рддрдерд╛
3) рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдз рдорд╛рди рд▓реМрдЯрд╛рдирд╛ рдЗрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдирдП рд╕рдорд╛рдзрд╛рди рдХреЛ рднреА рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ gofmt рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд▓рдХреНрд╖реНрдп # 4 рдФрд░ рдкрд░рд┐рдЪрд┐рддрддрд╛ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдореЗрдВ рдмрд▓рд┐рджрд╛рди рдХреА рдХреАрдордд рдкрд░ рд▓рдХреНрд╖реНрдп # 3 рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдкрдиреЗ рдореБрдЭрд╕реЗ рд╕рд╛рд░ рдореЗрдВ рдкреВрдЫрд╛ рд╣реЛрддрд╛, рддреЛ рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реЛрддрд╛ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рд╕реБрдзрд╛рд░ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рд╕рд░рд▓рддрд╛ рд╣реЛрдЧреАред рдЬрдмрдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдорд╛рди рд╣реИрдВ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдирд╛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдард┐рди рд╕рдорд╕реНрдпрд╛ (рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖ рд░рд╣реЗ рд╣реИрдВ) рдХреЛ рдФрд░ рднреА рдХрдард┐рди рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрдВрдЧреЗ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдиреНрдп рд▓рдХреНрд╖реНрдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдФрд░ рдХрдВрдкреЛрдЬрд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рддреЗ рд╣реИрдВред

рднрд▓реЗ рд╣реА, рдЬреИрд╕рд╛ рдХрд┐ @rsc рдиреЗ рдЕрдкрдиреЗ рд▓реЗрдЦ Toward Go 2 рдореЗрдВ рдмрддрд╛рдпрд╛ рд╣реИ , рди рддреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг, рди рд╣реА рд▓рдХреНрд╖реНрдп рдФрд░ рди рд╣реА рдХреЛрдИ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдмрд┐рдирд╛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдкрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрджрд╛рдИ рд╢реБрд░реВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП?

рднрд▓реЗ рд╣реА, рдЬреИрд╕рд╛ рдХрд┐ @rsc рдиреЗ рдЕрдкрдиреЗ рд▓реЗрдЦ,

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд╡рдпрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХреЛрдИ рднреА рдЧреЛ рдХреЛрдбрдмреЗрд╕ рдЦреЛрд▓реЗрдВ рдФрд░ рдЙрди рдЬрдЧрд╣реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдбреАрдЖрд░рд╡рд╛рдИ рдЪреАрдЬреЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдФрд░/рдпрд╛ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рднрд╛рд╖рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ - рдЕрднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрд╛рд╣рд░реА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреВрд╡рд░реНрдб рдЧреЛ 2 рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧрд▓рддреА рд╕реЗ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рд╡рдХрд╛рд▓рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐ рд▓реЛрдЧ рдХреЗрд╡рд▓ рдореБрд╕реНрдХреБрд░рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╣рди рдХрд░рддреЗ рд╣реИрдВред

if $val, err := $operation($args); err != nil {
  return err
}

рдЬрдм рдХреЛрдб рд╕реЗ рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдорд╕реНрдпрд╛ рд╕реНрд╡рдпрдВ рд╕реНрдкрд╖реНрдЯ рдЗрдореНрд╣реЛ рд╣реЛрддреА рд╣реИред

@ рдмрд┐рд▓реАрд╣

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░реВрдк: f.Close() =? err { return fmt.Errorf(тАж, err) } рдЕрддреНрдпрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдФрд░ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рднрд╛рдЧ рдХрд┐рд╕реА рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдЗрд╕реЗ 1 рдХреЗ рдмрдЬрд╛рдп 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдлреИрд▓рд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрдВрдж рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреЛрдИ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди if err != nil { ... } рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

=? рдСрдкрд░реЗрдЯрд░ рднреА рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╛рде:
file := os.Open("/some/file") or raise(err) errors.Wrap(err, "extra context")
рдпрд╛ рдЖрд╢реБрд▓рд┐рдкрд┐:
file := os.Open("/some/file") or raise
рдФрд░ рд╕реНрдердЧрд┐рдд:
defer f.Close() or raise(err2) errors.ReplaceIfNil(err, err2)
рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЪрд┐рдВрддрд╛рдЬрдирдХ рд╣реИ рдФрд░ рд╢рдмреНрдж рдХрд╛ рдЪреБрдирд╛рд╡ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднреНрд░рдо рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд рд▓реЛрдЧ рддреБрд░рдВрдд raise рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдЬреИрд╕реЗ рдЕрдЬрдЧрд░ рдХреЗ рд╕рдорд╛рди рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдХреЗрд╡рд▓ рдпрд╣ рдШрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐/рдЕрдВрддрд┐рдо-рдЧреИрд░- рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рдорд╛рди рдХреЙрд▓рд░ рдХреЛ рд╕реНрдЯреИрдХ)ред

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рднреА рд╣реИ, рдЬреЛ рд╕реВрд░реНрдп рдХреЗ рдиреАрдЪреЗ рд╣рд░ рд╕рдВрднрд╡ рдЕрд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдм рддрдХ, рдЬрдВрдЧрд▓реА рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЙрдкрд░реНрдпреБрдХреНрдд рдкреНрд░рдХреГрддрд┐ рдХрд╛ рд╣реИред рдмрд╛рдж рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рдорджрдж рдХреЗ рд▓рд┐рдП рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдЕрдЧрд░ рд╣рдо "рдЬрд╛рджреВ" рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рднреА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
file, err := os.Open("/some/file") or raise errors.Wrap(err, "extra context")
file, err := os.Open("/some/file") or raise err
defer err2 := f.Close() or errors.ReplaceIfNil(err, err2)
рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдмреЗрд╣рддрд░ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдмрдЬрд╛рдп рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рдорд╕реНрдпрд╛ рдХрдерди рд╣реИ, ...

рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХрдерди рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдБред рдореИрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╕реБрдЭрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:


рднрд╛рд╖рд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдЧреЛ рдХреЗрд╡рд▓ рдПрдХ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирдпрд╛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдХреЗрд╡рд▓ рдорд╛рди рд╣реИрдВ ред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рд╣реИред рднрд╛рд╖рд╛ POV рд╕реЗ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рдореВрд▓реНрдпрд╡рд╛рди рдФрд░ рд╕реБрдВрджрд░ рд╕рд╛рджрдЧреА рдХреЛ рдХрд┐рд╕реА рднреА рдХреАрдордд рдкрд░ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

Cznic рдЬреЛ рдХрд╣рддрд╛ рд╣реИ, рдЙрд╕рдХреА рддрд░реНрдЬ рдкрд░, рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛред

рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдВрдШ-рдкреНрд░рдХрд╛рд░/рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдФрд░ рдЕрд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛рдПред рд╕реНрд╡рд┐рдлреНрдЯ рдФрд░ рд░рд╕реНрдЯ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рд╕рдХреЗ рд╕рд╛рде рд╣реИ? ! рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдереЛрдбрд╝рд╛ рдЕрд╕реНрдерд┐рд░ рд░рд╣рд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рд╕рдо-рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрдИ рд░рд┐рдЯрд░реНрди рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЯреБрдкрд▓реНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рдХрдИ рд░рд┐рдЯрд░реНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд╡рд┐рдлреНрдЯ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рдПрдХ рдЫреБрд░рд╛:

func Failable() (*Thingie | error) {
    ...
}

guard thingie, err := Failable() else { 
    return wrap(err, "Could not make thingie)
}
// err is not in scope here

рдЖрдк рдЗрд╕реЗ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

guard val := myMap[key] else { val = "default" }

@bcmills рдФрд░ @jba рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди =? рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдЕрд╡рдзрд╛рд░рдгрд╛ рдЧреИрд░ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

func Foo()(Bar, Recover){}
bar := Foo() =? recover { log.Println("[Info] Recovered:", recover)}

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЗрдб рдиреЛрдЯреНрд╕ рд╣реИ, рдХреЛрдб рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдФрд░ рдкрдврд╝рдиреЗ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдХреЗрдВрдбрд░реА рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрд▓рдЧ рд░рдЦрдирд╛ред
рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЧреЛ рдХреЛрдб рдХрд╛ рдкрдарди, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдирд┐рд░рдВрддрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХрдИ рдмрд╛рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ if err!= nil {return err} рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдЗрдб рдиреЛрдЯреНрд╕ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдХрд┐рддрд╛рдм рдореЗрдВ рд╣рдо рдкрдврд╝рддреЗ рд╣реИрдВ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд▓рдЧрд╛рддрд╛рд░ рдФрд░ рдлрд┐рд░ рд╕рд╛рдЗрдб рдиреЛрдЯреНрд╕ рдкрдврд╝реЗрдВред ( @jba рдмрд╛рдд )
рдмрд╣реБрдд рд╣реА рджреБрд░реНрд▓рдн рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ, рд╢рд╛рдпрдж рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдореЗрдВред рдЖрдо рддреМрд░ рдкрд░ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдХреБрдЫ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ, рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рд╛рдЗрдб рдиреЛрдЯреНрд╕ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореБрдЭреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдмреНрд▓реЙрдХ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдПрдХ рд╕рд╛рдЗрдб рдиреЛрдЯ рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рд▓рд╛рдЗрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

bar := Foo() =? recover: log.Println("[Info] Recovered:", recover)

@ рдмрд┐рд▓реАрд╣

  1. рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рдХрд╣рд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдорд╛рди рдЬрд╛рдВрдЪ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ; рддрдерд╛

рдХреГрдкрдпрд╛ рдЕрдзрд┐рдХ рдареЛрд╕ рдмрдиреЗрдВ: "рдЕрдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп" рдмреЗрд╣рдж рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдХреЛрдб рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛?

  1. рдж =? рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИред [тАж]

рдЖрдИрдПрдордУ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдЕрд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрдЯрд░ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдХреБрдЫ рдРрд╕рд╛ рдорд╛рдирдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдЯреАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

  1. рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рдирд╛ рдЗрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдирдП рд╕рдорд╛рдзрд╛рди рдХреЛ рднреА рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ?

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝реЗрдВ: =? Block рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

n := r.Read(buf) =? err {
  if err == io.EOF {
    [тАж]
  }
  return err
}

рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ @nigeltao рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдк рд╣рдореЗрд╢рд╛ рдореМрдЬреВрджрд╛ 'n, err:= r.Read(buf)` рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЛрдкрд┐рдВрдЧ рдФрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдкрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрджрд╛рдИ рд╢реБрд░реВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП?

рдЗрдпрд╛рди рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЬреБрдбрд╝реЗ рдХрдИ рдореБрджреНрджреЛрдВ (рдФрд░ рдЙрдирдХреЗ рдЙрджрд╛рд╣рд░рдг) рджреЗрдЦреЗрдВред
https://github.com/golang/go/wiki/ExperienceReports#error -handling рднреА рджреЗрдЦреЗрдВред

рдпрджрд┐ рдЖрдкрдХреЛ рдЙрди рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред

@urandom

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рднрд╛рдЧ рдХрд┐рд╕реА рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдЗрд╕реЗ 1 рдХреЗ рдмрдЬрд╛рдп 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдлреИрд▓рд╛рдПрдЧрд╛ред

рдмреНрд▓реЙрдХ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рджреБрдЧрдирд╛ рд╣реИ:

  1. рддреНрд░реБрдЯрд┐-рдЙрддреНрдкрд╛рджрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реНрдкрд╖реНрдЯ рджреГрд╢реНрдп рдФрд░ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рд╡рд┐рд░рд╛рдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░
  2. рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП (рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ @ianlancetaylor рдХреЗ рдмрддрд╛рдП рдЧрдП рд▓рдХреНрд╖реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред

3 рд▓рд╛рдЗрдиреЗрдВ рдмрдирд╛рдо 1 рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рднреА рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЖрдкрдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ gofmt рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

file, err := os.Open("/some/file") or raise errors.Wrap(err, "extra context")
file, err := os.Open("/some/file") or raise err

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА return рдФрд░ panic ; рдЙрдирдореЗрдВ рд╕реЗ рд╢реАрд░реНрд╖ рдкрд░ raise рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдХрдо рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

defer err2 := f.Close() or errors.ReplaceIfNil(err, err2)

errors.ReplaceIfNil(err, err2) рдХреЛ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЕрд╕рд╛рдорд╛рдиреНрдп рдкрд╛рд╕-рдмрд╛рдп-рд░реЗрдлрд░реЗрдВрд╕ рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ err рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ:

defer err2 := f.Close() or errors.ReplaceIfNil(&err, err2)

рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ or рдЯреЛрдХрди рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдПрдХ рдмрдпрд╛рди, рдпрд╛ рдХреБрдЫ рдФрд░ рдмрдирд╛рддрд╛ рд╣реИ? (рдПрдХ рдФрд░ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдорджрдж рдХрд░реЗрдЧрд╛ред)

@carlmjohnson

рдЖрдкрдХреЗ guard тАж else рдХрдерди рдХрд╛ рдареЛрд╕ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ =? рдпрд╛ :: рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреЛрдХрди рдФрд░ рдЪрд░ рдкрджреЛрдВ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рд╣реЛрддреА рд╣реИред (рдлрд┐рд░ рд╕реЗ, рдПрдХ рдФрд░ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдорджрдж рдХрд░реЗрдЧрд╛: рдЖрдкрдХреЗ рдорди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреНрдпрд╛ рд╣реИрдВ?)

@рдмреАрд╕реАрдорд┐рд▓реНрд╕
рдХрд╛рд▓реНрдкрдирд┐рдХ ReplaceIfNil рдПрдХ рд╕рд░рд▓ рд╣реЛрдЧрд╛:

func ReplaceIfNil(original, replacement error) error {
   if original == nil {
       return replacement
   }
   return original
}

рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдирд╛рдо...

or рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдмрд╛рдпрд╛рдВ рдСрдкрд░реЗрдВрдб рдпрд╛ рддреЛ рдПрдХ IdentifierList, рдпрд╛ рдПрдХ PrimaryExpr рд╣реЛрдЧрд╛ред рдкреВрд░реНрд╡ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рд╕рдмрд╕реЗ рд╕рд╣реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ рдШрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рддрдм рджрд╛рдПрдВ рд╣рд╛рде рдХреЗ рдСрдкрд░реЗрдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдмрд╛рдПрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд╣реАрдВ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рдПрдХ рдФрд░ рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдЬрд╛рджреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп рд▓реЗрдЧрд╛ред
IIRC, рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдПрдХ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ '...' рдпрд╛ рдХреБрдЫ рдФрд░ рдЬреЛрдбрд╝рд╛ рд╣реЛрддрд╛, рдЬреЛ рдердХрд╛рдК рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ред рдЙрд╕ рдХрд╛рд░рдг рд╕реЗ, рдкреВрд░реА рдмрд╛рдд рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:

f, err := os.Open("/some/file") or return ..., errors.Wrap(err, "more context")

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдмреНрд▓реЙрдХ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рдмрдВрдзрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рджрд╛рдпрд░рд╛ рд╣рд░ рд╕рдВрднрд╡ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ 80% рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред рдФрд░ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХрд┐рддрдиреА рд▓рд╛рдЗрдиреЗрдВ рд▓реЗрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдореЗрд░реА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдереА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдардиреАрдпрддрд╛, рдпрд╛ рдЗрд╕рдХреА рдХрдореА, рдЬреИрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп =?) рдпрджрд┐ рдпрд╣ рдирдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдлреИрд▓рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:

if f, err := os.Open("/some/file"); err != nil {
     return errors.Wrap(err, "more context")
}
  • рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЪрд░ if рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдП рдЬрд╛рдиреЗ рдереЗред
    рдФрд░ рдЗрди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рджреГрд╢реНрдп рд╢реЛрд░ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдЕрднреА рднреА рдРрд╕реЗ рдХреБрдЫ рдмрдпрд╛рдиреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ред рдФрд░ рдпрд╣ рдЙрди рд╢рд┐рдХрд╛рдпрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╕рдордп рд╣реЛрддреА рд╣реИред

@urandom

or рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдмрд╛рдпрд╛рдВ рдСрдкрд░реЗрдВрдб рдпрд╛ рддреЛ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реВрдЪреА рдпрд╛ рдПрдХ PrimaryExpr рд╣реЛрдЧрд╛ред [...] рдпрд╣ рддрдм рджрд╛рдПрдВ рд╣рд╛рде рдХреЗ рдСрдкрд░реЗрдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдмрд╛рдпрд╛рдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд╣реАрдВ рд╣реИред

рдЧреЛ рдХреЗ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реИрдВ, рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП or рдХреЛ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╡рд╛рд▓ рдЙрдареЗрдВрдЧреЗред (рдПрдХ рдмрдбрд╝реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ or рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреНрдпрд╛ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╣ рдХреИрд╕реЗ рдЬрд┐рдм рдХрд░рддрд╛ рд╣реИ := ?)

рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХрдерди рд╣реИ, рджрд╛рдПрдБ рд╣рд╛рде рдХрд╛ рд╕рдВрдХрд╛рд░реНрдп рдХреНрдпрд╛ рд╣реИ? рдпрджрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрдВрдЬрдХ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдХреНрдпрд╛ raise рдХреЛ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╡реНрдпрдВрдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рдпрд╣ рдПрдХ рдХрдерди рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреНрдпрд╛ рд╣реИрдВ рдпрджрд┐ raise рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рд╣реЛ? рдпрд╛ рдЖрдк or raise рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП or raise :: рдпрд╛ =? рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ)?

рдХреНрдпрд╛ рдореИрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдБ?

defer f.Close() or raise(err2) errors.ReplaceIfNil(err, err2) or raise(err3) Transform(err3)

?

рдХреНрдпрд╛ рдореИрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдБ?

f(r.Read(buf) or raise err)

?

defer f.Close() or raise(err2) errors.ReplaceIfNil(err, err2) or raise(err3) Transform(err3)

рдирд╣реАрдВ, рдпрд╣ рджреВрд╕рд░реЗ raise рдХрд╛рд░рдг рдЕрдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╡рд╣ рдирд╣реАрдВ рдерд╛, рддреЛ рдкреВрд░реА рдкрд░рд┐рд╡рд░реНрддрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

defer f.Close() or raise(err2) Transform(errors.ReplaceIfNil(err, err2)


f(r.Read(buf) or raise err)

рдЕрдЧрд░ рд╣рдо рдореЗрд░реА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдорд╛рди рд▓реЗрдВ - рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдЕрдВрддрд┐рдо рдорд╛рди рдХрд╣рд╛рдВ рдпрд╛ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рддрд╛рдХрд┐ рдпрджрд┐ рдпрд╣ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдерд╛, рддреЛ рдЕрдВрддрд┐рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢реЗрд╖ рдкрд░рд┐рдгрд╛рдо рд╕реВрдЪреА рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдЧреА; рддреЛ рд╣рд╛рдБ, рдпрд╣ рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ r.Read рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред рдЕрдиреНрдпрдерд╛, n рдХреЛ f рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдЬрдм рддрдХ рдореИрдВ рд╢рд░реНрддреЛрдВ рд╕реЗ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ or рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдСрдкрд░реЗрдВрдб рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдЬрд╛рджреБрдИ, рдЕрдЧрд░ рдмрд╛рдПрдВ рдСрдкрд░реЗрдВрдб рдЪреАрдЬреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдФрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдЙрдХреНрдд рдЪреАрдЬреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдЕрдВрддрд┐рдо рддрддреНрд╡ рд▓реЗрддрд╛ рд╣реИ)ред raise рдПрдХ рдпреВрдирд░реА рдСрдкрд░реЗрдЯрд░ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдкрдиреЗ рдСрдкрд░реЗрдВрдб рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рдСрдкрд░реЗрдВрдб рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рддрд░реНрдХ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ raise рдХрд╛ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрд░реНрдл return ..., err

рдпрд╣ рдЖрджрд░реНрд╢ рд╕реНрдерд┐рддрд┐ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдареАрдХ рд╕рд╛рде рднреА рдХрд░ рд░рд╣рд╛ рд╣реВрдБ or raise рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЬрд╛ рд░рд╣рд╛ рд╣реИ =? рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рд▓рд┐рдП, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рднреА рдПрдХ рдмреНрд▓реЙрдХ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрдпрд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рддрд░реАрдХреЗ рд╕реЗ рдХрд╡рд░ рдХрд░реЗрдВред рдпрд╛ рд╣рдо рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╕рд╛рде рднреА рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ:

f := os.Open("/some/file") or raise(err) errors.Wrap(err, "with context")

рдФрд░ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЗ:

f := os.Open or raise(err) func() {
     if err == io.EOF {
         [тАж]
     }
  return err
}()

рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдореИрдВ рд╕рдВрдШ/рд╕рдо-рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЬрд┐рд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ

guard [ ASSIGNMENT || EXPRESSION ] else { [ BLOCK ] }

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдмреВрд▓рд┐рдпрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП true рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреНрдд рдорд╛рди рд╣реИ, рддреЛ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ, рдЕрдВрддрд┐рдо рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдорд╛рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди != true / != nil ред рдПрдХ рдЧрд╛рд░реНрдб рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдмрд╛рдж, рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ рднреА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдХреЛрдк рдореЗрдВ рд╣реЛрдЧрд╛ (рдпрд╣ рдПрдХ рдирдпрд╛ рдмреНрд▓реЙрдХ рд╕реНрдХреЛрдк рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ [рд╢рд╛рдпрдж рдЖрдЦрд┐рд░реА рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░?])ред

рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ, guard рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдореЗрдВ return , break , continue , рдпрд╛ throw ред рдореИрдВрдиреЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдХреБрдЫ рдореВрд▓реНрдп рдЬреЛрдбрд╝рдиреЗ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкрд╛рдардХ guard рд╢рдмреНрдж рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдХреЛрдИ рд╕реНрд╡рд┐рдлреНрдЯ рдХрд╛ рдкрд╛рд▓рди рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ guard рдЙрд╕ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг:

guard f, err := os.Open("/some/file") else { return errors.Wrap(err, "could not open:") }

guard data, err := ioutil.ReadAll(f) else { return errors.Wrap(err, "could not read:") }

var obj interface{}

guard err = json.Unmarshal(data, &obj) else { return errors.Wrap(err, "could not unmarshal:") }

guard m, _ := obj.(map[string]interface{}) else { return errors.New("unexpected data format") }

guard val, _ := m["key"] else { return errors.New("missing key") }

рдЗрдореНрд╣реЛ рд╣рд░ рдХреЛрдИ рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдПрдХ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рдкреИрдЯрд░реНрди "рд░рд┐рдЯрд░реНрди рдПрд░рд░ рдЬреИрд╕рд╛ рд╣реИ" рд╣реИред рддреЛ рдХреНрдпреЛрдВ рди smth рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ рдЬреИрд╕реЗ:

code, err ?= fn()

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЧрд▓рддреА рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП! = рд╢реВрдиреНрдп?

рдХреЗ рд▓рд┐рдП:= рдСрдкрд░реЗрдЯрд░ рд╣рдо рдкрд░рд┐рдЪрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?:=

code, err ?:= fn()

рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ ?:= рдЫрд╛рдпрд╛рдВрдХрди рдХреЗ рдХрд╛рд░рдг рдмрджрддрд░ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рдЪрд░ "рдЧрд▓рддреА" рдХреЛ рдЙрд╕реА рдирд╛рдо рдХреЗ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдВ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдХреЗрд╡рд▓ рдЧрд▓рдд рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рд╣реА рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреБрдЫ рдиреЛрдЯ:

рддреНрд░реБрдЯрд┐ рдореЙрдбрд▓ рдкрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдореЗрдВ рдорд┐рдбреЛрд░реА рдХреЗ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк "рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ" ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ рд╕реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ Go2 рдкрд░ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдирдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд throws рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдХрд░рддреЗ рд╣реБрдП, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func Get() []byte throws {
  if (...) {
    raise errors.New("oops")
  }

  return []byte{...}
}

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ, рдЧреИрд░-рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЕрдирдЪрд╛рд╣реЗ рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдгред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕рднреА рд╕рд╣рдордд рд╣реЛрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

func ScrapeDate() time.Time throws {
  body := Get() // compilation error, unhandled throwable
  body := try Get() // we've been explicit about potential throwable

  // ...
}

рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧреА, рдпрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рд╣рдо try! рдХреЛ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рд╕рдорд╛рди рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

func GetWillNotFail() time.Time {
  body := Get() // compilation error, throwable not handled
  body := try Get() // compilation error, throwable can not be propagated, because `GetWillNotFail` is not annotated with throws
  body := try! Get() // works, but will panic on throws != nil

  // ...
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ (рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рд╕рдорд╛рди):

func main() {
  // 1:
  do {
    fmt.Printf("%v", try ScrapeDate())
  } catch err { // err contains caught throwable
    // ...
  }

  // 2:
  do {
    fmt.Printf("%v", try ScrapeDate())
  } catch err.(type) { // similar to a switch statement
    case error:
      // ...
    case io.EOF
      // ...
  }
}

ps1. рдПрдХрд╛рдзрд┐рдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп func ReadRune() (ch Rune, size int) throws { ... }
ps2. рд╣рдо return try Get() рдпрд╛ return try! Get() рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВ
ps3. рдЕрдм рд╣рдо buffer.NewBuffer(try Get()) рдпрд╛ buffer.NewBuffer(try! Get()) рдЬреИрд╕реЗ рдЪреЗрди рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдкреАрдПрд╕4. рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ ( errors.Wrap(err, "context") рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛)
ps5. рдпреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реИрдВ
рдкреАрдПрд╕6. рдЕрдирджреЗрдЦреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЬреАрдд рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рдорд┐рдбреЛрд░реА рд▓рд┐рдВрдХ рдореЗрдВ рд╕рднреА рдмреБрд░реЗ рдХреЗ рд╕рд╛рде рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдЗрд╕рдХреЗ рдкрдХреНрд╖ ... рдФрд░ "рдлреЗрдВрдХрдиреЗ" рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо "рд▓реЛрдЧ" рд╣реЛрдЧрд╛
рд╣реЗрдЯ рдЗрдЯ"ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ "рдереНрд░реЛ" рдХреНрдпреЛрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП
рдХрд╛рд░реНрдп?

BTW, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдФрд░ рдЕрдирджреЗрдЦрд╛ рди рдХрд░рдиреЗ рдХрд╛ рдЖрдкрдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ
рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░реВрдк (рдЬреИрд╕реЗ gcc __attribute__((warn_unused_result)))ред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдВрдЪрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдореИрдВ рдпрд╛ рддреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реБрдЭрд╛рдКрдВрдЧрд╛ рдпрд╛
рдХреАрд╡рд░реНрдб рдлреЙрд░реНрдо рдЗрд╕ рддрд░рд╣:

?= fn() рдпрд╛ fn() рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ - рдХреЙрд▓рд░ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░реЗрдВ
!= fn() рдпрд╛ nofail fn() -- рддреНрд░реБрдЯрд┐ рдкрд░ рдШрдмрд░рд╛рд╣рдЯ

рдкрд░ 12:15 PM рдкрд░ рд╢рдирд┐, 26 рдЕрдЧрд╕реНрдд, 2017 рдкрд░, nvartolomei [email protected]
рд▓рд┐рдЦрд╛ рдерд╛:

рдХреБрдЫ рдиреЛрдЯ:

рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ
http://joeduffyblog.com/2016/02/07/the-error-model/ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╕реЗ
рддреНрд░реБрдЯрд┐ рдореЙрдбрд▓ рдкрд░ Microsoft рдореЗрдВ Midori рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ рд╕реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html
Go2 рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдирдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдереНрд░реЛ рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдХрд░рддреЗ рд╣реБрдП, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ () [] рдмрд╛рдЗрдЯ рдлреЗрдВрдХрддрд╛ рд╣реИ {
рдЕрдЧрд░ (...) {
рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдмрдврд╝рд╛рдПрдБред рдирдпрд╛ ("рдЙрдлрд╝")
}

рд╡рд╛рдкрд╕реА [] рдмрд╛рдЗрдЯ{...}
}

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЧреИрд░-рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛
рдмрд┐рдирд╛ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╣рд░ рдХреЛрдИ рд╕рд╣рдордд рд╣реЛ a
рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛, рдпрд╛ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВред

func рд╕реНрдХреНрд░реИрдкрдбреЗрдЯ () рд╕рдордпред рд╕рдордп рдлреЗрдВрдХрддрд╛ рд╣реИ {
рд╢рд░реАрд░: = рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ () // рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐, рдмрд┐рдирд╛ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп
рд╢рд░реАрд░: = рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ () // рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ

//...
}

рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧреА, рдпрд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдкрд░рд┐рдЪрдп рдХреЛрд╢рд┐рд╢ рдХрд░реЛ! рддреЗрдЬ рдХреЗ рд╕рдорд╛рдиред

func GetWillNotFail () рд╕рдордпред рд╕рдордп {
рд╢рд░реАрд░: = рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ () // рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐, рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рд╛
рдмреЙрдбреА: = рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ () // рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐, рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ GetWillNotFail рдХреЛ рдереНрд░реЛ рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рд╢рд░реАрд░: = рдХреЛрд╢рд┐рд╢ рдХрд░реЛ! Get () // рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдереНрд░реЛ рдкрд░ рдШрдмрд░рд╛рдПрдЧрд╛! = nil

//...
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ (рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рд╕рдорд╛рди):

func рдореБрдЦреНрдп () {
// 1:
рдХрд░рдирд╛ {
fmt.Printf("%v", ScrapeDate () рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)
} рдХреИрдЪ рдПрд░рд░ {// рдПрд░рд░ рдореЗрдВ рдХреИрдЪ рдереНрд░реЛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ
//...
}

// 2:
рдХрд░рдирд╛ {
fmt.Printf("%v", ScrapeDate() рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)
} рдЧрд▓рддреА рдкрдХрдбрд╝реЗрдВред (рдкреНрд░рдХрд╛рд░) {// рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рдорд╛рди
рдХреЗрд╕ рддреНрд░реБрдЯрд┐:
//...
рдорд╛рдорд▓рд╛ io.EOF
//...
}
}

ps1. рдПрдХрд╛рдзрд┐рдХ рд╡рд╛рдкрд╕реА рдорд╛рди func ReadRune () (ch рд░реВрдг, рдЖрдХрд╛рд░ int) рдлреЗрдВрдХрддрд╛ {
...}
ps2. рд╣рдо рд╡рд╛рдкрд╕реА рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВ () рдпрд╛ рд╡рд╛рдкрд╕реА рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛ! рдкреНрд░рд╛рдкреНрдд()
ps3. рдЕрдм рд╣рдо рдмрдлрд╝рд░ рдЬреИрд╕реЗ рдЪреЗрди рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреНрдпреВрдмрдлрд╝рд░ (рдЧреЗрдЯ ()) рдпрд╛ рдмрдлрд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдиреНрдпреВрдмрдлрд╝рд░ (рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ!
рдкреНрд░рд╛рдкреНрдд())
рдкреАрдПрд╕4. рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/21161#issuecomment-325106225 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AICzv9CLN77RmPceCqvjXVE_UZ6o7JGvks5sb-IYgaJpZM4Oi1c-
.

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @jba рдФрд░ @bcmills рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдСрдкрд░реЗрдЯрд░ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ "??" рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд╡рд░реНрддрдиреА рдкрдврд╝рддрд╛ рд╣реИред "=?" рдХреЗ рдмрдЬрд╛рдп рдЖрдИрдПрдордУред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП:

func doStuff() (int,error) {
    x, err := f() 
    if err != nil {
        return 0, wrapError("f failed", err)
    }

    y, err := g(x)
    if err != nil {
        return 0, wrapError("g failed", err)
    }

    return y, nil
}

func doStuff2() (int,error) {
    x := f()  ?? (err error) { return 0, wrapError("f failed", err) }
    y := g(x) ?? (err error) { return 0, wrapError("g failed", err) }
    return y, nil
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ doStuff2 рдкрдврд╝рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣:

  1. рдХрдо рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд╛рди рдмрд░реНрдмрд╛рдж рдХрд░рддрд╛ рд╣реИ
  2. рдмрд╛рдИрдВ рдУрд░ рд╣реИрдкреНрдкреА рдкрд╛рде рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ
  3. рджрд╛рдИрдВ рдУрд░ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ
  4. рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрдерд╛рдиреАрдп рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдЪрд░ рдирд╣реАрдВ рд╣реИ

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдХреЗрд▓рд╛ рдЕрдзреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рджреВ рд╣реИред ?? рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? "рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ"? "рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдкрд░ рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ?"

рдирдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рдирд╛ рдПрдХ рд╣реИрдХ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

29 рдЕрдЧрд╕реНрдд рдХреЛ 2017, 13:03 0300, рдорд╛рдЗрдХрд▓ Gustavsson [email protected] рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @jba рдФрд░ @bcmills рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдСрдкрд░реЗрдЯрд░ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ "??" рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд╡рд░реНрддрдиреА рдкрдврд╝рддрд╛ рд╣реИред "=?" рдХреЗ рдмрдЬрд╛рдп рдЖрдИрдПрдордУред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП:
func doStuff () (рдЗрдВрдЯ, рдПрд░рд░) {
рдПрдХреНрд╕, рдЧрд▓рддреА: = рдПрдл ()
рдЕрдЧрд░ рдЧрд▓рддреА!= рд╢реВрдиреНрдп {
рд╡рд╛рдкрд╕реА 0, рд▓рдкреЗрдЯреЛ рддреНрд░реБрдЯрд┐ ("рдПрдл рд╡рд┐рдлрд▓", рддреНрд░реБрдЯрд┐)
}

   y, err := g(x)
   if err != nil {
           return 0, wrapError("g failed", err)
   }

   return y, nil

}

func doStuff2 () (рдЗрдВрдЯ, рдПрд░рд░) {
рдПрдХреНрд╕: = рдПрдл () ?? (рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐) {рд╡рд╛рдкрд╕реА 0, рдЖрд╡рд░рдг рддреНрд░реБрдЯрд┐ ("f рд╡рд┐рдлрд▓", рддреНрд░реБрдЯрд┐)}
рд╡рд╛рдИ: = рдЬреА (рдПрдХреНрд╕) ?? (рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐) {рд╡рд╛рдкрд╕реА 0, рдЖрд╡рд░рдг рддреНрд░реБрдЯрд┐ ("рдЬреА рд╡рд┐рдлрд▓", рддреНрд░реБрдЯрд┐)}
рд╡рд╛рдкрд╕реА рд╡рд╛рдИ, рд╢реВрдиреНрдп
}
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ doStuff2 рдкрдврд╝рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣:

  1. рдХрдо рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд╛рди рдмрд░реНрдмрд╛рдж рдХрд░рддрд╛ рд╣реИ
  2. рдмрд╛рдИрдВ рдУрд░ рд╣реИрдкреНрдкреА рдкрд╛рде рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ
  3. рджрд╛рдИрдВ рдУрд░ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ
  4. рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрдерд╛рдиреАрдп рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдЪрд░ рдирд╣реАрдВ рд╣реИ

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВред

@nvartolomei

?? рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

https://github.com/golang/go/issues/21161#issuecomment -319434101 рдФрд░ https://github.com/golang/go/issues/21161#issuecomment -320758279 рджреЗрдЦреЗрдВред

рдЪреВрдВрдХрд┐ @bcmills рдиреЗ рдПрдХ рдореМрди рдзрд╛рдЧреЗ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рд╣реИ, рдпрджрд┐ рд╣рдо рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ @slvmnd рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдерди рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ:

func doStuff() (int, err) {
        x, err := f()
        return 0, wrapError("f failed", err)     if err != nil

    y, err := g(x)
        return 0, wrapError("g failed", err)     if err != nil

        return y, nil
}

рдПрдХ рд╣реА рд▓рд╛рдЗрди рдореЗрдВ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдФрд░ рдПрд░рд░ рдЪреЗрдХ рд╣реЛрдиреЗ рдЬрд┐рддрдирд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрдереЛрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред (рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ := рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд░реВрдк рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЕрдиреНрдпрдерд╛ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЗ рдореБрджреНрджреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рджреЗрдВрдЧреЗ, рднрд▓реЗ рд╣реА рд╡реЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдВ) "рдЬрдм рддрдХ" "рдЕрдЧрд░" рдХреЗ рдЕрд╕реНрд╡реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ "рдЬрдм рддрдХ" рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА, рд▓реЗрдХрд┐рди рдпрд╣ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧреАред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдпрд╣рд╛рдВ рдкрд░реНрд▓ рд╕реЗ рдкрд╛рд▓рдирд╛ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред (рдмреЗрд╕рд┐рдХ рдкреНрд▓рд╕ 2 рдареАрдХ рд╣реИ) рдЗрд╕ рддрд░рд╣ рд▓реВрдкрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕рдВрд╢реЛрдзрдХ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬреЛ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реБрдП рднреА рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рдореБрджреНрджреЛрдВ рдХрд╛ рдПрдХ рдФрд░ рд╕реЗрдЯ рд▓рд╛рддрд╛ рд╣реИред

рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг:
рдЕрдЧрд░ рдЧрд▓рддреА рд╣реЛ рддреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ! = рд╢реВрдиреНрдп
рддрдм рднреА рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕реЗ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рд╢реНрди рдЙрдарддрд╛ рд╣реИ - рдХреНрдпрд╛ рдЧреИрд░-рд╡рд╛рдкрд╕реА рд╡рд┐рд╡рд░рдг рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдЗрд╕ рддрд░рд╣ рдХреЗ "рдЕрдЧрд░" рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдЬреИрд╕реЗ:
func(args) рдЕрдЧрд░ рд╢рд░реНрдд

рд╢рд╛рдпрдж рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рдж рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп-рдЕрдЧрд░ рдпрд╣ рдПрдХрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ
рд▓рд╛рдЗрди рдЕрдЧрд░ рд╣реИ?

рдЕрдЧрд░ рдЧрд▓рддреА!=рд╢реВрдиреНрдп рд╡рд╛рдкрд╕реА
рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп рд╡рд╛рдкрд╕реА 0, рд▓рдкреЗрдЯреЛ рддреНрд░реБрдЯрд┐ ("рд╡рд┐рдлрд▓", рдЧрд▓рддреА)
рдЕрдЧрд░ рдЧрд▓рддреА!=рд╢реВрдиреНрдп do_smth ()

рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рддреЛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк, рдирд╣реАрдВ? рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
рдпрд╣ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рджрд░реНрдж рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ: /

рд▓реЗрдХрд┐рди... рдпрд╣ рд╕рдм рд╕рд┐рд░реНрдл рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд▓реИрдВрдЧ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ
рд╕рдВрднрд╛рд▓рдирд╛/рдкреНрд░рд╕рд╛рд░ рдХрд░рдирд╛ред

рд╕реЛрдо рд╕рд┐рддрдореНрдмрд░ 18, 2017 рдкрд░ 4:14 рдкреНрд░рдзрд╛рдирдордВрддреНрд░реА рдкрд░ dsugalski [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

рдЪреВрдБрдХрд┐ @bcmills https://github.com/bcmills рдиреЗ рдкреБрдирд░реБрддреНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдереА a
рдореМрди рдзрд╛рдЧрд╛, рдЕрдЧрд░ рд╣рдо рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдХреНрд░рд┐рдмрд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ,
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрдерди рд╕рдВрд╢реЛрдзрдХ рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛
рдпрд╣ред @slvmnd https://github.com/slvmnd рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ
рдХрдерди рд╕рдВрд╢реЛрдзрдХ:

func doStuff () (рдЗрдВрдЯ, рдЗрд░реЗрдЯ) {
рдПрдХреНрд╕, рдЧрд▓рддреА: = рдПрдл ()
рд░рд┐рдЯрд░реНрди 0, рд░реИрдкрдПрд░рд░ ("рдПрдл рдлреЗрд▓", рдЗрд░реЗрдЯ) рдЕрдЧрд░ рдЗрд░реЗрдЯ! = nil

  y, err := g(x)
    return 0, wrapError("g failed", err)     if err != nil

    return y, nil

}

рдПрдХ рд╣реА рдореЗрдВ рдХрдерди рдФрд░ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдлреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╣реАрдВ рд╣реИ
рд▓рд╛рдЗрди, рд▓реЗрдХрд┐рди рдпрд╣ рдпрдереЛрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред (рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ := рдХреЗ рдлрд╝реЙрд░реНрдо рдХреА рдЕрдиреБрдорддрд┐ рди рджреА рдЬрд╛рдП
рдЕрдЧрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдЕрдиреНрдпрдерд╛ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреА
рд▓реЛрдЧреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░реЗрдВ рднрд▓реЗ рд╣реА рд╡реЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдВ) "рдЬрдм рддрдХ" рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ
"рдЕрдЧрд░" рдХрд╛ рдЕрд╕реНрд╡реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХрд╛ рдПрдХ рд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдкрдврд╝реЗрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдпрд╣рд╛рдВ рдкрд░реНрд▓ рд╕реЗ рдкрд╛рд▓рдирд╛ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред (рдмреЗрд╕рд┐рдХ рдкреНрд▓рд╕ 2 is
рдареАрдХ) рдЗрд╕ рддрд░рд╣ рд▓реВрдкрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕рдВрд╢реЛрдзрдХ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬрдмрдХрд┐ рдХрднреА-рдХрднреА
рдЙрдкрдпреЛрдЧреА, рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рдореБрджреНрджреЛрдВ рдХрд╛ рдПрдХ рдФрд░ рд╕реЗрдЯ рд▓рд╛рдПрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/21161#issuecomment-330215402 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AICzv1rfnXeGVRRwaigCyyVK_STj-i83ks5sjmylgaJpZM4Oi1c-
.

@dsugalski рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдЗрд╕рдореЗрдВ рд╡рд╣ рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ рдЬреЛ @jba рдФрд░ рдЕрдиреНрдп рдиреЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдХреЛрдб рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЕрднреА рднреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдХреЛрдб рдкрдереЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдХрдо рдЖрдХрд░реНрд╖рдХ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╢реБрджреНрдз рдкрд╛рда рд╕реЗ рдХрд┐рддрдиреА рджреГрд╢реНрдп рднреЗрдж рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░ рдХреА рдЖрдИрдбреАрдИ рдпрд╛ рдХреЛрдб рд░рдВрдЧ рдкрд░рдд рдкрд░ рдкреЗрдВрдЯ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЯреЗрдХреНрд╕реНрдЯ-рдЖрдзрд╛рд░рд┐рдд рджреГрд╢реНрдпрдорд╛рди рднреЗрдж рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рд░реВрдкрдг рдорд╛рдирдХ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдерд╛, рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдпрд╣ рд╢рд░реНрдордирд╛рдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдерд╛ рдХрд┐ IF/UNLESS рдХрдерди рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╕рд╣реА-рдЙрдЪрд┐рдд рд╣реЛрдирд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдЙрдиреНрд╣реЗрдВ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦрдбрд╝рд╛ рдХрд░ рджрд┐рдпрд╛ред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдорд╛рдирдХ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛ рдФрд░ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рд╡рд┐рдВрдбреЛ рдЖрдХрд╛рд░ рд╡рд╛рд▓реЗ рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡реАрдЯреА-220 рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдерд╛)

рдореЗрд░реЗ рд▓рд┐рдП, рдХрдо рд╕реЗ рдХрдо, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдерди рд╕рдВрд╢реЛрдзрдХ рдорд╛рдорд▓рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди if-block рдпреЛрдЬрдирд╛ рд╕реЗ рдмреЗрд╣рддрд░ рдкрдврд╝рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдореИрдВ рдЙрд╕реА рддрд░рд╣ рд╕реНрд░реЛрдд рдХреЛрдб рдкрдврд╝рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдореИрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рдкрд╛рда рдкрдврд╝рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдореМрдЬреВрджрд╛ рдЖрд░рд╛рдорджрд╛рдпрдХ рдкреИрдЯрд░реНрди рдореЗрдВ рдореИрдк рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рд░ рдХреЛрдИ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

return 0, wrapError("f failed", err) if err != nil рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ if err != nil { return 0, wrapError("f failed", err) }

if err != nil return 0, wrapError("f failed", err) рд╡рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ gofmt рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП if рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдкрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ?

рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬреЛ рдореБрдЭ рдкрд░ рдкреНрд░рд╣рд╛рд░ рдХрд░рддреА рд╣реИред рдереНрд░реЛрдЕрд╡реЗ рдЧреЛ рдХреЛрдб рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдШрд░реНрд╖рдг рдХрд╛ рдЕрдиреБрднрд╡ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╣рд░ рдПрдХ рдХреЙрд▓ рдкрд░ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЙрд▓ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдиреЗрд╕реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ http.Client.Do рдХреЛ рдПрдХ рдирдП рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдкрд╣рд▓реЗ http.NewRequest рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛, рдлрд┐рд░ рдЙрд╕ рдкрд░ Do рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:

f(y())

рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд▓реЗ рд╣реА y (T, error) tuple рд▓реМрдЯрд╛рдПред рдЬрдм y рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ f рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ f рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдПрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддрдм рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛:

n, err := http.DefaultClient.Do(http.NewRequest("DELETE", "/foo", nil))

рдФрд░ рдпрджрд┐ NewRequest рдпрд╛ Do рд╡рд┐рдлрд▓ рд╣реБрдЖ рддреЛ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдЙрдкрд░реЛрдХреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдиреНрдп рд╣реИ рдпрджрд┐ f рджреЛ рддрд░реНрдХреЛрдВ, рдпрд╛ рднрд┐рдиреНрди рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдирд┐рдпрдо рдХрд╛рдлреА рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рддреЛ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ (рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реВрдВ), рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡реИрд╕реЗ рднреА рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдлреЗрдВрдХ рджреВрдВрдЧрд╛ред

@rogpeppe рдпрд╛ рдЖрдк рдХреЗрд╡рд▓ json.NewEncoder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@gbbr рд╣рд╛ рд╣рд╛рдБ, рдмреБрд░рд╛ рдЙрджрд╛рд╣рд░рдгред

рдПрдХ рдмреЗрд╣рддрд░ рдЙрджрд╛рд╣рд░рдг http.Request рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгреА рдмрджрд▓ рджреА рд╣реИред

рдмрд╣реБрдд рдЦреВрдмред рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдФрд░ рднреА рдмрджрддрд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдБ

if val, err := DoMethod(); err != nil {
   // val is accessible only here
   // some code
}

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реЗрд╢рд╛рди рд╣реИ рд▓реМрдЯрд╛рдП рдЧрдП рдЪрд░ рдХрд╛ рджрд╛рдпрд░рд╛ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ val рд▓реЗрдХрд┐рди рдпрд╣ if рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИред
рддреЛ рдЖрдкрдХреЛ else рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рд▓рд┐рдВрдЯрд░ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реЛрдЧрд╛ (рдФрд░ рдореИрдВ рднреА), рдФрд░ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ

val, err := DoMethod()
if err != nil {
   // some code
}
// some code with val

if рдмреНрд▓реЙрдХ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:

if val, err := DoMethod(); err != nil {
   // some code
}
// some code with val

@dmbreaker рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ рдХрд╛ рдЧрд╛рд░реНрдб рдХреНрд▓реЙрдЬ рд╣реИред рдпрджрд┐ рдпрд╣ рдХреБрдЫ рд╢рд░реНрдд рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░реЗ рдХреЗ рднреАрддрд░ рдПрдХ рдЪрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВред

рдореИрдВ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реВрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдпрдерд╛ рд╕рд░рд▓ рдФрд░ рдмреЗрд╣рдж рдЖрд╕рд╛рди рднрд╛рд╖рд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЬрд╛рджреВрдЧрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

@gbbr
рдЖрдк рдпрд╣рд╛рдБ рдХрд┐рд╕ 'рдпрд╣' рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдХреБрдЫ рдЕрд▓рдЧ рд╕реБрдЭрд╛рд╡ рд╣реИрдВред

рд╢рд╛рдпрдж рджреЛ-рднрд╛рдЧ рд╕рдорд╛рдзрд╛рди?

try рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ "рд░рд┐рдЯрд░реНрди рдЯрдкрд▓ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд╣реА рдорд╛рди рдХреЛ рдЫреАрд▓реЗрдВ; рдпрджрд┐ рдпрд╣ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдмрд╕реЗ рд╕рд╣реА рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рд╣реИрдВ"ред рдпрд╣ рдЖрдо рдорд╛рдорд▓рд╛ рдмрдирд╛рддрд╛ рд╣реИ

 a := try ErrorableFunction(b)

рдФрд░ рдЬрдВрдЬреАрд░ рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ

 a := try ErrorableFunction(try SomeOther(b, c))

(рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рджрдХреНрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЧреИрд░-рд╢реВрдиреНрдп рдХреЗ рдмрдЬрд╛рдп рдЧреИрд░-рд╢реВрдиреНрдп рдмрдирд╛рдПрдВред) рдпрджрд┐ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп/рдЧреИрд░-рд╢реВрдиреНрдп рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рди "рдорд╛рди рдХреЗ рд╕рд╛рде рдирд┐рд░рд╕реНрдд" рд╣реЛрддрд╛ рд╣реИред try 'ed рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдмрд╕реЗ рджрд╛рд╣рд┐рдирд╛ рдорд╛рди рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдмрд╕реЗ рджрд╛рд╣рд┐рдиреЗ рдорд╛рди рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рддреНрд░реБрдЯрд┐ рд╣реИред (рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ error рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рд╕рдореБрджрд╛рдп рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп "рдЪрд╛рд▓рд╛рдХ" рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред)

рдлрд┐рд░, рдбрд┐рдлрд░ рдЬреИрд╕реЗ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рд░рд┐рдЯрд░реНрди рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдпрд╛ рддреЛ:

catch func(e error) {
    // whatever this function returns will be returned instead
}

рдпрд╛, рдЕрдзрд┐рдХ рдореМрдЦрд┐рдХ рд░реВрдк рд╕реЗ рд╢рд╛рдпрдж рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЗрдирд▓рд╛рдЗрди рдХрд┐ рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

defer func() {
    if err := catch(); err != nil {
        set_catch(ErrorWrapper{a, "while posting request to server"})
    }
}()

catch рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реМрдЯрд╛рдП рдЬрд╛ рд░рд╣реЗ рдорд╛рди рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХрдИ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рди рдЙрди рд╕рднреА рд╕реЗ рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рдЧреБрдЬрд░реЗрдЧрд╛ред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдорд╛рди рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред defer -рдЖрдзрд╛рд░рд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдПрдХ defer func set_catch рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ defer func рдЙрд╕реЗ catch() рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред (рдпрджрд┐ рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдореВрд░реНрдЦ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рднреНрд░рдорд┐рдд рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдорд┐рд▓реЗрдЧрд╛ред рдРрд╕рд╛ рди рдХрд░реЗрдВред) set_catch рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд▓реМрдЯрд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ defer рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдПрдХ рдмрдпрд╛рди рд╣реИ, рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрдерди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред

рдореИрдВ рд╕рд░рд▓рддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╡рд┐рд▓рдВрдм-рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддрд╛ рд╣реВрдВ (рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдВ рдХреЛрдИ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ, рдпрд╣ рдПрдХ рдирдИ рдЪреАрдЬрд╝ рдХреЗ рдмрдЬрд╛рдп recover() рдХрд╛ рджреВрд╕рд░рд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ), рд▓реЗрдХрд┐рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдПрдХ рдЕрд▓рдЧ рдХреИрдЪ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдЯрд░реНрди рд╣реЛрдиреЗ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЕрдзрд┐рдХрддрдо рджрдХреНрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рд╕реНрдХреЛрдк рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВ рддрд╛рдХрд┐ рдкреНрд░рддрд┐ рд╕реНрдХреЛрдк рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреЛ рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛ , рдЬреЛ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓рдЧрднрдЧ рд╢реВрдиреНрдп рд▓рд╛рдЧрдд рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред (рд╕рдВрднрд╡рддрдГ рд╕реНрд░реЛрдд рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рдХреИрдЪ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рднреА рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдпрд╣ рд╕рд╕реНрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд▓реЛрдЧ рдПрдХ рдкреВрд░реНрдг рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред)

рдпрд╛ рддреЛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ рдХрд┐ рдЖрдИрдПрдордПрдЪрдУ рд╡рд░реНрддрдорд╛рди рдорд╛рдорд▓реЗ рдХреЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдкреНрд░рддрд┐ рдЖрд░рдПрд╕рд╕реА рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░; рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╢реНрд░рдорд╕рд╛рдзреНрдпрддрд╛ рд╕рд╣реА рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрдЬрд╛рдп "рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐" рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреА рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЦреБрдж рдЗрд╕рд╕реЗ рдмрд╣реБрдд рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реВрдВред

@thejerf рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЗрдпрд╛рди рдХреЗ рдмрд┐рдВрджреБ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдпрд╛ рдЕрдиреНрдпрдерд╛ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рд╣реИред

рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ try рдФрд░ catch рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рд▓рдХреНрд╖реНрдп рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдбрд┐рдЯреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХрдо рд╕реЗ рдХрдо, рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд╣реИрдВред

рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ, рдПрдХ рддрд░рд╣ рд╕реЗ рдореИрдВ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рдорд╛рдирддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рджреЛрд╣рд░рд╛рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдбрд╛рд▓рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред .

рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП,

func Chdir(dir string) error {
    if e := syscall.Chdir(dir); e != nil {
        return &PathError{"chdir", dir, e}
    }
    return nil
}

рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рд╣рд░ рдЖрддрд╛ рд╣реИ

func Chdir(dir string) error {
    catch func(e error) {
        return &PathError{"chdir", dir, e}
    }

    try syscall.Chdir(dir)
    return nil
}

рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдореВрд▓ рдХрд╛рд░реНрдп рдХреЛ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдореВрд▓ Chdir рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдорд╛рдирддрд╛ред рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рджреНрд╡рд╛рд░рд╛ рд╢реЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ-рддреНрд░реБрдЯрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдПред рдореИрдВ рдпрд╣ рднреА рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдЪрдореБрдЪ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рд╕рд╣реА рдЙрддреНрддрд░ рд╢рд╛рдпрдж рд╡рд╣реА рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдорд┐рд▓рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИ, рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐ рдпрджрд┐ рд╡рд╣ _was_ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдХреЛрдИ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реЛрдЧреАред рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд╛ рд╢реЛрд░ рдХреЗрд╡рд▓ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ "рдЬреНрдпрд╛рджрд╛рддрд░ рд╡рд╣реА рдХрд╛рдо" рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрд╣ рднреА рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

func SomethingBigger(dir string) (interface{}, error) {
     catch func (e error, filename string, lineno int) {
         return PackageSpecificError{e, filename, lineno, dir}
     }

     x := try Something()

     if x == true {
         try SomethingElse()
     } else {
         a, b = try AThirdThing()
     }

     return whatever, nil
}

рдпрджрд┐ рд╣рдо рд╕рд┐рдВрдЧрд▓ рдЗрдл рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреВрдард╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдкрд╕реА рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдП : рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХрд╛рдлреА рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдмреА: рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдУрд╡рд░рд╣реЗрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреА рдЬрдЯрд┐рд▓рддрд╛, рд╢рд╛рдпрдж рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд┐рд╕реА рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ

func packageSpecificHandler(f string) func (err error, filename string, lineno int) {
    return func (err error, filename string, lineno int) {
        return &PackageSpecificError{"In function " + f, err, filename, lineno}
    }
}

 func SomethingBigger(dir string) (interface{}, error) {
     catch packageSpecificHandler("SomethingBigger")

     ...
 }

рдпрд╛ рдХреБрдЫ рд╕рдордХрдХреНрд╖ рд╕рдВрднрд╡ рд╣реЛ, рдЬрдм рд╡рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдФрд░, рдкреГрд╖реНрда рдХреЗ рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ... рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдЧреЛ рдЬреИрд╕рд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧреЛ рдЕрдзрд┐рдХ рд╣реИред

рд╕рдЪ рдХрд╣реВрдВ рддреЛ, рдореЗрд░рд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреЗрд╢реЗрд╡рд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдЕрдиреБрднрд╡ PHP (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЖрдХрд░реНрд╖рдг рд╣рдореЗрд╢рд╛ рдкрдардиреАрдпрддрд╛ рдереАред рдЬрдмрдХрд┐ рдореИрдВ PHP рдХреЗ рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рдореИрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдШреГрдгрд╛ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ "рдЕрдВрддрд┐рдо" "рдЕрдореВрд░реНрдд" "рд╕реНрдерд┐рд░" рдмрдХрд╡рд╛рд╕ рдФрд░ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдЬрдЯрд┐рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬреЛ рдПрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рджреЗрдЦрдХрд░ рдореБрдЭреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдПрдХ рдбрдмрд▓ рдЯреЗрдХ рдХрд░рдиреЗ рдХреА рднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рддрддреНрдХрд╛рд▓ рдлреНрд▓реИрд╢рдмреИрдХ рдорд┐рд▓рд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд╕реЛрдЪреЗрдВ" рдХрд┐ рдХреЛрдб рдХрд╛ рд╡рд╣ рдЯреБрдХрдбрд╝рд╛ рдХреНрдпрд╛ рдХрд╣ рд░рд╣рд╛ рд╣реИ/рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдб рдкрдардиреАрдп рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдЬреБрдбрд╝рддрд╛ рд╣реИред рдореЗрд░реА рдкрд╣рд▓реА рдкреНрд░рд╡реГрддреНрддрд┐ рдмрд╛рдИрдВ рдУрд░ рджреЗрдЦрдирд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ nil рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЕрдм рдореБрдЭреЗ рдХреЛрдб рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЕрдзрд┐рдХ рд╕рдордп рдкрдврд╝рдирд╛ рдФрд░ рдЕрдзрд┐рдХ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рдХреЛрдИ рдЧреБрдВрдЬрд╛рдЗрд╢ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ (рдЕрднреА рддрдХ) рдЗрд╕ рдкреВрд░реЗ рдзрд╛рдЧреЗ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ (рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЛрдЧ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдлреЗрдВрдХ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

a, err := helloWorld(); err? {
  return fmt.Errorf("helloWorld failed with %s", err)
}

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдКрдкрд░ рдХреБрдЫ рдпрд╛рдж рдирд╣реАрдВ рдЖрдпрд╛ рдЬреЛ рдЗрд╕реЗ рд░рджреНрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рджрд┐рди рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реВрдВрдЧрд╛ :)

рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЗрд╡рд▓ error рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреА, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдЕрд░реНрдердкреВрд░реНрдг рдЧрдбрд╝рдмрдбрд╝реА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред

рджрд┐рд▓рдЪрд╕реНрдк, @buchanae , рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╣рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:

if a, err := helloWorld(); err != nil {
  return fmt.Errorf("helloWorld failed with %s", err)
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ a рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрдмрдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рддрддреНрдХрд╛рд▓реАрди рдФрд░ рдЕрдиреНрдп рдмреНрд▓реЙрдХреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИред

@ object88 рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдкрд░рд┐рд╡рд░реНрддрди рд╕реВрдХреНрд╖реНрдо, рд╕реМрдВрджрд░реНрдпрдкреВрд░реНрдг рдФрд░ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЧреЛ 2 рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реВрдХреНрд╖реНрдо рдкрдардиреАрдпрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдпрд╣ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрди if рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП !=nil рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЪрд░ рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡реЗ (рдЕрдзрд┐рдХрд╛рдВрд╢?) рдЕрдиреНрдп рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рд╣реИрдВред

a рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдорд╣рд╛рди рдмрд┐рдВрджреБ, рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред

рдЗрд╕ рд╡реНрдпрд╛рдХрд░рдг рдХреА рдЕрдиреНрдп рд╕рдореНрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдРрд╕рд╛ рд╕рдВрднрд╡ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

err := helloWorld(); err? {
  return fmt.Errorf("error: %s", err)
}

рдФрд░ рд╢рд╛рдпрдж

helloWorld()? {
  return fmt.Errorf("hello world failed")
}

рдЬреЛ рд╢рд╛рдпрдж рд╡рд╣реАрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдирд╛ рдЧреЛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХреЗрдВ:
```
рдП: = рд╣реИрд▓реЛрд╡рд░реНрд▓реНрдб (); рдЧрд▓рддреА? {
рд╡рд╛рдкрд╕реА fmt.Errorf ("рд╣реИрд▓реЛрд╡рд░реНрд▓реНрдб рд╡рд┐рдлрд▓:% s", рддреНрд░реБрдЯрд┐)
}

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХреЛрд╢рд┐рд╢ рдХрд░реЛ, рдкрдХрдбрд╝реЛ, рдЕрдВрдд рдореЗрдВ рдХрдИ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣?

рдирд╣реАрдВ, рдпрд╣ рдХреЛрдб рдХреЛ рдирд┐рд╣рд┐рдд рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЫреЛрдЯрд╛ рд╣реИ)

рдереВ, 23 рдирд╡рдВрдмрд░ 2017 рдХреЛ 07:27 рдмрдЬреЗ, рдХрд╛рдореНрдпрд╛рд░ рдорд┐рд░реЗрдорд╛рдбреА рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХреЛрд╢рд┐рд╢ рдХрд░реЛ, рдкрдХрдбрд╝реЛ, рдЕрдВрдд рдореЗрдВ
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрдИ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/21161#issuecomment-346529787 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AICzvyy_kGAlcs6RmL8AKKS5deNRU4_5ks5s5PQVgaJpZM4Oi1c-
.

@mpvl рдХреЗ WriteToGCS рдЙрджрд╛рд╣рд░рдг рдЕрдк-рдереНрд░реЗрдб рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдореИрдВ (рдлрд┐рд░ рд╕реЗ) рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рддрд┐рдмрджреНрдз/рд░реЛрд▓рдмреИрдХ рдкреИрдЯрд░реНрди рдЧреЛ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдПрдХ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреИрдЯрд░реНрди рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ ( рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ ):

func runWithCommit(f, commit func() error, rollback func(error)) (err error) {
    defer func() {
        if r := recover(); r != nil {
            rollback(fmt.Errorf("panic: %v", r))
            panic(r)
        }
    }()
    if err := f(); err != nil {
        rollback(err)
        return err
    }
    return commit()
}

рддрдм рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

func writeToGCS(ctx context.Context, bucket, dst string, r io.Reader) error {
    client, err := storage.NewClient(ctx)
    if err != nil {
        return err
    }
    defer client.Close()

    w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
    return runWithCommit(
        func() error { _, err := io.Copy(w, r); return err },
        func() error { return w.Close() },
        func(err error) { _ = w.CloseWithError(err) })
}

рдореИрдВ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╕реБрдЭрд╛рдКрдВрдЧрд╛:

func someFunc() error {
    ^err := someAction()
    ....
}

рдПрдХрд╛рдзрд┐рдХ рдПрдХрд╛рдзрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдХреЗ рд▓рд┐рдП:

func someFunc() error {
    result, ^err := someAction()
    ....
}

рдФрд░ рдХрдИ рд╡рд╛рдкрд╕реА рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП:

func someFunc() (result Result, err error) {
    var result Result
    params, ^err := someAction()
    ....
}

^ рд╕рд╛рдЗрди рдХрд╛ рдЕрд░реНрде рд╣реИ рд╡рд╛рдкрд╕реА рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред
рдореВрд▓ рд░реВрдк рд╕реЗ "рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдвреЗрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВ"

рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдХреЛрдИ рдХрдорд┐рдпрд╛рдВ?

@gladkikhartem
рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдЧрд╛?

@urandom
рд░реИрдкрд┐рдВрдЧ рдПрд░рд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЧреЛ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЬрд╛рджреВ рдирд╣реАрдВред
рдореИрдВ рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛

рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдореИрдВ рдЙрд╕ рдХреЛрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдмрд╕ рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИред

if err != nil {
    return err
}

рдпрд╣ рдЧреЛ рдХреЗ рдХреНрд▓рд┐рдЪ рдХреА рддрд░рд╣ рд╣реИ - рдЖрдк рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ, рдЖрдк рдЗрд╕реЗ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдореИрдВрдиреЗ рдЕрдм рддрдХ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ:

  1. рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЛ рдХрдо рдХрд░рдирд╛
  2. рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдХрд░ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░

рдпрд╣ @ianlancetaylor рджреНрд╡рд╛рд░рд╛ рдореВрд▓ рдореБрджреНрджреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ

1. рд╕рд┐рдВрдЯреЗрдХреНрд╕ рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХрдореА

рдореБрдЭреЗ @gladkikhartem рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреЗ рдореВрд▓ рд░реВрдк рдореЗрдВ рднреА рдЬрд┐рд╕рдХреА рдореИрдВ рдпрд╣рд╛рдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд/рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

 result, ^ := someAction()

рдПрдХ func рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ:

func getOddResult() (int, error) {
    result, ^ := someResult()
    if result % 2 == 0 {
          return result + 1, nil
    }
    return result, nil
}

рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ - рдпрд╛ err^ рд╕рд╛рде @gladkikhartem рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд░реВрдк рдореЗрдВ - рд╕рдорд╕реНрдпрд╛ (1) рдХреЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рдЧ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдЧрд╛ред

2. рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрдн

рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдпрджрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ contextError рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдЯреИрдХрдЯреНрд░реИрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдирдП рдореВрд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрдг рдпрд╛ рдЫреЛрдЯреЗ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ (рдПрдХ GO_CONTEXT_ERROR=full ) рдХреЛ рд╕реНрдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ error рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рд╢реАрд░реНрд╖ рдХреЙрд▓ рд╕реНрдЯреИрдХ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд╡реЗрд╢ред

contextError , рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЧреЛ рдХреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХрдЯреНрд░реИрдХ рдХреЛ рдареАрдХ рдЙрд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдмрдирд╛рдИ рдЧрдИ рд╣реИред

рдПрдХ func рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ:

func getOddResult() (int, contextError) {
    result, ^ := someResult() // here a 'contextError' is created; if the error received from 'someResult()' is also a `contextError`, the two are nested
    if result % 2 == 0 {
          return result + 1, nil
    }
    return result, nil
}

рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ error рд╕реЗ contextError , рдЬрд┐рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type contextError interface {
    error
    Stack() []StackEntry
    Cause() contextError
}

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ Stack() https://golang.org/pkg/runtime/debug/#Stack рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдЧреЛрд░реВрдЯреАрди рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рдЧреИрд░-рдмрд╛рдЗрдЯреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ)

рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк Cause() рд╡рд┐рдзрд┐ рд╢реВрдиреНрдп рдпрд╛ рдкрд┐рдЫрд▓рд╛ contextError рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдвреЗрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдореГрддрд┐ рдкреНрд░рднрд╛рд╡реЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрд╡рдЧрдд рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реЙрд░реНрдЯ рд╕реНрдЯреИрдХ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ 1 рдпрд╛ рдХреБрдЫ рдФрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЖрдорддреМрд░ рдкрд░ рд╡рд┐рдХрд╛рд╕/рдбреАрдмрдЧ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдкреВрд░реНрдг рд╕реНрдЯреНрд░реИрдХрдЯреНрд░реЗрд╕ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдпрдерд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рд▓рдШреБ рд╕реНрдЯреИрдХрдЯреНрд░реИрдХ) рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред

рдкреВрд░реНрд╡ рдХрд▓рд╛:

  • https://godoc.org/github.com/pkg/errors (рдореИрдВ рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ/рдЬреНрдЮрд╛рдд рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ)

рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рднреЛрдЬрдиред

@gladkikhartem @gdm85

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдП рд╣реИрдВред рдкреНрд░рддрд┐ рдЗрдпрд╛рди рдХреА рдореВрд▓ рдкреЛрд╕реНрдЯ:

рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╕рд╛рди (рд╢рд╛рдпрдж рдмрд╣реБрдд рдЖрд╕рд╛рди) рд╣реИ (рджреЗрдЦреЗрдВ #20803)ред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрдИ рдореМрдЬреВрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд╕рдВрд╢реЛрдзрд┐рдд рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, #16225, #18721, #21146, #21155)ред рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред

рдЕрд╕рдВрд╢реЛрдзрд┐рдд рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдХреНрд╕рд░ рдЧрд▓рдд рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдЕрдиреБрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИрдВред рд╣рдо рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рдХреЗрд╡рд▓ "рд╡рд╛рдкрд╕реА рдЕрд╕рдВрд╢реЛрдзрд┐рдд" рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рдиреЛрдВ рдХреЛ рдЧрд▓рдд рджрд┐рд╢рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@bcmills рдпрджрд┐ рд╕рдВрджрд░реНрдн (рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ) рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред рдХреНрдпрд╛ рдорд╛рдирд╡-рдкрдардиреАрдп рд╕рдВрджреЗрд╢ рдЬреИрд╕реЗ "рд░рд┐рдХреЙрд░реНрдб рдбрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐" рдХреЛ "рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди" рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛? рдХреИрд╕реЗ рддрдп рдХрд░реЗрдВ рдХрд┐ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдРрд╕реЗ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП (рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдКрдкрд░/рдиреАрдЪреЗ рдЖрджрд┐)? рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдпреЗ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди рд╣реИрдВред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ "рд░рд┐рдЯрд░реНрди рдЕрдирдореЙрдбрд┐рдлрд╛рдЗрдб" рдХреЛ рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ "рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЕрдирдореЙрдбрд┐рдлрд╛рдЗрдб рд░рд┐рдЯрд░реНрди" рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ (рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╢реИрд▓реА рдореЗрдВ) рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдПрдХ рдорд╛рдирд╡ рдкрдардиреАрдп рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВред рдореИрдВрдиреЗ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдирд╡ рдкрдардиреАрдп рд╕рдВрджреЗрд╢ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдпрд╣ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП pkg/errors рдореЗрдВ рд░реИрдкрд┐рдВрдЧ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред

"рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдПрд░рд░ рдЕрдирдореЙрдбрд┐рдлрд╛рдЗрдб рдЕрдХреНрд╕рд░ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ": рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрд▓рд╕реА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрдЧреНрд░реЗрдб рдкрде рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рд╡рд╣реА рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

@рдмреАрд╕реАрдорд┐рд▓реНрд╕
рдореИрдВ 100% #20803 рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ...)
рд╣рд╛рдВ, рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИ, рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреЗ рдЗрд░рд╛рджреЗ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд░рд╛рджреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗред рдФрд░ рдЬрдм рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдБ || рдРрд╕рд╛ || рд╕рд╛рдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдпрд╣ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреБрдЦреА рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рдЖрд╕рд╛рди рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрдЧрд╛ - рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА - рд▓реЛрдЧ рд╕реНрд╡рдпрдВ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХ рдЙрдкрдирд╛рдо рдмрдирд╛рдПрдВред рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд╛рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдЗрд╕реЗ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреАрд╡рди рдХреЛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдВрдЧреЗред

рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирдлрд░рдд рд╣реИ рдЬрдм рдбрд┐рдЬрд╛рдЗрди рдореБрдЭреЗ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрджрд┐рдЧреНрдз рд╣реИред

@ рдЬреАрдбреАрдПрдо85
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рднрдпрд╛рдирдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдмрд╕ рджреЗрдЦреЛ рдФрд░ рдЬрд╛рд╡рд╛ рд╕реНрдЯреИрдХ рдирд┐рд╢рд╛рдиред
рдЬрдм рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ - рддреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдФрд░ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдпрд╣реА рд╣реИред

@gladkikhartem рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реИрдкрд┐рдВрдЧ" рдХрд╛ рдПрдХ рд░реВрдк рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд╡рд╣ рднреА рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рдЬреЛ рдЖрдк рдЬрд╛рд╡рд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИ? рд╕реМрдВрджрд░реНрдп рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдмрджрд╕реВрд░рдд? рдХреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╣реИ?), рд▓реЗрдХрд┐рди рдПрдХ рд░рдЪрдирд╛рддреНрдордХ рджрд┐рд╢рд╛ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: "рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕рдВрднрд╛рд▓реА рдЧрдИ рддреНрд░реБрдЯрд┐" рдХреА рдПрдХ рдЕрдЪреНрдЫреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ?

рдореИрдВ рджреЛрдиреЛрдВ рд╕реЗ рдЧреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рд╕рдордЭ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ (рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╡рд┐рд╣рд┐рдд рдЬреЛ рд╡реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕реБрдзрд╛рд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреА рд╣реИред

@gladkikhartem рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдЬрдЧрд╣ рдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЙрди рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ рдЬреЛ рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдереЗред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ рдЬреЛ if err != nil { return err } рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реНрдерд╛рди рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

@ianlancetaylor
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореИрдВрдиреЗ рдЪрд░реНрдЪрд╛ рдХреЛ рдЗрд╕рдХреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ред

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:
(рдФрд░ рдЖрд╕рд╛рди рд╕рдВрджрд░реНрдн рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХреЗ рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░реЗрдВ)

type MyError struct {
    Type int
    Message string
    Context string
    Err error
}

func VeryLongFunc() error {
    var err MyError
    err.Context = "general function context"


   result, ^err.Err := someAction() {
       err.Type = PermissionError
       err.Message = fmt.SPrintf("some action has no right to access file %v: ", file)
   }

    // in case we need to make a cleanup after error

   result, ^err.Err := someAction() {
       err.Type = PermissionError
       err.Message = fmt.SPrintf("some action has no right to access file %v: ", file)
       file.Close()
   }

   // another variant with different symbol and return statement

   result, ?err.Err := someAction() {
       err.Type = PermissionError
       err.Message = fmt.SPrintf("some action has no right to access file %v: ", file)
       return err
   }

   // using original approach

   result, err.Err := someAction()
   if err != nil {
       err.Type = PermissionError
       err.Message = fmt.SPrintf("some action has no right to access file %v: ", file)
       return err
   }
}

func main() {
    err := VeryLongFunc()
    if err != nil {
        e := err.(MyError)
        log.Print(e.Error(), " in ", e.Dir)
    }
}

^ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреНрд░реБрдЯрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА "someAction () {}" рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
{ } рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рдмрд┐рдирд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

"рд╕рд╛рд╡рдзрд╛рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди" рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдЕрдкрдиреЗ рдЖрдордВрддреНрд░рдг рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╕рдВрд╕рд╛рдзрди рдЬреЛрдбрд╝рдирд╛:

рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд┐рддрдирд╛ рдХрдард┐рди рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдкрдВрдХреНрддрд┐ рдпрджрд┐ рдХрдерди рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рд╢рд╛рдпрдж?

blah, err := doSomething()
if err != nil: return err

...рдпрд╛ рдФрд░ рднреА...

blah, err := doSomething()
if err != nil: return &BlahError{"Something",err}

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЙрдард╛ рд▓рд┐рдпрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдХрдИ, рдХрдИ рдкреЛрд╕реНрдЯ рд╣реИрдВ рдФрд░ рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рдкрдврд╝рд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рднреА рдХреЛ рдирд╣реАрдВред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╣рд┐рдд рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдореИрдВ рд░реЗрд▓рд╡реЗ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЕрдореГрдд рдХреЗ with рдХрдерди рд╕реЗ рдЖрдпрд╛ рд╣реИред
else рдмреНрд▓реЙрдХ рдПрдХ рдмрд╛рд░ e == nil рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдБ рдЫрджреНрдо рдХреЛрдб рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдЧреЗ рд╣реИ:

func Chdir(dir string) (e error) {
    with e == nil {
            e = syscall.Chdir(dir)
            e, val := foo()
            val = val + 1
            // something else
       } else {
           printf("e is not nil")
           return
       }
       return nil
}

@ardhitama рдпрд╣ рдирд╣реАрдВ рд╣реИ рддреЛ "рдХреЗ рд╕рд╛рде" рдХреЛ рдЫреЛрдбрд╝рдХрд░ "рдХреЛрд╢рд┐рд╢" рдХрдерди рдХреА рддрд░рд╣ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ "рдЕрдиреНрдп" "рдкрдХрдбрд╝" рдХреА рддрд░рд╣ рд╣реИ?
рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реА # рдЬреИрд╕реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ?
рдЕрднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рд╡реЗ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХрдИ рдмрд╛рд░ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдЬреЛ рдорд┐рд▓рддрд╛ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп рдмрдпрд╛рди рдЬреЛ рдХреЛрдб рдХреЛ рдмрджрд╕реВрд░рдд рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрдардиреАрдп рдирд╣реАрдВ (рдмрд╣реБрдд рд╢реЛрд░)ред рдХреНрдпрд╛ рдпрд╣реА рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдЗ рдХреИрдЪ рдЕрдВрдд рдореЗрдВ рдХрдерди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЧреЛ рд▓реЗрдЦрдХ "рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ" рдЬрд┐рджреНрджреА рди рд╣реЛрдВ !! рдФрд░ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдмрд╕ "рдЖрдЦрд┐рд░рдХрд╛рд░ рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ" рдХрдерди рдкреЗрд╢ рдХрд░реЗрдВред рд╢реБрдХреНрд░рд┐рдпрд╛ред

@KamyarM
рдЖрдк рдЧреЛ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдкреНрд░рдмрдВрдзрди рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред
рдЧреЛ рдореЗрдВ try{} catch{} рдкреЗрд╢ рдХрд░рдирд╛ C рдореЗрдВ try{} catch{} рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ - рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЧрд▓рдд рд╣реИ ред

@ianlancetaylor
рдЧреЛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ gofmt рдЯреВрд▓ рдХреЛ рдмрджрд▓реЗрдВ?

err := syscall.Chdir(dir)
    if err != nil {return &PathError{"chdir", dir, err}}
err = syscall.Chdir(dir2)
    if err != nil {return err}

рдпрд╣ рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрдд рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЧреЛрдЯреЛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕реЗ рд╕рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗ рдЖрдкрдХреЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ рдХреЙрд▓ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЧрдВрднреАрд░ рдЧреИрд░-рд╢реИрдХреНрд╖рдгрд┐рдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд╛рд░ рдпрд╛ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ ... рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реИред

@KamyarM рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдЧреЛ рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред

рдХреНрдпреЛрдВ?

  1. with рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЕрдВрджрд░ рдХреЗ рднрд╛рд╡ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд░рд╛рджрд╛ рдмреНрд▓реЙрдХ рд╡рд░реНрд░реНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рд╣реИред
  2. with рдЕрдВрджрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ try рдФрд░ catch рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдзреАрдорд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЗрд╕реЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ with рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  3. рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЗрд░рд╛рджрд╛ рдЕрддреНрдпрдзрд┐рдХ if s рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реИ рдФрд░ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣реИрдВрдбрд▓рд░ рд╣рдореЗрд╢рд╛ рд╕реНрдерд╛рдиреАрдп рд╣реЛрдЧрд╛ ( with рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ else рдмреНрд▓реЙрдХ)ред
  4. throw рдХрд╛рд░рдг рд╕реНрдЯреИрдХ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

рдкреБрдирд╢реНрдЪ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВред

@рдЕрд░реНрдзрд┐рддрд╛рдорд╛
KamyarM рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╕рд╣реА рд╣реИ рдХрд┐ рдХрдерди рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд╕реВрд░рдд рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕реНрддрд░ рднреА рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рднреА рдирд╣реАрдВред рдпрд╣ рдХреЛрд╢рд┐рд╢ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде , рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдХреЗ

@gladkikhartem
рд╣рд╛рдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп "рд░реЗрд▓рд╡реЗ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЦреЛрдЬрдХрд░реНрддрд╛ рдХреЛ рди рд╣рдЯрд╛рдПрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдХреЛрдг рд╣реИ, рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП if err != nil рд▓рд┐рдЦрдиреЗ рдирд╣реАрдВ рджреЗрдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

with рди рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@gladkikhartem
рдореБрдЭреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рджреЗрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Try Catch Finally рдмреНрд▓реЙрдХ рд╕реБрдВрджрд░ рд╣реИред If err!=nil ... рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрд╕реВрд░рдд рдХреЛрдб рд╣реИред

рдЧреЛ рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╣реИред рдФрд░ рднреА рдмрд╣реБрдд рд╕реА рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВред рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЧреЛ рд╕рдореБрджрд╛рдп рдореЗрдВ рдХрдИ рд▓реЛрдЧ рдЗрд╕реЗ рдЕрдкрдиреЗ рдзрд░реНрдо рдХреА рддрд░рд╣ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рдпреЗ рдЧрд▓рдд рд╣реИред

@gladkikhartem

рдореИрдВ рдареАрдХ рд╣реВрдВ рдЕрдЧрд░ рдЧреЛ рд▓реЗрдЦрдХ рдЗрд╕реЗ рдЧреЛ ++ рдпрд╛ рдЧреЛ # рдпрд╛ рдЧреЛрдЬрд╛рд╡рд╛ рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ Try Catch Finally рд╣реИрдВ;)

@KamyarM

рдХрд┐рд╕реА рднреА рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдмрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдорд╣рддреНрд╡рдкреВрд░реНрдг -ред рдЬрдм рд▓реЛрдЧ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд░реНрде рд╣реЛрддрд╛ рд╣реИ _рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди_, рдЬрд┐рд╕реЗ рд╡реЗ _рддрд░реНрдХреЛрдВ_ рдХреЗ рд╕рд╛рде рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЙрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рддрдХ рдкрд╣реБрдВрдЪрд╛рддреЗ рд╣реИрдВред

_рдмрд╕ рдЕрдкрдирд╛ рджрд┐рдорд╛рдЧ рдЦреЛрд▓реЛ рдпрд╛рд░!_ рдЕрдкреАрд▓ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдирд╣реАрдВ рд╣реИред рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкреНрд░рд╛рдЪреАрди рдФрд░ рдХреНрд▓рдВрдХреА рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ _рдирдпрд╛ рдФрд░ рдмреЗрд╣рддрд░_ рд╣реИред

рдРрд╕реЗ рдХрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдЪрд░реНрдЪрд╛рдПрдВ рднреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдЧреЛ рд╕рдореБрджрд╛рдп рдкрд┐рдЫрд▓реА рдЧрд▓рддрд┐рдпреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдЬрдм рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИред рдпрд╣ рдЧреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдФрд░ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдРрд╕рд╛ рдХрд╣рддрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рд╕реЗ рдмрд╛рдд рдХреА рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рднреА рдХреА рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЧреЛ рд╕рдореБрджрд╛рдп рдореЗрдВ рдХрдИ рд▓реЛрдЧ рдЗрд╕реЗ рдЕрдкрдиреЗ рдзрд░реНрдо рдХреА рддрд░рд╣ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред

рдЧреЛ рдЕрдХрд╛рджрдорд┐рдХ рд╢реЛрдз рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ; рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреАред

Microsoft рдХреЗ C# рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдкреНрд░рдореБрдЦ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдХрд┐ _exceptions_ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреБрд░рд╛ рддрд░реАрдХрд╛ рд╣реИ, рдЬрдмрдХрд┐ Go/Rust рдореЙрдбрд▓ рдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдорд╣рддреНрд╡ рджреЗрддреЗ рд╣реБрдП: http://joeduffyblog.com/2016/02/07/the-error-model/

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЧреЛ рдХреЗ рддреНрд░реБрдЯрд┐ рдореЙрдбрд▓ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рджреЛрдВ рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдЕрдкрдирд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреБрдЫ рд╕рдВрджрд┐рдЧреНрдз рд▓рд╛рднреЛрдВ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЬрдЯрд┐рд▓ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

@ рдбреЙ-рднрдпрд╛рдирдХ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХрд╣реАрдВ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдПрдХ рдЕрдХрд╛рджрдорд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ GoLang рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реЛред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдкрдиреА рдмрд╛рдд рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

func Execute() error {
    err := Operation1()
    if err!=nil{
        return err
    }

    err = Operation2()
    if err!=nil{
        return err
    }

    err = Operation3()
    if err!=nil{
        return err
    }

    err = Operation4()
    return err
}

рдЗрд╕ рддрд░рд╣ рд╕реА # рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ:

         public void Execute()
        {

            try
            {
                Operation1();
            }
            catch (Exception)
            {
                throw;
            }
            try
            {
                Operation2();
            }
            catch (Exception)
            {
                throw;
            }
            try
            {
                Operation3();
            }
            catch (Exception)
            {
                throw;
            }
            try
            {
                Operation4();
            }
            catch (Exception)
            {
                throw;
            }
        }

рдХреНрдпрд╛ рдпрд╣ рд╕реА # рдореЗрдВ рдЕрдкрд╡рд╛рдж рдкреНрд░рдмрдВрдзрди рдХрд╛ рдПрдХ рднрдпрд╛рдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ? рдореЗрд░рд╛ рдЬрд╡рд╛рдм рд╣реИ рд╣рд╛рдБ, рдореИрдВ рддреБрдореНрд╣рд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛! рдЧреЛ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдФрд░ рдХреЛрдИ рдЪрд╛рд░рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣ рднрдпрд╛рдирдХ рд╡рд┐рдХрд▓реНрдк рдпрд╛ рд░рд╛рдЬрдорд╛рд░реНрдЧ рд╣реИред GO рдореЗрдВ рдРрд╕рд╛ рд╣реА рд╣реИ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рд▓реЗрдЦ рдореЗрдВ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдИ рднреА рднрд╛рд╖рд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЧреЛ рдХреА рддрд░рд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреЛ рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд░рд╛рдВрддрд┐рдХрд╛рд░реА рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЗрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд╣реИрдВред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЬреАрдУ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЧреИрд░ рдЕрдиреБрд╢рдВрд╕рд┐рдд Panic, Recover , Defer рдЬреЛ рдХрд┐ Try Catch Finally рдХреЗ рд╕рдорд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рдореЗрдВ Try Catch Finally рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдкрд╡рд╛рдж рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдмрд╣реБрдд рд╕рд╛рдл рдФрд░ рдмреЗрд╣рддрд░ рд╕рдВрдЧрдард┐рдд рддрд░реАрдХрд╛ рд╣реИред

@рдбреЙ-рднрдпрд╛рдирдХ

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рднреА рджреЗрдЦреЗрдВ:
https://github.com/manuCorp/try

@ рдХрд╛рдордпрд╛рд░рдПрдо , рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рдЧреЛ рдПрдХ рдЕрдХрд╛рджрдорд┐рдХ рднрд╛рд╖рд╛ рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЕрдХрд╛рджрдорд┐рдХ рд╢реЛрдз рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рди рд╣реА рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЧреЛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпреЛрдЬрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкреНрд░рддрд┐рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ manucorporat/try рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдореЗрдВ try/catch рдЬреЛрдбрд╝рдиреЗ рдХреА рд▓рд╛рдЧрдд (рдкреНрд░рджрд░реНрд╢рди, рднрд╛рд╖рд╛ рдЬрдЯрд┐рд▓рддрд╛, рдЖрджрд┐) рд╕реНрд╡рдпрдВ рдЯреНрд░реЗрдбрдСрдлрд╝ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

@KamyarM
рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИрдВред рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ

    err := Operation1()
    if err!=nil {
        return err
    }
    err = Operation2()
    if err!=nil{
        return err
    }
    err = Operation3()
    if err!=nil{
        return err
    }
    return Operation4()

рд╣реЛрдЧрд╛

            Operation1();
            Operation2();
            Operation3();
            Operation4();

рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд▓рдЧрддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ
рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдореЗрдВ рд╣реБрдИ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред
рдЧреЛ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдорддреМрд░ рдкрд░ 50% рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИред

         err := Operation1()
    if err!=nil {
        log.Print("input error", err)
                fmt.Fprintf(w,"invalid input")
        w.WriteHeader(http.StatusBadRequest)
        return
    }
    err = Operation2()
    if err!=nil{
        log.Print("controller error", err)
                fmt.Fprintf(w,"operation has no meaning in this context")
        w.WriteHeader(http.StatusBadRequest)
        return
    }
    err = Operation3()
    if err!=nil{
        log.Print("database error", err)
                fmt.Fprintf(w,"unable to access database, try again later")
        w.WriteHeader(http.StatusServiceUnavailable)
        return
    }

рдФрд░ рдЕрдЧрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЗрддрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рддреЛ рдореБрдЭреЗ 100% рдпрдХреАрди рд╣реИ рдХрд┐ рд╡реЗ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдПрдХреЗрдбреЗрдорд┐рдпрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рд╕реЗ рд╕реАрдЦреЗ рдЧрдП рдкрд╛рдареЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдпрджрд┐ рд▓рдХреНрд╖реНрдп рдПрдХ рдЦрд░рд╛рдм рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рдЧрд▓рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ invalid HTTP header рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП рдЬрдм рдореЗрд░реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рд╡рд┐рдХреГрдд JSON request body , рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЬрд╛рджреБрдИ рдЖрдЧ-рдФрд░-рднреВрд▓ рдмрдЯрди рд╣реИ рдЬреЛ рд╕реА ++ рдФрд░ рд╕реА # рдПрдкреАрдЖрдИ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВред

рдмрдбрд╝реЗ рдПрдкреАрдЖрдИ рдХрд╡рд░реЗрдЬ рдХреЗ рд▓рд┐рдП, рд╕рд╛рд░реНрдердХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рдХреЛрдИ рднреА рдЕрдЪреНрдЫрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди 50% рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИ, рдФрд░ рдРрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ 90% рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдг рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред

@gladkikhartem

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╕реА # рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 4 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ рдФрд░ рд╕реБрдЦрдж рдирд┐рд╖реНрдкрд╛рджрди рдкрде рджрд┐рдЦрд╛рддреА рд╣реИрдВред рдЗрд╕рдореЗрдВ рд╡реЗ if err!=nil рд╢реЛрд░ рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЙрди рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ Try Catch Finally рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рд╡рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреЙрд▓рд░ рдпрд╛ рдХреЙрд▓рд░ рдХрд╛ рдХреЙрд▓рд░ рдпрд╛ рдХреЙрд▓рд░ рдХреЗ рдХреЙрд▓рд░ рдХрд╛ рдХреЙрд▓рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) ... рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдЬреЛ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рднреА рдЕрдирд╣реЗрд▓реНрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВред)

err := Operation1()
    if err!=nil {
        log.Print("input error", err)
                fmt.Fprintf(w,"invalid input")
        w.WriteHeader(http.StatusBadRequest)
        return
    }
    err = Operation2()
    if err!=nil{
        log.Print("controller error", err)
                fmt.Fprintf(w,"operation has no meaning in this context")
        w.WriteHeader(http.StatusBadRequest)
        return
    }
    err = Operation3()
    if err!=nil{
        log.Print("database error", err)
                fmt.Fprintf(w,"unable to access database, try again later")
        w.WriteHeader(http.StatusServiceUnavailable)
        return
    }

рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╕рд╛рде рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рддреНрд░реБрдЯрд┐, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреНрд░реБрдЯрд┐ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рд▓реАрдХ рдХрд┐рдП рдмрд┐рдирд╛, рдЬрд┐рдирдХреЗ рдЗрд░рд╛рджреЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ HTTP рдХреЛрдбред

func Chdir(dir string) error {
    if e := syscall.Chdir(dir); e != nil {
        return &PathError{"chdir", dir, e}
    }
    return nil
}

рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВ

func Chdir(dir string) error {
    return  syscall.Chdir(dir) ? &PathError{"chdir", dir, err}:nil;
}
func Chdir(dir string) error {
    return  syscall.Chdir(dir) ? &PathError{"chdir", dir, err};
}



md5-9bcd2745464e8d9597cba6d80c3dcf40



```go
func Chdir(dir string) error {
    n , _ := syscall.Chdir(dir):
               // something to do
               fmt.Println(n)
}

рдЙрди рд╕рднреА рдореЗрдВ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдЬрд╛рджреВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкреВрд░реНрд╡ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, err рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЫрджреНрдо рдХреАрд╡рд░реНрдб рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдЪрд░ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдж рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ : рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдХреНрдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╡рд╛рд▓реА рд╣реИ? рдХреНрдпрд╛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ RHS рд╕рд┐рдВрдЧрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдпрд╛ рдмреНрд▓реЙрдХ рд╣реИ?

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВ рдПрдХ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк return newPathErr("chdir", dir, syscall.Chdir(dir)) рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдпрджрд┐ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╢реВрдиреНрдп рд╣реИ рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ред :-)

IMO, "рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ" рдФрд░ "рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ" рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдЦрд╛ рд╣реИ, рд╡рд╣ #21732 рдореЗрдВ @mrkaspa рд╕реЗ рд╣реИ:

a, b, err? := f1()

рдЗрд╕ рддрдХ рдлреИрд▓рддрд╛ рд╣реИ:

if err != nil {
   return nil, errors.Wrap(err, "failed")
}

рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЗрд╕рд╕реЗ рдШрдмрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

a, b, err! := f1()

рдЗрд╕ рддрдХ рдлреИрд▓рддрд╛ рд╣реИ:

if err != nil {
   panic(errors.Wrap(err, "failed"))
}

рдпрд╣ рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛, рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рднреА рджрд░реНрдж рдмрд┐рдВрджреБрдУрдВ рдХреЛ go . рдореЗрдВ рд╕реБрдзрд╛рд░ рджреЗрдЧрд╛

рдпрд╣ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреБрдлрд┐рдпреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреИрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдареАрдХ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдж? рд╕рдВрд╢реЛрдзрдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ рдФрд░ ! рд╕рдВрд╢реЛрдзрдХ рдЙрди рдЬрдЧрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдХреБрдЫ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдЬреИрд╕реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдореБрдЦрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдиреЗ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред

рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕...

func foo() (int, int, error) {
    a, b, err? := f1()
    return a, b, nil
}
func bar() (int, error) {
    a, b, err? := foo()
    return a+b, nil
}

рдпрджрд┐ foo рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ bar рдХреА рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░, рддреНрд░реБрдЯрд┐ рдХреЛ рдмрд┐рдирд╛ рдХреЛрдИ рдЕрд░реНрде рдЬреЛрдбрд╝реЗ, рдЙрд╕реА рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рджреЛрдЧреБрдирд╛ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо, рдореБрдЭреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ errors.Wrap рднрд╛рдЧ рдкрд░ рдЖрдкрддреНрддрд┐ рд╣реЛрдЧреАред

рд▓реЗрдХрд┐рди рдЖрдЧреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕рдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?

func baz() (a, b int, err error) {
  a = 1
  b = 2
  a, b, err? = f1()
  return

рдХреНрдпрд╛ a рдФрд░ b рдлрд┐рд░ рд╕реЗ рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд╡рд╣ рдЬрд╛рджреВ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рд╡реЗ рдкрд╣рд▓реЗ рджрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ? (рдореБрдЭреЗ рдирд╛рдорд┐рдд рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред)

@ dup2X рд╣рд╛рдБ рднрд╛рд╖рд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

@ object88 рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ

рд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджреЗрд╢ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рде рдЪреЗрди рдПрд░рд░ рдХрд░рдирд╛ рдареАрдХ рд░рд╣реЗрдЧрд╛ред рдЬреИрд╕реЗ рдЬрдм рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдЕрдкрд╡рд╛рдж рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдВрджрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред

рд╕рдореНрдорд╛рди рд╕реЗ, рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ, @crekerред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдЧреИрд░-рд╢реВрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЗ рдЧреЛ рд╕реНрдЯрдбрд▓рд┐рдм рдореЗрдВ рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ bufio.Reader рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХрдИ рдлрд╝рдВрдХреНрд╢рдиред рд╣рдо рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ / рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ; рдЧреИрд░-рд╢реВрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдкреНрд░рдмрд▓ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдПрдХ рд╢реВрдиреНрдп рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЖрдк рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рди рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рддрд░рдл рд░рдЦрддреЗ рд╣реБрдП, рдЖрдЗрдП рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рджреЗрдЦреЗрдВред ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ error рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЗрд╕реЗ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдпрд╛ рд░рд┐рдЯрд░реНрди рддрд░реНрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рдЗрд╕реЗ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди/рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ? рдХреНрдпрд╛ ? рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рд╣реИ?

@erwbgy
рдпрджрд┐ рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рдХреЗ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рднреА рдЕрдирдЪрд╛рд╣реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ "рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп рд╡рд╛рдкрд╕реА ..." рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд▓рд╛рдЬ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

func doStuff() error {
    doAnotherStuff() // returns error
}

func doStuff() error {
    res := doAnotherStuff() // returns string, error
}

рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рдЧрд▓реЛрдВ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рддреАрдХред

@ рд╡рд╕реНрддреБ88
рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐-рд░реИрдкрд┐рдВрдЧ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рдореБрдЦ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ - рдХреЛрдб рдмрд╣реБрдд рдШрдирд╛ рдФрд░ рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдХреЛрдб рдКрдВрдЪрд╛рдИ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХреЛрдб рдЪреМрдбрд╝рд╛рдИ рдмрд▓рд┐рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд░реИрдкрд┐рдВрдЧ рдПрд░рд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдЧрд░ рдЧрд▓рддреА! = nil рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдПрд░рд░ рд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рд╡рд╕реНрддреБ88

рдпрджрд┐ рдЖрдк рд╕рд╛рдЗрдЯ рдкрд░ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рд╢реВрдиреНрдп рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЖрдк рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рди рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдпрд╣ рд╢реВрдиреНрдп рдкрд░ рдШрдмрд░рд╛рд╣рдЯ рдЬреИрд╕реА рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╣рдЪрд╛рдиреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдкрд░ рд╕рд╛рд░реНрдердХ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рддреНрд░реБрдЯрд┐ рдкрд░ рдЪрд░ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИ рдФрд░ рд╕реВрдХреНрд╖реНрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред рдлрд┐рд░, рдЗрд╕рд╕реЗ рдХреБрдЫ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ред

@gladkikhartem рдЕрдЧрд░ рдЧрд▓рддреА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реИ! = рд╢реВрдиреНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдЕрдкрдиреЗ рд╕рдлрд▓ рдкрде рдкрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╕рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ . рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реА рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдЬреИрд╕рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреА рдХрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╣реИред рд▓реЛрдЧ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рднреА рд╕рд╣рд╛рд░рд╛ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рд╕рдм рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗ рдареАрдХ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдореЗрдВ рддрд░реНрдХ рдмрд╣реБрдд рдШрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддрд░реНрдХ рд╣реИред рдЖрдкрдХреЗ рдХреЛрдб рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдк рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣реА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдЬреЛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рд▓рд╛рдЗрдиреЛрдВ рдФрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рд╣реИред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рди рдХрд┐ рднрд╛рд╖рд╛ред

рдпрд╣ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рджреЛрдмрд╛рд░рд╛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:

a, b, err := Frob("one string"); if err != nil { return a, b, fmt.Errorf("couldn't frob: %v", err) }
// continue doing stuff with a and b

рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡, рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрдИ рдЕрдиреНрдп, рдЙрди 100 рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ gofmt рдХреЛ рд▓рд╛рдЗрдирдмреНрд░реЗрдХ рдЬреЛрдбрд╝рдиреЗ рдФрд░ 3 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЛ рдкреБрди: рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВред

рддреЛ рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рдмреНрд▓реЙрдХ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gofmt рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдКрдкрд░ рдХреА рд░реЗрдЦрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдЫреЛрдЯрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо (рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ) рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ 69 рд╡рд░реНрдг рдмрдЪреЗ рд╣реЛрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ, 49 рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИрдВ, рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп, рдФрд░ рдПрд░рд░ рд░реИрдкрд┐рдВрдЧ, рдФрд░ рдореБрдЭреЗ рдЙрд╕ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ (рдХрд╣рддреЗ рд╣реИрдВ, рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдХрд░, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

рддрд╛рдХрд┐ ; if err != nil { _ } рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдвреВрдВрдврдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдП рдЬрд╣рд╛рдВ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЛрдб рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ err рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдпрд╣ рд╢реВрдиреНрдп рддреБрд▓рдирд╛ рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рдЕрджреГрд╢реНрдп рдмрдирд╛ рджреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо ; if _ != nil { _ } рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдХреЗ рд╕рд╛рде рдЖ рдЧрдП рд╣реИрдВред

рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рд╣реА рдЪрд░рд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдХреЛ рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рдЪрд░рд┐рддреНрд░ рдХреБрдЫ рднреА рд╣реЛред рдХреЛрдб рдХреА рд▓рд╛рдЗрди рддрдм рд╣реЛрдЧреА:

a, b, err := Frob("one string") ┬з err return a, b, fmt.Errorf("couldn't frob: %v", err)

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдк рдореМрдЬреВрджрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рд░рд┐рдЯрд░реНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛, рдпрд╛ рдЕрджреГрд╢реНрдп рдЬрд╛рджреВ рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрд╕рд╕реЗ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдЕрднреА рднреА рдХреБрдЫ рдЬрд╛рджреВ рд╣реИ, рдЗрд╕ рддрдереНрдп рдореЗрдВ рдХрд┐ рд╣рдо рдЧрд▓рддреА рдХреА рддреБрд▓рдирд╛ рд╢реВрдиреНрдп рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред)

рдпрд╣ 88 рд╡рд░реНрдг рд╣реИрдВ, рдЬреЛ 100 рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рдХреБрд▓ 12 рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред

рддреЛ рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рд╣реИ: рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, рдЬрдм рд▓реЛрдЧ рдЧреЛ рдХреЗ if err != nil рдмреНрд▓реЙрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ, "рдХрд╛рд╢ рд╣рдо рдЙрд╕ рдмрдХрд╡рд╛рд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ", 80-90% рд╡реЗ рдЬрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ _stuff рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╣реИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП_ред рдЧреЛ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдХрд╛рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдУрд╡рд░рд╣реЗрдб рдиреНрдпреВрдирддрдо рд╣реИред

@lpar , рдЖрдк рдЕрдзрд┐рдХрддрд░ рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдореИрдВ рдЖрдкрдХреЗ рддрд░реНрдХ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рддреНрд░реБрдЯрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЛ рджрд╛рдИрдВ рдУрд░ рд░рдЦрдиреЗ рдХреА рджреГрд╢реНрдп рдЕрдкреАрд▓ рдХреЛ рдЫреВрдЯ рджреЗрддреЗ рд╣реИрдВ:

a, b := Frob("one string")  ┬з err { return ... }

рдПрдХ рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ рдЬреЛ рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдорд╛рддреНрд░ рдХрдореА рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

@lpar рдпрджрд┐ рдЖрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреЗрдХрд╛рд░ fmt.Errorf рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдФрд░ рднреА рдЕрдзрд┐рдХ рд╡рд░реНрдг рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╡рд╛рдкрд╕реА рдмрджрд▓реЗрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреЗрд╢ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рд╣реЛ рдФрд░ рдХреЗрд╡рд▓ рдорд╣рд┐рдорд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рди рд╣реЛред рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЫреЛрдбрд╝ рджреЗрдЧрд╛

a, b, err? := Frob("one string")

рдореЗрд░реЗ рд▓рд┐рдП рдЧреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрджрд░реНрдн рдХреА рдХрдореА рдереАред рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдФрд░ рд░реИрдкрд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣рд╛рдВ рд╣реБрдИ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ github.com/pkg/errors рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП рдЬрд░реВрд░реА рд╣реЛ рдЧрдпрд╛ред рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдореБрдЭреЗ рдЧреЛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕рд╛рджрдЧреА рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд╛рдн рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдХрдбрд╝ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рд╕рдЯреАрдХ рд╕реНрдерд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдФрд░, рднрд▓реЗ рд╣реА рд╣рдо рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╡реИрд╕реЗ рд╣реА рд▓реЗрдВ, рдпрд╣ рддрдереНрдп рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рджрд╛рдИрдВ рдУрд░ рд╣реИ, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрдардиреАрдпрддрд╛ рдЙрдиреНрдирдпрди рд╣реИред рдХреЛрдб рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд░реНрде рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдм рдЖрдкрдХреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдорд╣рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрдврд╝рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдХреЗрд╡рд▓ рд╕рдлрд▓ рдкрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЬрдм рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдвреВрдВрдвреВрдВрдЧрд╛ред рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рдЙрдирдХреЗ рд╕реНрд╡рднрд╛рд╡ рд╕реЗ, рдЕрд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рд╣реИрдВ рдФрд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрдо рд╕реНрдерд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЪрд╛рд╣реЗ рдХреЗ рд╕рд╡рд╛рд▓ рд▓рдЧрддрд╛ рд╣реИ fmt.Errorf рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдмреЗрдХрд╛рд░" рд╣реИ errors.Wrap , рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдУрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реЗ рджреЛрдиреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рд╢рдмреНрджред (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдореИрдВ рдпрд╛ рддреЛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рдореИрдВ рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рдФрд░ рдХреЛрдб рдХреА рд░реЗрдЦрд╛ рдХреЛ рднреА рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдпрд╣ рд╣реБрдЖред)

рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рджрд╛рдИрдВ рдУрд░ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдмрд╕ рдЗрддрдирд╛ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдкрд░реНрд▓ рдФрд░ рд░реВрдмреА рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рднреА рдЖ рд░рд╣рд╛ рд╣реВрдВред

@lpar рдореИрдВ errors.Wrap рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ - рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрди рд╕рднреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЙрд╕ рдЬрдЧрд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реБрдЖ рдерд╛ рдФрд░, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреМрди рд╕реЗ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред рдЖрдк рдпрд╣ рднреА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╕рдорд╛рди рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рдЕрдкрдиреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рд▓реЙрдЧ рд▓рд╛рдЗрдиред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реБрдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣реА рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ)ред

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╣реЛрдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЬрдЧрд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рднрд░реЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рддрд░реНрдХ рдХреЛ рдирд╣реАрдВ рдЦрд░реАрджрддрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЗрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдХрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЙрддрдиреА рд╣реА рдЬрдЧрд╣ рд▓реЗрдВ рдЬрд┐рддрдирд╛ рд╡реЗ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рджреВрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рд╡реЗ рдореБрдЦреНрдп рдХрд╣рд╛рдиреА рдирд╣реАрдВ рд╣реИрдВред

@ рдХреНрд░реЗрдХрд░

рдЦрд░рд╛рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдПрдХ рддреБрдЪреНрдЫ рдбреЗрд╡рд▓рдкрд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд▓рд╛рдЗрди рдирдВрдмрд░ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдкрде рддреНрд░реБрдЯрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрднреА рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИред

@as рдпрд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдФрд░ рдЕрдкрд╡рд╛рдж рд╕рдВрджреЗрд╢ рдЙрд╕ рдЬрдЧрд╣ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдХрдо рд╕реЗ рдХрдо рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереАред рдЕрдкрд╡рд╛рдж рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рд▓рд╛рдн рджреЗрддреЗ рд╣реИрдВред рдЧреЛ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЪреЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдареАрдХ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЖрдк рд▓рд╛рдЗрди рдирдВрдмрд░ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдкрде рд╕реЗ рд╕рдЯреАрдХ рдХрд╛рд░рдг рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдПрдЧреАред рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреИрдпрд╛рд░реА рдореЗрдВ рдХреБрдЫ рдХреЛрдб рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рддреЛ рд╣рд╛рдБ, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЖрдкрдХреЛ рдХрд╛рд░рдг рдирд╣реАрдВ рджреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдЦреЛрдЬ рд╕реНрдерд╛рди рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрдЧрд╛ред

@рдЬреИрд╕рд╛

рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдЙрддреНрдкрд╛рджрди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреЛрдб рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╣реЛрддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдиреАрдЪреЗ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рджреВрд╕рд░реА рд╕реЗрд╡рд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрддреА рд╣реИ), рдФрд░ рдЙрдЪрд┐рдд рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдЙрддреНрдкрд╛рджрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп рдЬрд╛рд╡рд╛ рд╕реНрдЯреИрдХ рдирд┐рд╢рд╛рди рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ, рд╕рдВрджреЗрд╢ рдирд╣реАрдВред

@ рдХреНрд░реЗрдХрд░
рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдорд╛рди рд╣реИрдВ , рдФрд░ рд╡реЗ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рд╡реЗ "рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд" рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рдереЗред
рдпрджрд┐ рдЖрдк рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рджреА - рдкрд░реАрдХреНрд╖рдг, рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ...

@gladkikhartem рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, рдЖрдк рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдХреЗ рдЬреЛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реБрдЖ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реБрдЖ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдЦрд░рд╛рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдЖрдорддреМрд░ рдкрд░ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рджреЗрдЦрдХрд░ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдлрд╝реЛрдХреЙрд▓ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реИ рдпрджрд┐ рдЖрдк рд╡рд╛рдпрд░ рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬрд╝ рдХреЛ рдареАрдХ рд╕реЗ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореБрдЭреЗ рдЕрдм рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдпрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реЛрддреА рд╣реИред рд╡реЗ рдЦреЛрдЬ рд╕реНрдерд╛рди рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдмрд╛рдд рдХреА рд╡рдХрд╛рд▓рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЙрдЪрд┐рдд рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рд░рд▓рддрд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рд╡рд╣ рдЬрд╛рд╡рд╛ рддрд░реНрдХ рд╣реИ - рд╕рднреА рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧреБрдорд░рд╛рд╣ рд╣реИ; рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХрд╛ рддрдВрддреНрд░ рдХрд╛рдлреА рд╣рдж рддрдХ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЬрдм рдореИрдВ рдХреЛрдб рджреЗрдЦ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реВрдВ, рддреЛ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдХреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЙрддрдирд╛ рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЬрдм рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред

рдХреЛрдИ рдпрд╣ рддрд░реНрдХ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИред рдЖрдЗрдП рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ рдХрд┐ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдЬрд╣рд╛рдВ рд╕рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реИред рдЗрд╕реЗ "рдХрд╛рдлреА рд╣рдж рддрдХ рд╡рд┐рдлрд▓" рдХрд╣рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рд░рд╛рдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЧреЛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрд╕ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдЧрд╛ред рдЧреЛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдмрд╕ рдЕрд▓рдЧ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@creker рдореИрдВрдиреЗ рдПрдХ рд╣реА рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ

рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐, рдореИрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рджрд┐рди рдПрдХ рдЪрд░-рдЧреБрдгрд╡рддреНрддрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкрд╛рда (рдЬрд┐рд╕рдореЗрдВ рдЙрд╕ рдкрд▓ рдореЗрдВ рдФрд░ рдЙрд╕ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реИ) рдХреЛ рджреЗ рджреВрдВрдЧрд╛ред рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЯреЗрдХреНрд╕реНрдЯ ( fmt.Errorf рдпрд╛ errors.New ) рдХреЗ рд╕рд╛рде рдЖрдк рдХреЙрд▓ рд╕реНрдЯреИрдХ/рдмреИрдХрдЯреНрд░реЗрд╕ рдкрдврд╝рддреЗ рд╕рдордп рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдЦреЛрдЬрддреЗ рд╣реИрдВ (рдЬреЛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдирдлрд░рдд рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╕реМрдВрджрд░реНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдирд╣реАрдВ) рдлрд╝рд╛рдЗрд▓/рд▓рд╛рдЗрди рдирдВрдмрд░ ( errors.Wrap рдФрд░ рдЗрд╕реА рддрд░рд╣) рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рджреЗрдЦрдиреЗ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реИрд▓рд┐рдпреЛрдВ, рд▓реЗрдХрд┐рди рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рд╣реА рд╣реИ: рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЙрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреНрдпрд╛ рд╣реБрдЖред

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░, рдЕрдВрдХ #19991 рд╢рд╛рдпрдж рдЕрд░реНрдердкреВрд░реНрдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рджреВрд╕рд░реА рд╢реИрд▓реА рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдз рд╕рд╛рд░рд╛рдВрд╢ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред

рд╕рднреА рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рдХрд╣реАрдВ рдФрд░ рд▓реЗ рдЬрд╛рдПрдВ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ

@lpar , рдпрджрд┐ рдЖрдк рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдмрд╛рдд рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рд╣реИрдВ: рдлрд╝реБрдЯрдиреЛрдЯреНрд╕/рдПрдВрдбрдиреЛрдЯреНрд╕ (рдЬрд╛рд╡рд╛) рдФрд░ рд╕рд╛рдЗрдб-рдиреЛрдЯреНрд╕ (рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡) рдХреЗ рдмреАрдЪ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред рд╕рд╛рдЗрдб рдиреЛрдЯреНрд╕ рдХреЛ рд╕рдВрджрд░реНрдн рдХреА рд╣рд╛рдирд┐ рдХреЗ рдмрд┐рдирд╛, рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЖрдВрдЦ рдХреА рд╢рд┐рдлреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

@ рдЬреАрдбреАрдПрдо85

рдЖрдк рдЕрдВрдд рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд╛рда рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ

рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдФрд░ рдЬрдВрдЬреАрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рд╡реЗ рджреЛрдиреЛрдВ рдЙрд╕ рдкрде рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд▓реЗ рдЧрдпрд╛ред рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рд╡рдзрд╛рдиреА рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред рдЬрдВрдЬреАрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХреЗрд╡рд▓ рд▓рд╛рдн рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЪрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдореБрдЭреЗ рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рд┐рдП, рдЙрд╕реЗ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ред рд╡реЗ рдЕрднреА рднреА рдореВрд▓реНрдп рд╣реЛрдВрдЧреЗ, рдпрджрд┐ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рднреА рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реИред

рдЬрд░рд╛ рджреЗрдЦрд┐рдП рдХрд┐ рдЧреЛ рдЖрддрдВрдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рд╣рд░ рдЧреЛрд░реЛрдЗрди рдХрд╛ рдкреВрд░рд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдорд┐рд▓рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдмрд╛рд░ рдЗрд╕рдиреЗ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдХреБрдЫ рд╣реА рд╕рдордп рдореЗрдВ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред рдпрд╣ рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рдЪрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░реА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдбреАрдмрдЧрд░ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЬрд╛рд╡рд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬ рдХреЛ рд▓реЗрдХрд░ рдХрд▓рдВрдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд▓рд╛рддреЗред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдмреБрд░рд╛ рд╣реИред рдореИрдВ рдЬрд╛рд╡рд╛ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЙрд╕ рддрд░рд╣ рдХрд╛ рддрд░реНрдХ рдХрд┐рд╕реА рдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ, рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдПрдХ рд▓рд╛рдн рд╣реИред рдЬрд╛рд╡рд╛ рддрд░реАрдХреЗ рдиреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕рд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рдд рдкрд░ рдФрд░ рдЙрд╕рд╕реЗ рдЖрдЧреЗ рдкреНрд░рд╡рд╛рд╣ рдкрд░рдд рдкрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд▓реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рд░рдгрдиреАрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ - рд░рдирдЯрд╛рдЗрдо рдкрд░, рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдирд╣реАрдВред

рдпрд╣ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рднрд╛рд╖рд╛рдПрдВ рдЕрдкрдиреЗ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдЯреИрдХ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдХреЗ рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рдерд╛ рдЙрд╕рдХреА рд╕реНрдореГрддрд┐ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред рдЧреЛ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИрдВ; рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЗрди рдирдВрдмрд░ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХреНрдпреЛрдВ рд▓реЗ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП - рд░рдирд┐рдВрдЧ рдХреЛрдб рд╢рд╛рдпрдж рд╣реА рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИред

@рдЬреИрд╕рд╛

рдлрд┐рд░ рд╕реЗ, рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВ

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реИред рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдареАрдХ рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣реИрдВред рд╡реЗ рдЗрд╕ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдмрд▓реНрдХрд┐ рдпрд╣ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдкреЗрдХреНрд╖рд┐рдд рдФрд░ рдЖрд╕рд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдк рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреАрд╕реАрдкреА рдЯрд╛рдЗрдордЖрдЙрдЯред рдХреБрдЫ рдФрд░ рдЧрдВрднреАрд░ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рд▓реЙрдЧ рдореЗрдВ рдбрдВрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдбреАрдмрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдПрдХ рд▓рд╛рдн рд╣реИред рдЬрд╛рд╡рд╛ рддрд░реАрдХреЗ рдиреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕рд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЬрд╛рд╡рд╛ рдиреЗ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕рд┐рдЦрд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рд░рдгрдиреАрддрд┐ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рднрд╛рд╖рд╛рдПрдВ рдЕрдкрдиреЗ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдЯреИрдХ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдХреЗ рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рдЙрд╕рдХреА рд╕реНрдореГрддрд┐ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореЗрд░реЗ рд▓рд┐рдП рдирд╣реАрдВред

рдЧреЛ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИрдВ; рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЗрди рдирдВрдмрд░ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХреНрдпреЛрдВ рд▓реЗ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП - рд░рдирд┐рдВрдЧ рдХреЛрдб рд╢рд╛рдпрдж рд╣реА рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд▓рд╛рдЗрди рдирдВрдмрд░ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдЬрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд┐рдЦрд╛рдпрд╛ рд╣реИ, рд╕реА рдХреЗ рдкрд╛рд╕ __LINE__ рдФрд░ __FUNCTION__ рдмрд┐рд▓реНрдХреБрд▓ рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣реИред рдЖрдк рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдареАрдХ рдЙрд╕реА рд╕реНрдерд╛рди рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реБрдЖ рдерд╛ред рдФрд░ рдЬрдм рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХрдо рд╕реЗ рдХрдо рдЖрдкрдХреЗ рдкрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддреЛ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рдЬреЛ рдПрдХ рдЕрдкреНрд░рд╛рдкреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдерд╛ред рдЕрдЧрд░ рдЖрдкрдХреЛ рдЙрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рддреЛ рдЗрд╕реЗ рдЗрдЧреНрдиреЛрд░ рдХрд░ рджреЗрдВред рдпрд╣ рдЖрдкрдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ рдФрд░ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреЗ рд▓реЛрдЧ рдмрд╛рддрдЪреАрдд рдХреЛ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдо рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдореЗрдВ рдХреНрдпреЛрдВ рдмрджрд▓рддреЗ рд░рд╣рддреЗ рд╣реИрдВред рдпрд╣ рддреБрд▓рдирд╛ рдХреЛрдИ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдВрджрд░реНрдн рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдпрд╣ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реИред

рд▓реЗрдХрд┐рди рдореИрдВ рдЬрд┐рд╕ рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЕрднреА рднреА рдЪрд▓ рд░рд╣реА рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЧреЛ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рдФрд░ рдПрдХ рдзреАрдореА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд░ рдпрд╣ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдРрд╕рд╛ рдХрд░реЗрдВред рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдзреАрдореЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЦрд┐рд▓реМрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдирд╛рдЧрд░рд┐рдХ рдмрдирд╛рдирд╛ рдПрдХ рддрдХрдиреАрдХреА рдмреЗрдИрдорд╛рдиреА рд╣реИред

рдЕрдЧрд░ рдЖрдкрдХреЛ рдЙрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВред рдпрд╣ рдЖрдкрдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдмреНрд▓реЛрдЯ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рд╕рд░реНрд╡рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк рдЬреЛ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣ рдЕрднреА рднреА рдЖрдкрдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдереНрд░реВрдкреБрдЯ рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреВрдВрдЧрд╛ рдЬреЛ рдЯреАрд╕реАрдкреА рдЯрд╛рдЗрдордЖрдЙрдЯ рдФрд░ рд▓реЙрдЧ рдбрдВрдкрд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдкрд░ рд╣рд▓реНрдХреЗ-рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкрд╛рда рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдзреАрдореЗ рд╣реИрдВ

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рддреНрд░реБрдЯрд┐ рдкрде рдореЗрдВ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдХреЛрдИ рднреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рд╡реЗ рдХрд┐рддрдиреЗ рдзреАрдореЗ рд╣реИрдВред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рдзрд┐рдд рдерд╛ред

рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЦрд┐рд▓реМрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд

рдЕрдм рддрдХ рдореБрдЭреЗ "рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ" рдпрд╛ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднреА рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрдирд╛ рдмрд╛рдХреА рд╣реИред рджреВрд╕рд░реА рдУрд░, рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдП рдЧрдП рдкрде рдХреЛ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрддреНрдпрдВрдд рдЙрдкрдпреЛрдЧреА рд░рд╣рд╛ рд╣реИред рдФрд░ рдпрд╣ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреАрдореЗрдВ рдХреЛрдб рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рдХреЛ рднреА рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рдкреВрд░реА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рдЖрдк рдЬреЛ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣ рдЕрднреА рднреА рдЖрдкрдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдереНрд░реВрдкреБрдЯ рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд╣реАрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдЖрдкрдХрд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд▓рдЧрд╛рддрд╛рд░ рдЙрдирдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддрдм рддрдХ рдереНрд░реВрдкреБрдЯ рдПрдХ рдмрд╛рд░ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рддреНрд░реБрдЯрд┐ рдкрде рдореЗрдВ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдХреЛрдИ рднреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рд╡реЗ рдХрд┐рддрдиреЗ рдзреАрдореЗ рд╣реИрдВред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рдзрд┐рдд рдерд╛ред

рдЕрд╕рддреНрдпред

  • рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬрд╛рд░реА рд░рд╣ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдЕрднреА рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдШреЗрд░реЗ рдореЗрдВ рд╣реИред
  • рдПрдХ рд░реВрдЯреАрди рдХреЛ рдзреАрдорд╛ рдХрд░рдиреЗ рд╕реЗ рдЕрдиреНрдп рд░реВрдЯреАрди рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдХрдореА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬреЛ _are_ рдЦреБрд╢рд╣рд╛рд▓ рдкрде рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред

@ object88 рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдЖрдк рдЗрд╕реЗ рдХрд┐рддрдиреА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ? рдореИрдВ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рд╕реЛрдЪреВрдВрдЧрд╛ред рдХрдо рд╕реЗ рдХрдо рдареАрдХ рд╕реЗ рд▓рд┐рдЦрд┐рдд рдЖрд╡реЗрджрди рдореЗрдВред рдпрджрд┐ рдПрдХ рдЧреЛрд░реЛрдЗрди рд╡реНрдпрд╕реНрдд рд▓реВрдк рдореЗрдВ рд╣реИ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рднреА, рддреЛ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди IO рдмрд╛рдзреНрдп рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

@рдЬреИрд╕рд╛

рд▓реЗрдХрд┐рди рдореИрдВ рдЬрд┐рд╕ рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЕрднреА рднреА рдЪрд▓ рд░рд╣реА рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЧреЛ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рдФрд░ рдПрдХ рдзреАрдореА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдирд┐рд░рд░реНрдердХ рд╡рд╛рдХреНрдп рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд╣реА рдЧрдИ рдмрд╛рддреЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдВрдЧреЗред

рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдзреАрдореЗ рд╣реИрдВ

рдзреАрдорд╛ рд▓реЗрдХрд┐рди рдХрд┐рддрдирд╛? рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИ рдХреНрдпрд╛? рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрдИрдУ рдмрд╛рдзреНрдп рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░реЛрдВ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реИред рдЧреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЖрдкрдХреЛ рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╕реАрдкреАрдпреВ рдХреЛ рдЦрд╛ рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЦрд┐рд▓реМрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрддред

рдореИрдВ рдЕрд╕реНрддрд┐рддреНрд╡рд╣реАрди "рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ" рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд┐рд╢рд╛рди рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рд╣реА рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред рдФрд░ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдЫрд┐рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╡реИрд╕реЗ рднреА рд╕рдордп рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИред рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП macOS/iOS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВред рдЙрдиреНрд╣реЗрдВ рдкреИрдирд┐рдХ рдФрд░ рдХреНрд░реИрд╢ рдбрдВрдк рдлреЗрдВрдХрдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рдвреЗрд░ рдФрд░ рд╕рднреА рд╕реАрдкреАрдпреВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдореВрд▓реНрдп рд╣реЛрддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЗрди "рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ" рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреЗ рд╣реБрдП рди рджреЗрдЦреЗрдВред

рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдирд╛рдЧрд░рд┐рдХ рдмрдирд╛рдирд╛ рдПрдХ рддрдХрдиреАрдХреА рдмреЗрдИрдорд╛рдиреА рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдФрд░ рдЕрдзрд┐рдХ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? "рд╡рд┐рдЪрд╛рд░рд╣реАрди рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рд░рдгрдиреАрддрд┐рдпрд╛рдБ" рдЖрдкрдиреЗ рдЙрд╕реЗ рдХрд╣рд╛рдБ рджреЗрдЦрд╛?

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдмреНрд▓реЛрдЯ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рд╕рд░реНрд╡рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк рдЬреЛ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣ рдЕрднреА рднреА рдЖрдкрдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдереНрд░реВрдкреБрдЯ рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ, рдХрд┐рддрдиреЗ рд╕реЗ?

рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреВрдВрдЧрд╛ рдЬреЛ рдЯреАрд╕реАрдкреА рдЯрд╛рдЗрдордЖрдЙрдЯ рдФрд░ рд▓реЙрдЧ рдбрдВрдкрд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдкрд░ рд╣рд▓реНрдХреЗ-рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкрд╛рда рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╕ рд╕рдордп рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рд╕реЗ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЯреНрд░реЗрд╕рд┐рдВрдЧ рд╕реЗ рдХрд┐рд╕реА рднреА рдФрд░ рд╕рднреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рдлрд╛рдпрджрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЖрдо рд╕рд╣рдорддрд┐ рдХреЗ рдЗрддрдиреА рд╕рд╛рд░реА рдЕрдиреБрддреНрдкрд╛рджрдХ рдЪрд░реНрдЪрд╛рдПрдВ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

@ рд╡рд╕реНрддреБ88
рдпрджрд┐ рдЖрдк рд╕рднреА рдЧреЛрд░реЛрдЗрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдХреЛ рдЕрдиреНрдп рдЧреЛрд░реЛрдЗрди рдХреЗ рдЕрдирдмреНрд▓реЙрдХ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЧреЛрд░реЛрдЗрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ - рдпрд╣ рдЗрддрдирд╛ рдзреАрдорд╛ рдирд╣реАрдВ рд╣реИред

@ рдХреНрд░реЗрдХрд░
рдЯреНрд░реЗрд╕рд┐рдВрдЧ рд╕реЗ рд╕рднреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕реА рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреА рдЧрдИ рд╕рдВрджрд░реНрдн рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд▓рд┐рдкрдЯреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЛрд░рдЖрдЙрдЯрд┐рди рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрд░реНрдХ рд╕реНрд╡рдпрдВ рд╣реА рд╣реИред
рддрд╛рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдмрд┐рд▓реНрд▓реА рдХрд░ рд╕рдХреВрдВ *.log | grep "orderID=xxx" рдФрд░ рдЙрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐ рд╣реБрдИред
рдЧреЛ рдХреА рд╕рдорд╡рд░реНрддреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдореГрджреНрдз рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рд╣реИрдВред

@gladkikhartem рдЙрдЪрд┐рдд рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЙрд╕ рдмрд╛рддрдЪреАрдд рд╕реЗ рдирд┐рд░рд╛рд╢ рд╣реЛрдиреЗ рд▓рдЧрд╛ рдерд╛ред

рдореИрдВ рдЖрдкрдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдФрд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдлрд┐рд░ рднреА, рдореИрдВ рдЦреБрдж рдХреЛ рдХрдо рд╕реЗ рдХрдо 5 рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдвреЗрд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рддрд╛ рд╣реВрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЫреЛрдЯреЗ рдЧреЛрд░реЛрдЗрди рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЕрддреНрдпрдзрд┐рдХ рд╕рдорд╡рд░реНрддреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрдирдХреЗ рд▓рд╛рдн рдХрдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЬрд┐рд╕рд╕реЗ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред

@ рдХреНрд░реЗрдХрд░

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдЖрдк рдЗрд╕реЗ рдХрд┐рддрдиреА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ? [...], рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди IO рдмрд╛рдзреНрдп рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрдИрдУ рдмрд╛рдзреНрдп рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реИрдВред io.Reader рд░реАрдб рд╡рд┐рдзрд┐ EOF рдкрд░ рдПрдХ рд╕реНрд╡рд╕реНрде рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рддреЛ рдпрд╣ рд╣реИрдкреНрдкреА рдкрд╛рде рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

@urandom

рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЕрдиреИрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╡рд╛рди рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо
  • рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрде
  • рдмреИрдХрдПрдВрдб рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рдХрд╛рд░/рд╕рдВрд╕реНрдХрд░рдг
  • рд▓реЗрди-рджреЗрди рдкреНрд░рд╡рд╛рд╣
  • рд╡рд╕реНрддреБ рд╕рдВрд░рдЪрдирд╛
  • рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдФрд╕рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдУрд╡рд░рд╣реЗрдб рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рд╕реЗ рдЫреЛрдЯреЗ рдЧреЛ рдлрд╝рдВрдХреНрд╢рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░реЗрдЦрд╛рдВрдХрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдЗрд╕реЗ рдФрд░ рдЦрд░рд╛рдм рдХрд░ рджреЗрдЧреАред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЧреЛ рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕рд░рд▓ рдФрд░ рддреЗрдЬрд╝ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╣реЛрдирд╛ рд╣реИ, рдФрд░ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд╣реЛрдЧреАред рд╣рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдкрд░рдВрдкрд░рд╛рдЧрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рдЗрди-рд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

@ рдХреНрд░реЗрдХрд░

рдореИрдВ рдЖрдкрдХреЛ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рд╕реЗ рдмрдЪреВрдВрдЧрд╛ рдЬреЛ рдФрд░ рдЕрдзрд┐рдХ рдЕрд╕рдВрдЧрддрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдирд┐рд░рд╛рд╢ рдХрд┐рдпрд╛ред

рдореИрдВ рдПрдХ рдирдП рдХреАрд╡рд░реНрдб "рд░рд┐рдЯрд░реНрдирд┐рдл" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦреВрдВрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рддреБрд░рдВрдд рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рдпрд╣ рдЗрддрдирд╛ рд▓рдЪреАрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг 1 (рдирд╛рдорд╛рдВрдХрд┐рдд рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):

рдП, рдЧрд▓рддреА = рдХреБрдЫ (рдмреА)
рдЕрдЧрд░ рдЧрд▓рддреА!= рд╢реВрдиреНрдп {
рд╡рд╛рдкрд╕реА
}

рдмрди рдЬрд╛рдПрдЧрд╛:

рдП, рдЧрд▓рддреА = рдХреБрдЫ (рдмреА)
рд░рд┐рдЯрд░реНрди рдЕрдЧрд░ рдЧрд▓рддреА!= рд╢реВрдиреНрдп

рдЙрджрд╛рд╣рд░рдг 2 (рдирд╛рдорд╛рдВрдХрд┐рдд рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛):

рдП, рдЧрд▓рддреА: = рдХреБрдЫ (рдмреА)
рдЕрдЧрд░ рдЧрд▓рддреА!= рд╢реВрдиреНрдп {
рд╡рд╛рдкрд╕реА рдП, рддреНрд░реБрдЯрд┐
}

рдмрди рдЬрд╛рдПрдЧрд╛:

рдП, рдЧрд▓рддреА: = рдХреБрдЫ (рдмреА)
рд░рд┐рдЯрд░реНрди рдЕрдЧрд░ рдЧрд▓рдд рд╣реИ! = рд╢реВрдиреНрдп {рдП, рдЧрд▓рддреА}

рдЖрдкрдХреЗ рдирд╛рдорд┐рдд рд╡рд╛рдкрд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ ...

a, err = something(b)
returnif err != nil

@ambernardino
рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ fmt рдЯреВрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ рднрд╛рд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдирдП, рдмреЗрдХрд╛рд░ рдХреАрд╡рд░реНрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

a, err := something(b)
if err != nil { return a, err }

рдпрд╛

a, err := something(b)
    if err != nil { return a, err }

@gladkikhartem рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

a, err? := something(b)

@mrkaspa
рд╡рд┐рдЪрд╛рд░ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рдирд╛ рд╣реИред рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛрдб рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдкрдврд╝рдирд╛ рд╣реИред

@gladkikhartem рдЬрдВрдЧ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЗрд╕реЗ рдХрдо рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИ

@gladkikhartem рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ ? рдЗрд╕реЗ рдХрдо рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╢реЛрд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рдЦрддреНрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╢реЛрд░ рдХреЗ рд╕рд╛рде рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рднреА рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдпрд╛ рд░реИрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдХрд╣рд╛рдВ рдкреНрд▓рдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЙрд▓ рд╕реНрдЯреИрдХ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@mrkaspa
рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕реЗ рдХрдо рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИ, рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ? рд╣рдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рд╕рд┐рд░реНрдл рд░рд╛рдп рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@ рдХреНрд░реЗрдХрд░
'?' рдЪрд░рд┐рддреНрд░ рдкрд╛рдардХ рдкрд░ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдФрд░ рдЬрд╝рд╛рд╣рд┐рд░ рд╕реА рдмрд╛рдд рд╣реИ рдХрд┐ ? рд╕рдВрдХреЗрдд рдкрд╛рдардХ рдХреЗ рдорди рдореЗрдВ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдпрджрд┐ рдЖрдк рдЧрд▓рддреА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ! = рд╢реВрдиреНрдп рд╕рдВрдХрд▓рдХ рдЕрдкреНрд░рдпреБрдХреНрдд рддреНрд░реБрдЯрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдФрд░

a, err? := doStuff(a,b)
err? := doAnotherStuff(b,z,d,g)
a, b, err? := doVeryComplexStuff(b)

рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛

a := doStuff(a,b)
doAnotherStuff(b,z,d,g)
a, b := doVeryComplexStuff(b)

рд╡рд╣реА рдЬрд╛рджреВ, рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХрдо рд╕рд╛рдорд╛рди рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕рд╛рдорд╛рди

@gladkikhartem рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрд╛рдардХреЛрдВ рдХреЛ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣ рднрд╛рд╖рд╛ рдмрджрд▓рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рд╣рдореЗрдВ рдПрдХ рд╡реНрдпрд╛рдкрд╛рд░ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдпрд╛ рддреЛ рд╣рдо рдЖрдкрдХреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╡рд░реНрдмреЛрдЬрд╝ рдХреЗ рд╕рд╛рде рд░рд╣рддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрджрд┐рдо рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рд╣рдо рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЛ рдЫреБрдкрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдЖрджрд┐ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рджреВрд╕рд░рд╛ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдкреНрд░рддрд┐рдХреВрд▓ рд╣реИред рд╣рдо рд╕рднреА Go2 рдореБрджреНрджреЛрдВ рдХреЛ рднреА рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рджрд┐рди рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЬрд╛рджреБрдИ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЗрдВрдЬреЗрдХреНрд╢рди рдмрд┐рдВрджреБ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рдпрд╣ рдХрд┐рд╕реА рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЧрдВрдз рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╣рдо рдХреЗрд╡рд▓ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрдВрднреАрд░ рд╣реИрдВ рддреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдПрдХ рдЬрд░реВрд░реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рд╕рдВрджрд░реНрдн рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред

рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рдЬрд╛рджреВ 'рдЧрд▓рддреА' рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрджрд╕реВрд░рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рддрд░рд╣ рд╕реЗ рдмреАрдЪ рдореЗрдВ рд╣реИред рдЬреЛ рдЪреАрдЬ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рджреВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ || рдПрдХ рдирдИ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рддреЛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИ

func Chdir(dir string) error {
    syscall.Chdir(dir) || &PathError{"chdir", dir}
    return nil
}

err рдмрд╕ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рд░реИрдкрд┐рдВрдЧ рдХреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдЙрди рдЖрдВрддрд░рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Inner() error рд╕реЗ error рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреИрд╕реА рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдПрдХ рддрд░реАрдХрд╛ рд╣реИ unwrap(error) []error рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрдВрдХреНрд╢рди рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ред рдпрд╣ рдЬреЛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕рднреА рдЖрдВрддрд░рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╡реЗ рд▓рдкреЗрдЯреЗ рдЧрдП рдереЗред рдЗрд╕ рддрд░рд╣ рдЖрдк рдХрд┐рд╕реА рднреА рдЖрдВрддрд░рд┐рдХ рддреНрд░реБрдЯрд┐ рдпрд╛ рдЙрди рдкрд░ рд╕реАрдорд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрджрд┐рдЧреНрдз рд╣реИ рдХреНрдпреЛрдВрдХрд┐ error рд╕рд┐рд░реНрдл рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдХрд╕реНрдЯрдо error рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрди рд▓рд┐рдкрдЯреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рднреА рдмреЙрдХреНрд╕реЛрдВ рдкрд░ рдЯрд┐рдХ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдж рддрдХ рдЬрд╛рджреБрдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╣реБрдд рдЦрд╛рд╕ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдирд╛рдЧрд░рд┐рдХ рдХреЗ рдХрд░реАрдм рд▓рд╛рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдирд┐рдпрдорд┐рдд рдЧреЛ рдХреЛрдб рд╣реИ, рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХрд╛рдЧрдЬ рдкрд░ рдФрд░ рдЖрдХрд░реНрд╖рдХ рд╕реБрд░реНрдЦрд┐рдпрд╛рдВ рдмрдЯреЛрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдЪрд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмрд╣реБрдд рдЦрд╛рд╕ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреНрдпрд╛ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЬрд╛рдВрдЪ рдХреА рдЕрд╡рдзрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ?

рдпрджрд┐ рдпрд╣ рдмрд╛рдж рдХреА рдмрд╛рдд рд╣реИ рддреЛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХрд╛ рдЦрдВрдбрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рддреБрдЪреНрдЫрддрд╛ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╢рд░реНрдд рдмрдпрд╛рди рдФрд░ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдмрдпрд╛рди рд╣реИред рдХреБрдЫ рд▓реЛрдЧ рд▓реВрдк рдХреЗ рд▓рд┐рдП рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рд╣рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд▓реВрдк рдирд┐рд░реНрдорд╛рдг рднреА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдиреЗ рдЕрдм рддрдХ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ, рдЙрдЪреНрдЪрд╛рд░рдг рдпреЛрдЧреНрдп рдпрд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдЧреЛ рдмреИрд╢ рдирд╣реАрдВ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА "рдЬрд╛рджреВ" рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдореИрдВ рдЗрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реВрдВ, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рддрд░реНрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИрдВ рд▓реЗрдХрд┐рди "рдпрд╣ рдХреБрдЫ рдирдпрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рдЕрдкрдардиреАрдп рд╣реИ, рд╕рдм рдХреБрдЫ рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рдЫреЛрдбрд╝ рджреЗрдВ"ред

@as рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЬреЛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рдореВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ, рдЙрдЪреНрдЪрд╛рд░рдг рдпреЛрдЧреНрдп, рдпрд╛ рд╕рд░рд▓

рдХреЛрдИ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрд╢ рдХрд░реЗрдЧрд╛ рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реЛрдирд╛ "рдЕрдкрдардиреАрдп, рдЬрдЯрд┐рд▓ рдЖрджрд┐" рдЬреИрд╕рд╛ рд╣реА рд▓рдЧрддрд╛ рд╣реИред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рдирдпрд╛ рд╣реИ, рдЗрд╕реЗ рдХрдо рд╕реНрдкрд╖реНрдЯ, рдЙрдЪреНрдЪрд╛рд░рдг рдпреЛрдЧреНрдп рдпрд╛ рд╕рд░рд▓ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред "||" рддрдерд╛ "?" рдЙрджрд╛рд╣рд░рдг рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рд╣реА рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд░рд▓ рд╣реИрдВ, рдЬрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╛ рд╣рдо рд╢рд┐рдХрд╛рдпрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВ рдХрд┐ "->" рдФрд░ "<-" рдмрд╣реБрдд рдЬрд╛рджреБрдИ рд╣реИрдВ рдФрд░ рдкрд╛рдардХ рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдирдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕реЗ рдмрджрд▓реЗрдВред

рдЧреЛ рдмреИрд╢ рдирд╣реАрдВ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА "рдЬрд╛рджреВ" рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░рд╛рдзрд╛рд░ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдмрд╛рдд рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдмреИрд╢ рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛ рдореЗрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред

@ рдХреНрд░реЗрдХрд░
рд╣рд╛рдВ, рдореИрдВ рдЖрдкрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕ рдШрдЯрдирд╛ рдиреЗ рдФрд░ рдЬрд╛рджреВ рдкреЗрд╢ рдХрд┐рдпрд╛ред рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╕рд┐рд░реНрдл рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ? рдХрдо рд╕рд╛рдорд╛рди рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рдСрдкрд░реЗрдЯрд░ рд╡рд┐рдЪрд╛рд░ред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рддреНрдпрд╛рдЧ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдЬрд╛рджреВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬрд╛рджреВ рдХреЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдВрддреБрд▓рди рд╣реИред

рдореВрд▓ || рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╕реНрд╡рд░реВрдкрдг рдмрджрд╕реВрд░рдд рд╣реИ, рдореИрдВ рд╕реНрд╡рд░реВрдкрдг рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛

syscal.Chdir(dir)
    || return &PathError{"chdir", dir}

рдкреАрдПрд╕ рдЖрдк рдЬрд╛рджреВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

syscal.Chdir(dir) {
    return &PathError{"chdir", dir}
}

@gladkikhartem рджреЛрдиреЛрдВ рдкрдардиреАрдпрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрд╛рдж рд╡рд╛рд▓реЗ рд╕реЗ рдмреБрд░рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдЕрдЬреАрдм рдмреНрд▓реЙрдХ рд╕реНрдХреЛрдк рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЖрдкрдХреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдмреНрд▓реЙрдХ рд╣реИрдВред

func (l *Loader) processDirectory(p *Package) (*build.Package, error) {
        absPath, err := p.preparePath()
        if err != nil {
                return nil, err
        }
    fis, err := l.context.ReadDir(absPath)
    if err != nil {
        return nil, err
    } else if len(fis) == 0 {
        return nil, nil
    }

    buildPkg, err := l.context.Import(".", absPath, 0)
    if err != nil {
        if _, ok := err.(*build.NoGoError); ok {
            // There isn't any Go code here.
            return nil, nil
        }
        return nil, err
    }

    return buildPkg, nil
}

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ?

func (l *Loader) processDirectory(p *Package) (*build.Package, error) {
    absPath, err? := p.preparePath()
    fis, err? := l.context.ReadDir(absPath)
    if len(fis) == 0 {
        return nil, nil
    }

    buildPkg, err := l.context.Import(".", absPath, 0)
    if err != nil {
         if _, ok := err.(*build.NoGoError); ok {
             // There isn't any Go code here.
             return nil, nil
         }
         return nil, err
    }

    return buildPkg, nil
}

@bcmills рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмреЗрд╣рддрд░ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

func (l *Loader) processDirectory(p *Package) (*build.Package, error) {
    absPath := p.preparePath()        =? err { return nil, err }
    fis := l.context.ReadDir(absPath) =? err { return nil, err }
    if len(fis) == 0 {
        return nil, nil
    }
    buildPkg := l.context.Import(".", absPath, 0) =? err {
        if _, ok := err.(*build.NoGoError); ok {
            // There isn't any Go code here.
            return nil, nil
        }
        return nil, err
    }
    return buildPkg, nil
}

@ рд╡рд╕реНрддреБ88

func (l *Loader) processDirectory(p *Package) (p *build.Package, err error) {
        absPath, err := p.preparePath() {
        return nil, fmt.Errorf("prepare path: %v", err)
    }
    fis, err := l.context.ReadDir(absPath) {
        return nil, fmt.Errorf("read dir: %v", err)
    }
    if len(fis) == 0 {
        return nil, nil
    }

    buildPkg, err := l.context.Import(".", absPath, 0) {
        err, ok := err.(*build.NoGoError)
                if !ok {
            return nil, fmt.Errorf("buildpkg: %v",err)
        }
        return nil, nil
    }
    return buildPkg, nil
}

рдЗрд╕ рдкрд░ рдкреНрд░рд╣рд╛рд░ рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖ рд╕рдХреЗрдВред

@erwbgy , рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рднреБрдЧрддрд╛рди рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред

  • рдЧреИрд░-рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреНрдпрд╛ рд╣реИрдВ? рдХреНрдпрд╛ рд╡реЗ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп-рдореВрд▓реНрдп рд╣реИрдВ? рдпрджрд┐ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди _was_ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╡рд╣ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ? рдпрджрд┐ рдирд╛рдорд┐рдд рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╡рд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ?
  • рдХреНрдпрд╛ ? рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдореИрдВ (!ok)? рдпрд╛ ok!? рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ (рдЬреЛ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдФрд░ рдСрдкрд░реЗрд╢рди рдХреЛ рдмрдВрдбрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)? рдпрд╛ рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗрд╡рд▓ error ?

@rodcorsi , рдпрд╣ рдореБрдЭреЗ ReadDir рдмрд▓реНрдХрд┐ ReadBuildTargetDirectoryForFileInfo рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдВрдмрд╛ рдерд╛ред рдпрд╛ рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рд╣реИрдВред preparePath рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рднреА рд╕реНрдХреНрд░реАрди рд╕реЗ рджреВрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реАрдорд┐рдд рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреНрд░реАрди рдЖрдХрд╛рд░ рд╡рд╛рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ (рдпрд╛ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдЬреЛ рдЗрддрдирд╛ рдЪреМрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЬреАрдердм), рдЖрдк =? рднрд╛рдЧ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рд▓рдВрдмрд╡рдд рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВ; рдХреНрд╖реИрддрд┐рдЬ рдкрд░ рдЗрддрдирд╛ рдирд╣реАрдВред

@gladkikhartem , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ error рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ (рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо?) рддрд░реНрдХ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдмрд╕... _feels_ рдЕрдЬреАрдм рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ ok -рд╕реНрдЯрд╛рдЗрд▓ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдЖрдк рдХреЗрд╡рд▓ 1 рд▓рд╛рдЗрди рдЦрд░реАрдж рд░рд╣реЗ рд╣реИрдВред

@ рд╡рд╕реНрддреБ88
рд╡рд░реНрдб-рд░реИрдкрд┐рдВрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рдХреЛрдб рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

@ рдСрдмреНрдЬреЗрдХреНрдЯ 88 рдмрд╣реБрдд рд▓рдВрдмреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред рдЖрдЗрдП рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдореБрджреНрджреЗ рд╕реЗ рдирд┐рдкрдЯреЗрдВред рдореБрджреНрджрд╛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреБрд╢ рдСрдл рд╕реНрдХреНрд░реАрди рдирд╣реАрдВ рд╣реИред рдореБрджреНрджрд╛ рдПрдХ рд▓рдВрдмрд╛ рдХрд╛рд░реНрдп рдирд╛рдо рдФрд░/рдпрд╛ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕реВрдЪреА рд╣реИред рдСрдл рд╕реНрдХреНрд░реАрди рд╣реЛрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рджрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЕрднреА рддрдХ рдПрдХ рдЖрдИрдбреАрдИ рдпрд╛ рдХреЛрдб-рдлреНрд░реЗрдВрдбрд▓реА рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░ рджреЗрдЦрдирд╛ рд╣реИ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдб рд░реИрдк рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдореБрдЭреЗ рдкреЗрдЬ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реАрдПрд╕рдПрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣реИрдХ рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ w/Github рдкрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред

рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреА рдЪреМрдбрд╝рд╛рдИ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИ - рдпрд╣ _readability_ рд╕реЗ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рд╣реИред рджрд╛рд╡рд╛ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ "рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб" рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐ рдХреЛрдб рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИред

@ рд╡рд╕реНрддреБ88
рд╣рд╛рдВ, рдпрд╣ рдХреЛрдб рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рд▓рд╛рдЗрди рд╕реЗрд╡рд┐рдВрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЖрдк рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдмрд╣реБрдд рд╕рдШрди рдФрд░ рди рд╣реА рдкреНрд░рддреНрдпреЗрдХ рдХрдерди рдХреЗ рдмрд╛рдж рд╕реНрдерд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдШреЛрд╖рдгрд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдпрд╣ рдореМрдЬреВрджрд╛ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ рдЕрдЧрд░ ...; рдЧрд╝рд▓рддреА != nil { рдХрдерди, рддрд╛рдХрд┐ рд▓реЛрдЧ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рди рд╣реЛрдВред

рдХреЛрдб рдЪреМрдбрд╝рд╛рдИ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ 80 рд▓рд╛рдЗрди рд╕рдВрдкрд╛рджрдХ рд╣реИ рдФрд░ 80 рд▓рд╛рдЗрди рдХреЛрдб рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ ||

рдХреЗрд╡рд▓ рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ || рд╕рд┐рдВрдЯреИрдХреНрд╕, рдореЗрд░реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдФрд░ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдорд╛рдиреЛрдВ рдХреЗ рдСрдЯреЛ-рд╢реВрдиреНрдпрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдлреЗрдВрдХ рджреВрдВрдЧрд╛

func (l *Loader) processDirectory(p *Package) (*build.Package, error) {
        absPath := p.preparePath() || errors.New("prepare path")
    fis := l.context.ReadDir(absPath) || errors.New("ReadDir")
    if len(fis) == 0 {
        return nil, nil
    }

    buildPkg, err := l.context.Import(".", absPath, 0)
    if err != nil {
        if _, ok := err.(*build.NoGoError); ok {
            // There isn't any Go code here.
            return nil, nil
        }
        return nil, err
    }

    return buildPkg, nil
}

рдЕрдиреНрдп рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдирдХрд╛ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╡рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП, рдХреНрдпрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЬреЛ рдореИрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╕рдмрд╕реЗ рдЖрдо рдФрд░ рдмреЗрддрд╣рд╛рд╢рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореБрд╣рд╛рд╡рд░рд╛ рд╣реИ

err := func()
if err != nil {
    return err
}

рд╣рдо рд╕рднреА рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ (рдпрджрд┐ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ) рд╣реИред рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕реБрд▓рдЭрд╛рдирд╛ рд╣реА рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдФрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░реЗрдВ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдВред рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рд╣реЛред рдирд╛рд╕рдордЭ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЬрдЧрд╣ рдФрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдирд╛рд╕рдордЭ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЧреЛ рдХреЛрдб рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдкрд╣рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдкрд░ рд╕рд╛рд░реНрдердХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдВред рдлрд┐рд░, рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдпрд╣рд╛рдВ рдЕрдЪреНрдЫреА рд╣реИ рдФрд░ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред рдФрд░ || рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛ рд╣реИред рдЖрдк рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдРрд╕реЗ рдорд╛рдорд▓реЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╢реВрдиреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@ рд╡рд╕реНрддреБ88

рджрд╛рд╡рд╛ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ "рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб" рд╣реИред

рдпрд╣ рд╕рд┐рд░реНрдл рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реИред рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрд░реНрдерд╣реАрди рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реИред рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрдм рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдореВрд▓реНрдп рд╣реЛред if err == nil then return err рдореЗрдВ рдХреБрдЫ рднреА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрджрд┐рдо рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рд▓реЗрддрд╛ рд╣реИред рдФрд░ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рддрд░реНрдХ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЙрд▓, рд░реИрдкрд░ рдЗрддреНрдпрд╛рджрд┐ рд╣реИ рдХрд┐ рд╕рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдпрд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдкрд░ рд╣рд╛рд╡реА рд╣реЛрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ - рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХред рдФрд░ рдЙрд╕ рддрд░реНрдХ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд░реНрдХ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдиреЗ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдЗрд╕ рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓реА рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рдЦреЛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЧреЛ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЕрдиреНрдп рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдПрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреА рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдирд╣реАрдВ рд╣реИред

@ рдХреНрд░реЗрдХрд░
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрджрд┐ err != nil return err рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИ, рддреЛ рд╣рдо рдЬрд┐рд╕ рдЪреАрдЬ рд╕реЗ рдбрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рд╕реНрдЯреИрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдмрдирд╛рдПрдВрдЧреЗ - рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреВрдирд┐рдпрд░ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрдпрд╛ рдЙрдЪрд┐рдд рд╣реИред
рдЧреЛ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╣рдо рджреВрд╕рд░реЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реЛрдЪ-рд╕рдордЭрдХрд░ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рд╕рд╛рдзрд╛рд░рдг рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдмрджрд╕реВрд░рдд рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд░реИрдкрд┐рдВрдЧ рдпрд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЧреНрд░реЗрд╕рдлреБрд▓ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЕрдЪреНрдЫрд╛ рдФрд░ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред

@gladkikhartem рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рдЪреАрди рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рддрд░реНрдХ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдкрд╛рдпрд╛ред рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рд╕реЗ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдХреЛ рдЗрд╕рдХрд╛ рдЦрд╛рдорд┐рдпрд╛рдЬрд╛ рдХреНрдпреЛрдВ рднреБрдЧрддрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ 2018 рд╣реИ, рд▓рдЧрднрдЧ рд╕рднреА рдХреЗ рдкрд╛рд╕ рдмрдбрд╝рд╛ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рд╕рдВрдкрд╛рджрдХ рд╣реИрдВред рдмрд╣реБрдд рдЫреЛрдЯреЗ рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рдХреЛ рдЕрдиреНрдп рд╕рднреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдЙрд▓реНрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХреЛрдВ рдХреЛ рдЗрд╕рд╕реЗ рдЦреБрдж рд╣реА рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдХреНрд░реЙрд▓, рд╡рд░реНрдб рд░реИрдкрд┐рдВрдЧ, рдХреБрдЫ рднреАред

@gladkikhartem Go рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╣рдореЗрд╢рд╛ рдЖрд▓рд╕реА рд░рд╣реЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрд╕рдлрд▓ рд╕рдВрдХрд▓рди рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдкреИрдирд┐рдХ рдХреЗ рд╕рд╛рде рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╡реИрд╕реЗ, рдЧреЛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЧреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдХреБрдЫ рднреА рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрд╣ рдзрд╛рд░рдгрд╛ рдХрд┐ рдЧреЛ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рднреНрд░рд╛рдордХ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рдереАред рдЬрд╛рдУ рд▓реЗрдЦрдХ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдФрд░ рд╕рдореНрдореЗрд▓рди рд╡рд╛рд░реНрддрд╛ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рд╖рд╛ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рдЪреБрдирддрд╛ рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рд╣реИред рдпрджрд┐ рдЧреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рддреЛ рдЙрд╕реЗ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рддреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдШрдмрд░рд╛рдПрдВ рдпрджрд┐ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЬреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд░рд╕реНрдЯ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖрддрдВрдХрд┐рдд рд╣реЛрддреА рд╣реИрдВред рдЗрд╕реЗ рдореИрдВ рд╕рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдХрд╣рддрд╛ рд╣реВрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдореЗрд░рд╛ рдбреЗрд╡рд▓рдкрд░ рд╡рд┐рд╡реЗрдХ рд╣реИ, рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореЛрд╣рдХ рд╣реИред рдЕрднреА рдЕрдЧрд░ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реВрдВ рддреЛ рдХреЛрдИ рднреА рдореБрдЭреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ fmt.Println рдиреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рджреА рд╣реИред рдореБрдЭреЗ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╕рд┐рд░реНрдл рд╕рд╛рдорд╛рди рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реА рдХреА рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд╛рди рд╣реИрдВ рдФрд░ рдЖрдк рдЙрди рд╕рднреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЯреВрдЯ рди рдЬрд╛рдП рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рди рдЪрд▓реЗ рдХреНрдпреЛрдВрдХрд┐ рд╕рд╣рд╛рдпрдХ рдЖрддрдВрдХ рдХреЗ рд╕рд╛рде рдХреЛрдИ рджреБрд░реНрдШрдЯрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рдирд╛ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рдеред

@gladkikhartem рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╡рд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕реЛрдЪ-рд╕рдордЭрдХрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдПрдВрдЧреЗ рдХрд┐ рд╡реЗ рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╕рд░ рд▓реЛрдЧ рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рд▓реЗрдХрд░ рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореИрдВ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЕрд╕рдВрд╢реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

@ рдХреНрд░реЗрдХрд░
рдореЗрд░рд╛ рд╕рдВрдкрд╛рджрдХ 100 рд╡рд░реНрдг рдЪреМрдбрд╝рд╛рдИ рдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░, рдЧрд┐рдЯ рдХрдВрд╕реЛрд▓ рдФрд░ рдЖрджрд┐ рд╣реИ ...., рд╣рдорд╛рд░реА рдЯреАрдо рдореЗрдВ рдХреЛрдИ рднреА 100 рд╡рд░реНрдг рд▓рдВрдмрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реИ (рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде)

рдЬрд╛рдУ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓рд┐рдВрдЯрд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВред (рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд▓рд┐рдВрдЯрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?)

рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╣рдо рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдХреЛрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реИ - рд╣рдореЗрдВ рдЬрд┐рд╕ рдЪреАрдЬрд╝ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдХреНрдпреЛрдВ рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ? рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рд╕рд╣рдордд рд╣реЛрдирд╛ рдФрд░ рдлрд┐рд░ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдХрд╛рдо рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  1. рдирдП рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред ( рд╕рд╣рдордд рдЕрд╕рд╣рдордд )
  2. рдирдП рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрдИ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ (рд╕рд╣рдордд/рдЕрд╕рд╣рдордд)
  3. рдирдП рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХрдо рдЬрдЧрд╣ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (1 рд▓рд╛рдЗрди, 2 рд▓рд╛рдЗрди, рдЕрд╕рд╣рдордд)
  4. рдирдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╣реБрдд рд▓рдВрдмреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рд╣рдордд/рдЕрд╕рд╣рдордд)
  5. рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирдП рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХрдИ рдмрдпрд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рд╕рд╣рдордд/рдЕрд╕рд╣рдордд)
  6. .....

@creker , рдореЗрд░реЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд▓рдЧрднрдЧ 75% VSCode рдореЗрдВ 15 "рд▓реИрдкрдЯреЙрдк рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреА рдХреНрд╖реИрддрд┐рдЬ рдЕрдЪрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдПрдХ рд╕реАрдорд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдореИрдВ рд╕рд╛рде-рд╕рд╛рде рд╕рдВрдкрд╛рджрди рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рджрд╛рдВрд╡ рд▓рдЧрд╛рдКрдВрдЧрд╛ , рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд▓реИрдкрдЯреЙрдк рд╣реИрдВред рдореИрдВ рднрд╛рд╖рд╛ рдХреА рдкрд╣реБрдВрдЪ рдХреНрд╖рдорддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдХреЗ рдкрд╛рд╕ рдмрдбрд╝реЗ рдкреНрд░рд╛рд░реВрдк рд╡рд╛рд▓реЗ рдореЙрдирд┐рдЯрд░ рд╣реЛрдВрдЧреЗред

рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рддрдиреА рднреА рдмрдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреНрдпреЛрдВ рди рд╣реЛ, рдЬреАрдердм рдЕрднреА рднреА рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред

@gladkikhartem

рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдЖрд▓рд╕реНрдп рдпрд╣рд╛рдБ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ errors.New рдХрд╛ рдЙрджрд╛рд░ рдЙрдкрдпреЛрдЧ рднреА рднрд╛рд╖рд╛ рдХреА рд╕рдордЭ рдХреА рдХрдореА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдЧрддрд┐рд╢реАрд▓ рди рд╣реЛрдВ, рдФрд░ рдпрджрд┐ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рддреБрд▓рдиреАрдп рдкреИрдХреЗрдЬ рд╕реНрдХреЛрдкреНрдб рдЪрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреГрд╖реНрда рдкрд░ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ред рдЬреЛ рд▓реЛрдЧ "рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ" рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдЧреЛ рддреНрд░реБрдЯрд┐ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреАрдбрд╝рд┐рдд рд╣реИрдВ, рд╡реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╢реЙрд░реНрдЯрдХрдЯ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ simplifying error handling рдХреНрдпрд╛ рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд┐рд╕рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ less runes != simple ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рд╣реИрдВ рдЬреЛ рдПрдХ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдорд╛рддреНрд░рд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдк рд╕рдХрддреЗ рд╣реИрдВ:

  • рдирд┐рд░реНрдорд╛рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рддреА рд╣реИ
  • рдЙрд╕ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдорд╛рдирддрд╛ рдЕрдиреНрдп рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП, рдФрд░ рдЙрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдордВрдЬрд╕реНрдп
  • рдирд┐рд░реНрдорд╛рдг рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛
  • рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдорд╛рдирддрд╛ (рдЕрд░реНрдерд╛рдд, рдирд┐рд╖реЗрдз рдХрд╛ рдЕрднрд╛рд╡, рдЖрджрд┐)

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ 2 рд╕реЗ 3 рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ OR рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВред рдпрд╣ рдХрдо рдЬрдЯрд┐рд▓рддрд╛ рдХреА рд╕рд╢рд░реНрдд рд╡рд╛рдкрд╕реА рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ ( copy рдпрд╛ append , рдпрд╛ >> рдХрд╣рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ)ред рдирдИ рд╡рд┐рдзрд┐ рдкреБрд░рд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдЬрд╝реЛрд░ рд╕реЗ рдмреЛрд▓реА рдЬрд╛рддреА рд╣реИ рддреЛ рд╢рд╛рдпрдж abs, err := path(foo) || return err -> if theres an error, it's returning err , рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдПрдХ рд░рд╣рд╕реНрдп рд╣реЛрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рд▓рдВрдмрд╡рдд рд╕рд▓рд╛рдЦреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рддреЛ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдЬреЛрд░ рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред

@рдЬреИрд╕рд╛
рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ less runes != simple ред
рд╕рд░рд▓ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рдкрдардиреАрдп рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рддрд╛рдХрд┐ рдЬреЛ рдХреЛрдИ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рд╡рд╣ рдЗрд╕реЗ рдкрдврд╝рдХрд░ рд╕рдордЭреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдПрдХ рдордЬрд╛рдХ рдХреА рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рд╡рд░реНрддрдорд╛рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ if err != nil return. рддреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдардиреАрдп рдирд╣реАрдВ рд╣реИ

@ рдСрдмреНрдЬреЗрдХреНрдЯ 88 рдареАрдХ рд╣реИред рдореИрдВрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдХрд╣рд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрд░реНрдХ рдХрд╛рдлреА рдмрд╛рд░ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред рдЬреИрд╕реЗ, рдЖрдЗрдП рдХреБрдЫ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рдкреНрд░рд╛рдЪреАрди рдЯрд░реНрдорд┐рдирд▓ рд╕реНрдХреНрд░реАрди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рддрд░реНрдХ рд╣реИ? рдЗрд╕рдХреА рдмреЗрд╣реВрджрдЧреА рдХреА рд╣рдж рдХрд╣рд╛рдБ рд╣реИ? рдпрджрд┐ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрдВрднреАрд░ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдХрдареЛрд░ рддрдереНрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реНрдХреНрд░реАрди рдЖрдХрд╛рд░ рдФрд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреНрдпрд╛ рд╣реИред рдФрд░ рдХреЗрд╡рд▓ рдЙрд╕реА рд╕реЗ рд╣рдо рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рддрд░реНрдХ рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рд╕реНрдХреНрд░реАрди рдЖрдХрд╛рд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдмрд╣реБрдд рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдРрд╕рд╛ рдХрд░ рд╕рдХреЗред

@gladkikhartem рдирд╣реАрдВ, рд▓рд┐рдВрдЯрд░ рдЖрдкрдХреЛ рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддреЗ, рд╡реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред рд╡реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ, рдЧреЛ рдЯреВрд▓рдЪреЗрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред рдЬрдмрд░рджрд╕реНрддреА рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рджреЛ рдЪреАрдЬреЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ - рд╕рдВрдХрд▓рди рдпрд╛ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдПрдХ рд╕реБрдЭрд╛рд╡ рдФрд░ рдЪреБрдирдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рд╣рдо рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рднреА рдкрд╣рд▓реБрдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@рдЬреИрд╕рд╛

рдирдпрд╛ рддрд░реАрдХрд╛ рдкреБрд░рд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдЬрд╝реЛрд░ рд╕реЗ рдмреЛрд▓рд╛ рдЬрд╛рдП рддреЛ рд╢рд╛рдпрдж рдПрдмреНрд╕ рд╣реЛрдЧрд╛, рдЧрд╝рд▓рддреА := path(foo) || рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐ -> рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ, рддреЛ рдпрд╣ рдЧрд▓рддреА рд╕реЗ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рд░рд╣рд╕реНрдп рд╣реЛрдЧрд╛ рдХрд┐ рд▓рдВрдмрд╡рдд рд╕рд▓рд╛рдЦреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдЬреЛрд░ рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред

рдирдИ рд╡рд┐рдзрд┐ рдХрдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░рдг рд╕реЗ - рдпрд╣ рдЕрднреА рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдЬрд╛рдУ - рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдЬреИрд╕реЗ рдЖрдк -> , select , go рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рд░рд┐рдЯрд░реНрди рдХреЗ рдмрдЬрд╛рдп рд╡рд░реНрдЯрд┐рдХрд▓ рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рд╣реИ? рдореИрдВ рдПрдХ рдкреНрд░рд╢реНрди рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реВрдВред рдЬрдм рдЖрдк рд▓реВрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдХреЙрд▓ рдореЗрдВ рд╕реНрд▓рд╛рдЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЬрдм рдЖрдк рд▓реВрдк рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдХреЙрд▓ рдореЗрдВ рдкрд╛рдардХ рд╕реЗ рд▓реЗрдЦрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рд╛рдорд╛рди рдХреЙрдкреА рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЗрддреНрдпрд╛рджрд┐ рдЗрддреНрдпрд╛рджрд┐ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛред рдЖрдк рдпреЗ рддрд░реНрдХ рддрдм рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ, рдЖрдЗрдП рдЕрдзрд┐рдХ рдЦреБрд▓реЗ рд╣реЛрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдиреАрдЪреЗ рди рдЧрд┐рд░рд╛рдПрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирдпрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдХреБрдЫ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХрдИ рд▓реЛрдЧ рд╕рдорд╛рдзрд╛рди рдХреА рдЧреБрд╣рд╛рд░ рд▓рдЧрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЖрдЗрдП рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред рдЧреЛ рдПрдХ рдкрд╡рд┐рддреНрд░ рдЖрджрд░реНрд╢ рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдХреБрдЫ рднреА рдЕрдкрд╡рд┐рддреНрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЬрдм рдЖрдк рд▓реВрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдХреЙрд▓ рдореЗрдВ рд╕реНрд▓рд╛рдЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдЕрдЧрд░ рдХрдерди рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд▓рд┐рдЦрдирд╛ рддреБрдЪреНрдЫ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЖрдкрдХреЗ append рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред

рдЬрдм рдЖрдк рд▓реВрдк рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдХреЙрд▓ рдореЗрдВ рдкрд╛рдардХ рд╕реЗ рд▓реЗрдЦрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рд╛рдорд╛рди рдХреЙрдкреА рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдПрдХ рдкрд╛рдардХ рдФрд░ рд▓реЗрдЦрдХ рдПрдХ рдХреЙрдкреА рдСрдкрд░реЗрд╢рди рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдФрд░ рдЧрдВрддрд╡реНрдпреЛрдВ, рдмрдлрд░рд┐рдВрдЧ рд░рдгрдиреАрддрд┐ рдФрд░ рдХрднреА-рдХрднреА рд▓реВрдк рдореЗрдВ рдкреНрд░рд╣рд░реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреА рджреВрд░ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЖрдк рдЙрд╕ рдЕрдореВрд░реНрддрддрд╛ рдХреЛ рд▓реВрдк рдФрд░ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЖрдк рдпреЗ рддрд░реНрдХ рддрдм рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВред

рдлрд┐рд░ рд╕реЗ, рдЖрдЗрдП рдЕрдзрд┐рдХ рдЦреБрд▓реЗ рд╣реЛрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдиреАрдЪреЗ рди рдЧрд┐рд░рд╛рдПрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирдпрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЧреЛ рдХреА рд╕рдВрдЧрддрддрд╛ рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдЖрдкрдХреЛ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЫрд╛рдирдмреАрди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╡реЗ рднрдпрд╛рдирдХ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдЕрдм рддрдХ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдорд╛рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЫреЛрдЯреА рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ (рдЬреИрд╕реЗ, рдЬреЗрдирд░рд┐рдХ) рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдХреНрд╕рд░ рдЕрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ: "рд╡рд╛рд╣, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдЪрд▓реЛ рдЕрднреА рддрдХ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ"ред рд╡рд┐рдХрд▓реНрдк рд╕реБрдЭрд╛рд╡реЛрдВ рд╕реЗ рднрд░реА рднрд╛рд╖рд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реНрд╡рд╡реНрдпрд╛рдкреА рд░реВрдк рд╕реЗ рдмреЗрджрдЦрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рд╡рд╛рдЗрдб рдмрдирд╛рдо рдерд┐рди рд╕реНрдХреНрд░реАрди рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдПрдХ рдФрд░ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдорд▓реНрдЯреА-рдЯрд╛рд╕реНрдХрд┐рдВрдЧ рд╣реИ ред

рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрднреА-рдХрднреА рдХреБрдЫ рдФрд░ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдХрдИ рд╡рд┐рдВрдбреЛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрдмрдХрд┐ рдЖрдк рд╕рдВрдкрд╛рджрдХ рдХреЛ рдШреВрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдереЛрдбрд╝рд╛ рд╕рд╛ рдХреЛрдб рдПрдХ рд╕рд╛рде рдлреЗрдВрдХрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд╕рд░реА рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛, рд╢рд╛рдпрдж рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ, рдФрд░ рд╕рднреА рддрд░рд╣ рд╕реЗ рд╡рд╛рдкрд╕ рд╕рдВрдкрд╛рджрдХ рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдВред

@рдЬреИрд╕рд╛
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИрдВ, рдФрд░ рдореИрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ рд╣реВрдВ рдХрд┐ || рддрдерд╛ ? рд╕рд╛рдорд╛рди рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@ рдХреНрд░реЗрдХрд░
рдХреЙрдкреА () рдФрд░ рдПрдкреЗрдВрдб () рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ

рдореЗрд░реЗ рдкрд╛рд╕ рд╕реАрдЖрдИ/рд╕реАрдбреА рдкрд░ рд▓рд┐рдВрдЯрд░ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рдЪрдореБрдЪ рдореБрдЭреЗ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ - рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рд┐рдПред
(рдФрд░ рд╡реИрд╕реЗ, рдореЗрд░реА рдордЬрдмреВрдд рд░рд╛рдп рд╣реИ - рдЕрдЧрд░ рдХреЛрдИ рдЧреЛ рдореЗрдВ рд▓рд┐рдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рд╡рд╣ рд╕рд┐рд░реНрдл ...... рд╣реИ)

рд╕реНрдХреНрд░реАрди рд╕рд╛рдЗрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдпрд╣ рдордЬрд╝реЗрджрд╛рд░ рднреА рдирд╣реАрдВ рд╣реИ, рдЧрдВрднреАрд░рддрд╛ рд╕реЗред рдХреГрдкрдпрд╛ рдЗрд╕ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЛ рдмрдВрдж рдХрд░реЗрдВред рдЖрдкрдХреА рд╕реНрдХреНрд░реАрди рдЬрд┐рддрдиреА рдЪрд╛рд╣реЗрдВ рдЙрддрдиреА рдЪреМрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИ - рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдЗрд╕ рдмрд╛рдд рдХреА рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ || return &PathError{Err:err} рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдмрд╕ Google рд╢рдмреНрдж "ide" рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдерд╛рди рдЙрдкрд▓рдмреНрдз рд╣реИред

рдФрд░ рдХреГрдкрдпрд╛ рджреВрд╕рд░реЛ рдХреЗ рдкрд╛рда рдХреЛ рд╕реЛрдЪ рд╕рдордЭ рдХрд░ рдкрдврд╝реЗрдВ, рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рдЧреЛ рдЖрдкрдХреЛ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ

рдЧреЛ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

@gladkikhartem рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рднреА рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣реА рдореБрджреНрджрд╛ рд╣реИред рд╕рднреНрдп рдмрд╛рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдирд╛рдЗрдЯ рдкрд┐рдХрд┐рдВрдЧ рд╣реИред рднрд▓реЗ рд╣реА рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорддрд▓рдм fmt.Println рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред

рдЕрдЧрд░ рдХреЛрдИ рдЧреЛ рдореЗрдВ рд▓рд┐рдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рд╡рд╣ рдиреНрдпрд╛рдпрд╕рдВрдЧрдд рд╣реИ

рд╢рд╛рдпрдж рд╣реЛред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдордЬрдмреВрд░ рдирд╣реАрдВ рд╣реИ рддреЛ рд╡рд╣ рдЙрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВрдЧреЗ, рдЕрдиреНрдп рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рд╕реНрдХреНрд░реАрди рд╕рд╛рдЗрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдпрд╣ рдордЬрд╝реЗрджрд╛рд░ рднреА рдирд╣реАрдВ рд╣реИ, рдЧрдВрднреАрд░рддрд╛ рд╕реЗред рдХреГрдкрдпрд╛ рдЗрд╕ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЛ рдмрдВрдж рдХрд░реЗрдВред

рдореИрдВ рд╡рд╣ рдирд╣реАрдВ рд╣реВрдВ рдЬрд┐рд╕рдиреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдлреЗрдВрдХрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╕реНрддреБрдирд┐рд╖реНрда рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд╣реАрдВ "рдореЗрд░реЗ рдкрд╛рд╕ 80 рдкреНрд░рддреАрдХ рд╡рд┐рд╕реНрддреГрдд рдЖрдИрдбреАрдИ рд╣реИрдВ, рдЧреЛ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмрд╛рдХреА рд╕рднреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП"ред

рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреЗ рд╕реНрдХреНрд░реАрди рд╕рд╛рдЗрдЬ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛрдб рдореБрдЭреЗ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдерд╛рди рдХреЗ 270 рдкреНрд░рддреАрдХ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреА рд╡рдХрд╛рд▓рдд рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ рдХрд┐ рдЗрддрдиреА рдЬрдЧрд╣ рд▓реЗрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рдВрдмреЗ рдирд╛рдорд┐рдд рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдореЗрд░рд╛ рдХреЛрдб рдЖрд╕рд╛рдиреА рд╕реЗ 120 рдкреНрд░рддреАрдХреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ || рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рддреЛ рдпрд╣ 3-5 рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдФрд░ рдХрд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд▓рд┐рдкрдЯреЗ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ 100-120 рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред

рдИрдерд░ рддрд░рд╣ рдЕрдЧрд░ || рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдиреА рдереА рддреЛ gofmt рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЧрд╣ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред

@erwbgy , рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рднреБрдЧрддрд╛рди рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред

@ object88 рдореЗрд░реЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдзрд╛рд░рдг рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдмрдирд╛рддрд╛ рд╣реИ:

val, err := func()
if err != nil {
    return nil, errors.WithStack(err)
}

рд╕рд░рд▓:

val, err? := func()

рдХреБрдЫ рднреА рдирд╣реАрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рдЧреИрд░-рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреНрдпрд╛ рд╣реИрдВ? рдХреНрдпрд╛ рд╡реЗ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп-рдореВрд▓реНрдп рд╣реИрдВ? рдпрджрд┐ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рдерд╛, рддреЛ рдХреНрдпрд╛ рд╡рд╣ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ? рдпрджрд┐ рдирд╛рдорд┐рдд рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╡рд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ?

рдЕрдиреНрдп рд╕рднреА рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдкрдпреБрдХреНрдд рд╢реВрдиреНрдп рдорд╛рди рд╣реИрдВред рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЛ рд░рдЦреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ? рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ (!рдареАрдХ)? рдпрд╛ рдареАрдХ!? (рдЬреЛ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдФрд░ рдСрдкрд░реЗрд╢рди рдХреЛ рдмрдВрдбрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)? рдпрд╛ рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ?

рдирд╣реАрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдХреЛрдб рдХреЗ рд▓рд┐рдП "рдЬрд░реВрд░реА" рдХрд╛рд░реНрдп рд╣рддрд╛рд╢рд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

sqlx

db.MustExec(schema)

рдПрдЪрдЯреАрдПрдордПрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ

var t = template.Must(template.New("name").Parse("html"))

рдореИрдВ рдкреИрдирд┐рдХ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ 'рдСрдкрд░реЗрдЯрд░' рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП)

a,  ЁЯШ▒ := someFunc(b)

рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рддрддреНрдХрд╛рд▓

a, err := someFunc(b)
if err != nil {
  panic(err)
}

рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╢рд╛рдпрдж рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!, рдпрд╛ !!, or

a,  !! := someFunc(b)
!! = maybeReturnsError()

рд╢рд╛рдпрдж !! рджрд╣рд╢рдд рдФрд░! рд░рд┐рдЯрд░реНрди

рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рдордпред рд╣рдо рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ debug.PrintStack() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЛ рдХреЗрд╡рд▓ рдЧрд╣рд░реЗ рд╕реНрддрд░ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИред

рд╣рдо рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ debug.PrintStack() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?

рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдХрдИ рд╕реНрдЯреИрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЪреИрдирд▓реЛрдВ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЪрд░реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд┐ред рдЙрди рд╕рдВрдХреНрд░рдордг рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЕрдХреНрд╕рд░ рдЕрдзрд┐рдХ рд╕рд╣рд╛рдпрдХ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрд╕ рдЦрдВрдб рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдереАред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдореЗрдВ рдЕрдХреНрд╕рд░ рдЖрдВрддрд░рд┐рдХ (рдЕрдирдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб) тАЛтАЛрд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рддрдм рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдХреНрд░реИрд╢ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рд╕рдВрдкреВрд░реНрдг рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдиреНрдпреВрдмреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрдпрд╛ рд╣реИ?

рдореБрдЭреЗ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ if !err
рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ, рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд, рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рдирд╣реАрдВ, рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдХреЛрдб

```рдЬрд╛рдУ
absPath, рддреНрд░реБрдЯрд┐:= p.preparePath ()
рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп, рдЕрдЧрд░ рдЧрд▓рддреА рд╣реЛ рддреЛ

рдЗрд░реЗрдЯ:= doSomethingWith(absPath) рдЕрдЧрд░ !err
doSomethingElse () рдЕрдЧрд░ !err

рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрджрдСрдлрдПрд░ ()

// рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ; рдЕрдЧрд░ рдЬрд░реБрд░рдд рд╣реЛ; рдмрд┐рдирд╛ рдЗрдВрдбреЗрдВрдЯ рдХрд┐рдП рдХреИрдЪ-рд▓рд╛рдЗрдХ
рдЕрдЧрд░ рдЧрд▓рддреА {
рд╡рд╛рдкрд╕реА "рдХреЛрдб рдкреНрд░рджреВрд╖рдг рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐", рддреНрд░реБрдЯрд┐
}
```

err := doSomethingWith(absPath) if !err
doSomethingElse() if !err

рд╡рд╛рдкрд╕ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ MUMPS рдкреЛрд╕реНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ ;-)

рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХреЛрдИ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВред

@dmajkic рдпрд╣ "рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ" рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@erwbgy рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╢реАрд░реНрд╖рдХ рд╣реИ _рдкреНрд░рд╕реНрддрд╛рд╡: рдЬрд╛рдУ 2: рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ || рдЧрд▓рддреА рдкреНрд░рддреНрдпрдп_ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдЙрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдереАред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдХрджрдо рд░рдЦрд╛ред

@cznic рд╣рд╛рдБред рдкреЛрд╕реНрдЯ рдХреА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЧреЛ-рд╡реЗ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреВрд░реНрд╡ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рднреА рдкреНрд░рджреВрд╖рд┐рдд рджрд┐рдЦрддреА рд╣реИрдВ:

if !err; err := doSomethingWith(absPath)
if !err; doSomethingElse()

@dmajkic рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдХреБрдЫ рд╣реИ - ianlancetaylor рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред

@erwbgy рдореИрдВ рдЧреБрдЬрд╝рд░рд╛, рд╡реЗ рд╕рднреА рдирдП рдХреАрд╡рд░реНрдб (рдЬреИрд╕реЗ try() ) рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╡рд┐рд╢реЗрд╖ рдЧреИрд░-рдЕрд▓реНрдлрд╝рд╛рдиреНрдпреВрдореЗрд░рд┐рдХ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ - рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдУрд╡рд░рд▓реЛрдбреЗрдб рд╣реИ !"#$%& рдЧрд╛рд▓реА рджреЗрдиреЗ рдЬреИрд╕рд╛, рдЖрдХреНрд░рд╛рдордХ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдФрд░ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдкрд╣рд▓реА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдХреНрдпрд╛ рдмрддрд╛рддреА рд╣реИрдВ: рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреЛ рдХреЛрдб рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдЙрд╕ рднрд╛рд╡рдирд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рд╕реБрдЭрд╛рд╡ рдХреЗ рд╕рд╛рде рдЧреЛ рдЕрдм рдЬреЛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ, рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреАрд╡рд░реНрдб рдпрд╛ рдХреА-рдЪрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗред

рдХреИрд╕реЗ рдПрдХ рд╕рд╢рд░реНрдд рд╕реНрдердЧрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

func something() (int, error) {
    var error err
    var oth err

    defer err != nil {
        return 0, mycustomerror("More Info", err)
    }
    defer oth != nil {
        return 1, mycustomerror("Some other case", oth)
    }

    _, err = a()
    _, err = b()
    _, err = c()
    _, oth = d()
    _, err = e()

    return 2, nil
}


func something() (int, error) {
    var error err
    var oth err

    _, err = a()
    if err != nil {
        return 0, mycustomerror("More Info", err)
    }
    _, err = b()
    if err != nil {
        return 0, mycustomerror("More Info", err)
    }
    _, err = c()
    if err != nil {
        return 0, mycustomerror("More Info", err)
    }
    _, oth = d()
    if oth != nil {
        return 1, mycustomerror("Some other case", oth)
    }
    _, err = e()
    if err != nil {
        return 0, mycustomerror("More Info", err)
    }

    return 2, nil
}

рдпрд╣ defer рдХреЗ рдЕрд░реНрде рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ - рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рджрд╛рдпрд░реЗ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдЬреЛ рдЧреБрдВрдЬрд╛рдЗрд╢ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдпрджрд┐ рд╡реЗ рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЯреНрд░рд╛рдИ рдХреИрдЪ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ рддреЛ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╣реА рдЖрд╕рд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ рдорд╛рди рд╢реВрдиреНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдкрд░ рд╕реЗрдЯ рд╣реИ, рддреЛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрдЪ рд╕реЗрдХреНрд╢рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЕрдВрдд рдореЗрдВ рд╕реЗрдХреНрд╢рди рдФрд░ рд╡рд░реНрддрдорд╛рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ!

try (var err error){
     i, err:=DoSomething1()
     i, err=DoSomething2()
     i, err=DoSomething3()
} catch (err error){
   HandleError(err)
   // return err  // similar to throw err
} finally{
  // Do something
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рд░реНрд╕реЗрд▓ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИ:

image

@sbinet рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡реЗ рдХреЗрд╡рд▓ рдЙрд╕реА рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ рдкреНрд░рддрд┐рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рд╣рд░ рдХреЛрдИ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рддреЛ рдмреЗрд╣рддрд░ рд╣реИред

@KamyarM рдЬрдм рднреА рдХреЛрдИ рдЪрд░ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╡рд╣ "рдкреНрд░рддрд┐рдорд╛рди" рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рд░ рдХреЛрдИ рдкрд░рд┐рдЪрд┐рдд рд╣реИред рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ "рдЕрдкрд╡рд╛рдж" рднреА рд╣реИрдВ рдЬреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рддрд░рд╣ рдХрд╛рдлреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рджреНрд╡рд┐рддреАрдп рд╢реНрд░реЗрдгреА рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬрдмрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рд╢рд╛рдпрдж рдореЛрдиреИрдб рдФрд░ рдЗрд╕реА рддрд░рд╣ред

@ianlancetaylor рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ C++, Java, C#, рдореЗрдВ рдЯреНрд░рд╛рдИ-рдХреИрдЪ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рди рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдпрд╣ рдмреЗрд╣рддрд░ рдерд╛ рдЕрдЧрд░ GoLang рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рджрд┐рди рд╕реЗ рдЯреНрд░рд╛рдИ-рдХреИрдЪ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдЗрд╕ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдпрд╛ рдирд╣реАрдВ рдерд╛ред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА GoLang рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕ рддрд░рд╣ рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рд▓реЗрдХрд┐рди рдореИрдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рд╡рд╣ рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрддрддрд╛ рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдерд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЬрд╛рд╡рд╛ рдЕрдкрд╡рд╛рдж рдПрдХ рдЯреНрд░реЗрди рдХреЗ рдорд▓рдмреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣рд╛рдВ @KamyarM рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реЛрдирд╛ рд╣реИред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдХреБрдЫ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдореЗрд░рд╛ рдорддрд▓рдмред

@KamyarM рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рдордиреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ред рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрд╕рд╛рдзрд╛рд░рдг рдирд╣реАрдВ рд╣реИрдВ; рд╡реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред https://blog.golang.org/errors-are-values

рдЕрд╕рд╛рдзрд╛рд░рдг рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЛрдб рдмреНрд▓реЛрдЯ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣реА рдореБрджреНрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреЛ рдкрдВрдЧреБ рдмрдирд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рдЧреЛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ NSError рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рд╣реИрдВ, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЖрдИрдПрдлрдПрд╕ рдФрд░ рдПрд░рд░ рд░реИрдкрд┐рдВрдЧ рдХреЗ рднрд╛рд░ рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯ рдиреЗ рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рд╡реЗ рджреЛ рдХреЗ рдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдП - рдпрд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рдвреЗрд░ рдХреЛ рдЦреЛрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдирд┐рдпрдорд┐рдд рд╡рд╛рдкрд╕реА рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рддрдХрдиреАрдХреА рддрд░реНрдХ рд╡рд╣рд╛рдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдпреЗ "рдЕрдкрд╡рд╛рдж" рдирд┐рдпрдорд┐рдд рд╡рд╛рдкрд╕реА рдХреЗ рд╕рдорд╛рди рд╣реА рддреЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХрд╛ рдЕрдзрд┐рдХ рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрд╡рд┐рдлреНрдЯ рдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреЛрдЦреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдХреЛрдХреЛ рдПрдкреАрдЖрдИ рдореЗрдВ рд╕реЗ рдХрдИ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ (рдХреЙрд▓рдмреИрдХ рдФрд░ рдЬреАрд╕реАрдбреА) рд╣реИрдВ рдФрд░ рдЙрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВ - рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрд╡рд╛рдж рдмреЗрдХрд╛рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╣рдж рддрдХ рд╕рднреА рдЧреЛ рдХреЛрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИрдВ рдФрд░ рдпреЗ "рдЕрдкрд╡рд╛рдж" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@urandom
рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдЦрд░рд╛рдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде рд╣реИ рдЬреЛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдпрджрд┐ рдЖрдкрдХреА рднрд╛рд╖рд╛ рдореЗрдВ рднрдпрд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рддреЛ рдХреЛрдИ рдЕрдВрддрддрдГ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреА рднрд╛рд╖рд╛ рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ 0% рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдпрд╣ рд╕рд░рд▓ рдЧрдгрд┐рдд рд╣реИред

@ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЯреНрд░рд╛рдЗ -рдХреИрдЪ рдПрдХ рднрдпрд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИ рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Google GoLang рдЯреАрдо рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддреА рд╣реЛред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реВрдВ рдпрджрд┐-рдФрд░-рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдФрд░ рдореБрдЭреЗ рд╡рд╣ рд╕реНрдердЧрд┐рдд-рдЖрддрдВрдХ-рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ рдХреЗ рд╕рдорд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝-рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ) . рдпрд╣ рдХреЛрдб рдореЗрдВ рдЗрддрдирд╛ рд╢реЛрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред

рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред рдЕрдкрд╡рд╛рдж рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

рдФрд░ рд╕реА/рд╕реА++, рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рд╕реЗ рдХреМрди рдЖ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдФрд░ рдпрд╣ рджреЗрдЦрдХрд░ рдирд┐рд░рд╛рд╢рд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдЧреЛ рдЬреИрд╕реА рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдпрд╣ рд╕рд╛рд░рд╛ рдкреНрд░рдЪрд╛рд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрддрдирд╛ рдирдХрд▓реА рдФрд░ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрд╖реЛрдВ, рджрд╕рд┐рдпреЛрдВ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдиреЗ рдЙрд╕ рдЕрдиреБрднрд╡ рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рд╕реАрдЦрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ/рд░рд╕реНрдЯ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬрд╛рд╡рд╛/рд╕реА # рдЬреИрд╕реЗ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╕рдордЭреМрддрд╛ рдХрд░реЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╡реЗ рдмрд╣реБрдд рдкреБрд░рд╛рдиреА рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред

@KamyarM рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рд░реЗрд▓рд╡реЗ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ? рд╡реЛ 'рдХрд┐рд░рдг?

рдЖрдк рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдЗрддрдиреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдпрджрд┐ рдЖрдк рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрдореНрд╣реЛред

@ рд╢рд╛рд▓реЛрдХ рд╢рд╛рд▓реЛрдо рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдирд╣реАрдВ рд╣реИ? рдЕрд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдХрд░реЗрдВ рдФрд░ рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ? рд╡реИрд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдХреЛрдИ рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ (рддреНрд░реБрдЯрд┐рдпреЛрдВ) рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрд╡рд╛рдж рдЖрдИрдУ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдПрдХреНрд╕реЗрд╕ рдпрд╛ рдЦрд░рд╛рдм рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдЖрдк рд╣рд░ рдХреАрдордд рдкрд░ рдЦреБрд╢ рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдИ-рдХреИрдЪ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд╛рд░рдг рд╣реИред рд╕рдВрднрд╡рддрдГ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдорд╛рдирдЪрд┐рддреНрд░ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рдж рднреА рддреЗрдЬ рд╣реЛрддреЗ рд╣реИрдВ (рд╢реВрдиреНрдп-рд▓рд╛рдЧрдд рдЬрдм рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рдЙрдирдХреА рд▓рд╛рдЧрдд рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ) рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдЗрдл рдПрд░рд░ рдЪреЗрдХ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ (рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдпрд╛ рди рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЯреНрд░рд╛рдИ-рдХреИрдЪ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕реЗ рдЕрд▓рдЧ рдмрдирд╛рддрд╛ рд╣реИ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВред

@ShalokShalom рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗрдВ:
https://mortoray.com/2013/09/12/the-true-cost-of-zero-cost-exceptions/

C/C++ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЕрдкрд╡рд╛рдж рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдВ рдФрд░
рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдЪреБрдирд╛рд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ "рдЖрдзреБрдирд┐рдХ" рд╣реИ рдФрд░
рдкрдардиреАрдп рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрдЧрд╡рд╛рди рдХрд╛ рд╢реБрдХреНрд░рд┐рдпрд╛ рдЕрджрд╛ рдХрд░рдирд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ рд╕реА ++ рдХреЗ рдмрд╛рдж)ред

рдордВрдЧрд▓рд╡рд╛рд░, 17 рдЕрдкреНрд░реИрд▓ 2018 рдХреЛ 03:46 рдмрдЬреЗ, рдПрдВрдЯреЛрдиреЗрдВрдХреЛ рдЖрд░реНрдЯреЗрдо рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдФрд░ рд╕реА/рд╕реА++ рд╕реЗ рдХреМрди рдЖ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛, рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдорд╛рди рд╣реИ
рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛? рдФрд░ рдПрдХ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛ рдХреЛ рджреЗрдЦрдХрд░ рдирд┐рд░рд╛рд╢рд╛ рд╣реЛрддреА рд╣реИ
рдЬреИрд╕реЗ рдЧреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреВрд░рд╛ рдкреНрд░рдЪрд╛рд░
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓реНрдп рдЗрддрдиреЗ рдирдХрд▓реА рдФрд░ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧрддреЗ рд╣реИрдВ - рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ
рд╡рд░реНрд╖реЛрдВ рд╕реЗ, рджрд╕рд┐рдпреЛрдВ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдиреЗ рдЗрд╕рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рд╕реАрдЦрд╛
рдЕрдиреБрднрд╡ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ/рд░рд╕реНрдЯ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ред рдЬрд╛рд╡рд╛/рд╕реА# рдЬреИрд╕реЗ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╕рдордЭреМрддрд╛ рдХрд░реЗрдВ
рдЕрдкрд╡рд╛рдж рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╡реЗ рдмрд╣реБрдд рдкреБрд░рд╛рдиреА рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/21161#issuecomment-381793840 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AICzv9w608ea2fwPq_wNpTDBnKMAdAKTks5tpTtsgaJpZM4Oi1c-
.

@kirillx рдореИрдВрдиреЗ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рдореБрдЭреЗ C ++ рдЬреИрд╕реЗ рдЕрдкрд╡рд╛рдж рдЪрд╛рд╣рд┐рдПред рдХреГрдкрдпрд╛ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЛрдмрд╛рд░рд╛ рдкрдврд╝реЗрдВред рдФрд░ рд╕реА рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдФрд░ рднреА рднрдпрд╛рдирдХ рд╣реИ? рди рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рдлрд░ рдФрд░ рдХрдИ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреА рднреА рдХрдореА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХреНрд▓реАрдирдЕрдк рд▓реЙрдЬрд┐рдХ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрдЯреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЧреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╣реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЖрд╕реНрдердЧрд┐рдд рдФрд░ рдХрдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЕрднреА рднреА рд╣реИред рдЕрдиреНрдп рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдПрдВ рднреА рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдЪрд╛рд╣рддреАрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рднреА рдЕрдкрдиреА рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╕реА рд╢реИрд▓реА рдХреЗ рд╕рд╛рде рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреАрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЗрддрдиреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред

рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╡рдХрд╛рд▓рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рд▓реЗрдЦ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП: https://ckwop.me.uk/How-Exceptions-Suck.html

рдЬрд╛рд╡рд╛/рд╕реА++ рд╢реИрд▓реА рдЕрдкрд╡рд╛рдж рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЕрдкрд╡рд╛рдж рдЦрд░рд╛рдм рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмреЗрд╕рд┐рдХ рдХреЗ "рдСрди рдПрд░рд░ рдЧреЛрдЯреЛ" рд╣реИрдВ, рдЧреЛрдЯреЛ рдЙрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрджреГрд╢реНрдп рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡реЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрд╡рд╛рдж рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рджреВрд░ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ рдХреЗ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдереЗ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧреЛрдВ рдиреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ рдФрд░ рдЦрд╛ рд▓рд┐рдпрд╛ рдпрд╛ рд╣рд░ рдЬрдЧрд╣ рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рди рдЫреЛрдбрд╝ рджрд┐рдПред

рдореИрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдкреНрддрд╛рд╣ рдЬрд╛рд╡рд╛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рд╕рд╢рдХреНрдд рд░реВрдк рд╕реЗ рдЧреЛ рдореЗрдВ рдЬрд╛рд╡рд╛-рд╢реИрд▓реА рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛, рдЪрд╛рд╣реЗ рд╡реЗ рдХрд┐рддрдиреЗ рднреА рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреНрдпреЛрдВ рди рд╣реЛрдВред

@lpar рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕рднреА рдирд╣реАрдВ рд╣реИ, рдЬрдмрдХрд┐ рд▓реВрдк, рдЕрдЧрд░ рдПрд▓реНрд╕, рд╕реНрд╡рд┐рдЪ рдХреЗрд╕, рдмреНрд░реЗрдХ рдФрд░ рдЧреЛрдЯреЛ рдЪреАрдЬреЗрдВ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рддрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕реЗ рдХреНрдпрд╛ рдмрдЪрд╛ рд╣реИ?

рдЬрдмрдХрд┐, рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдЧрд░/рдЕрдиреНрдп рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЕрджреГрд╢реНрдп рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдорд╛рд░реНрдХрд░ рдХреЗ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдЕрд▓рдЧ рд╣реИ рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ GoLang рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдХреЙрд▓рд░ рдХреЛ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╡рд╣ рдХреЙрд▓рд░ рдЙрд╕реЗ рдкрд┐рдЫрд▓реЗ рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЖрдЧреЗ (рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╢реЛрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛)? рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдХреЛрдб рдЪрд╛рд╣рд┐рдП рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреМрди рд╕рдВрднрд╛рд▓реЗрдЧрд╛? рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рд╣реИред

рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХреНрдпрд╛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ? рдХрднреА-рдХрднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╣рдо рдХреЗрд╡рд▓ UI рдХреЛ рддреНрд░реБрдЯрд┐ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЗрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХреЗрдВ рдпрд╛ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдв рд╕рдХреЗрдВред

рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рд╡рд╣ рдХреЗрд╡рд▓ try-catch рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд┐рдЫрд▓рд╛ рдХреЙрд▓рд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХреЗред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣ рдЬреНрдпрд╛рджрд╛ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рднреА рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЕрд▓рдЧ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдиреАрдЪреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА 4 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

func myFunc1() error{
  // ...
  if (err){
      return err
  }
  return nil
}

рдпрджрд┐ рдЖрдк рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдареАрдХ рд╣реИред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЧрдИ рдереАред

рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:

x, err := lib.SomeFunc(100, 4)
if err != nil {
  // A
}
// B

рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдХреЛрдб рдкреНрд░рд╡рд╛рд╣ рдмрд┐рдВрджреБ A рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ рдЕрдиреНрдп рд╕реНрдерд╛рди рдХреЛрдб рдкреНрд░рд╡рд╛рд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛, рдмрд┐рдВрджреБ B рд╣реИред рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдиреБрдмрдВрдз рдпрд╣ рднреА рд╣реИ рдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рд╣реИ, рддреЛ x рдХреБрдЫ рдорд╛рдиреНрдп рдорд╛рди рд╣реИ, рд╢реВрдиреНрдп рдпрд╛ рдЕрдиреНрдпрдерд╛ред

рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

x = SomeFunc(100, 4)

рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ, рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ рдФрд░ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдПрдХ goto рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреЛрдб рдХреЗ рдиреАрдЪреЗ рдХрд╣реАрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ... рдпрд╛ рдпрджрд┐ рдЕрдкрд╡рд╛рдж рдкрдХрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд╣реАрдВ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдиреАрдЪреЗред рдпрд╛ рдЖрдк рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЪреВрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рднреА рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХреБрдЫ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдИ рдирд┐рд╣рд┐рдд рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рд╣реИ рдХрд┐ x рдорд╛рдиреНрдп рд╣реИ - рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдпрд╛ рд▓рд╛рдкрддрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрдо рдмрд╛рдд рд╣реИред

рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде, рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣рд░ рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддреА рд╣реИрдВ -- рди рдХреЗрд╡рд▓ рдЦрд░рд╛рдм рдХреЛрдб рдХреЗ рд╕рд╛рде, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ _all_ Java рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рд╣реЛрдЧреАред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЖрдкрдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдк-рдЕрдк рд╕рд╣рд╛рдпрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдпрд╣ рдХреМрди рд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдиреЗ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛, рддрд╛рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдкрдбрд╝реЗ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдореЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рд▓реМрдЯрд╛рдП рдЧрдП рдирд▓ рдФрд░ NullPointerException рдХреА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдкреНрд░рдХреГрддрд┐ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ Optional рд╡рд░реНрдЧ рдХреЛ рдЬрд╛рд╡рд╛ 8 рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рд▓рд╛рдЧрдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд╛рдкрд╕реА рдорд╛рдиред

рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдпрд╣ рд╣реИ рдХрд┐ NullPointerException рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╢реВрдиреНрдп рдореВрд▓реНрдп рд╕реЗ рдореБрдЭреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдореЗрд░рд╛ рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдмрд╕реЗ рдЖрдо рддрд░реАрдХрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмрдбрд╝реЗ рдмреИрдХрдЯреНрд░реИрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реВрдВ рдЬреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИ, рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЬреЛ рдХрд╛рд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧрд▓рддреА рд╕реЗ рдХреЛрдб рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдерд╛ред рдЧреЛ рдореЗрдВ, рдореИрдВрдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╢реВрдиреНрдп рдбреАрд░реЗрдлрд░реЗрдВрд╕ рдкреИрдирд┐рдХ рдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдореБрдЭреЗ рдЧреЛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХрдо рдЕрдиреБрднрд╡ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдХреЛ рджреВрд╕рд░реА рддрд░рдл рдХреЗ рдмрдЬрд╛рдп рдЧреЛ рд╕реЗ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рднреА рдХрд╣ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛-рд╢реИрд▓реА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдорд╕реНрдпрд╛ рд╣реИред

@lpar , рдЧреЛ рдореЗрдВ рд╢реВрдиреНрдп

рдкреИрдирд┐рдХ рдмрд╕ рдареАрдХ рд╣реЛрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдереНрд░реЛ рдХреИрдЪ-рд╕рдХреНрд╖рдо рд╣реИрдВ? рд╕рд╣реА?

рдореБрдЭреЗ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдВрддрд░ рдпрд╛рдж рд╣реИ, рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд╕рд╛рде рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБ рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдШрдмрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВ) рд▓реЗрдХрд┐рди рдереНрд░реЛ рдХреЗ рд╕рд╛рде рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЛ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдкрд╡рд╛рдж рдпрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рдХреЗрд╡рд▓ рдЕрдкрд╡рд╛рдж рдХрд╛ред

рдЧреЛ рдореЗрдВ рд╢реВрдиреНрдп рдбреАрд░реЗрдлрд░реЗрдВрд╕ рдкреИрдирд┐рдХ рдХреНрдпреЛрдВ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ NullPointerException?

рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрд╡ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рдХрднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╣рд░ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореИрдВрдиреЗ рд╕рдордЭрд╛рдпрд╛ред

@lpar рдЦреИрд░ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдирдИ рдмрд╛рдд рд╣реИ (рдкрд┐рдЫрд▓реЗ 5 рд╕рд╛рд▓) рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реА # рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдиреЗрд╡рд┐рдЧреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рд╣реИ рд▓реЗрдХрд┐рди рдЧреЛ рдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдШрдмрд░рд╛рд╣рдЯ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рднреА рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рдЙрди рдмрджрд╕реВрд░рдд рдиреЗрд╕реНрдЯреЗрдб if-not-nil-else рдХрдердиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдЬрдм рддрдХ рдЖрдк рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдорд╛рдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╢реВрдиреНрдп рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рддреЛ рдмрдпрд╛рди рдЕрдЧрд░ рдХреЛрдИ рдмрджрд╕реВрд░рдд рдШреЛрдВрд╕рд▓рд╛ рдирд╣реАрдВ рд╣реИред

рдирд▓ рдбреАрд░реЗрдлрд░реЗрдВрд╕ рдПрдХ рдмреБрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдерд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрдХрдбрд╝ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЧреЛ рдФрд░ рдЬрд╛рд╡рд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдЖрдкрдХреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рдорд┐рд▓рддрд╛ рд╣реИред рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреИрд╕реЗ рдмреЗрдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдореИрдВ рдЕрдм рдирд╣реАрдВред рдЖрдк рд╕рд╣реА рдЬрдЧрд╣ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рд╣реБрдЖ рдерд╛ред рд╕реА # рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдореЗрдВ рдЙрд╕ рддрд░рд╣ рдХреА рджреБрд░реНрдШрдЯрдирд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЖрдо рддреМрд░ рдкрд░ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд╢реВрдиреНрдп рд╡рд┐рдЪрд▓рди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рд╕реА рд╕реЗ рд╕реАрдЦрдиреЗ рдХреЛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

@lpar

рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрд╡ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рдХрднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╣рд░ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореИрдВрдиреЗ рд╕рдордЭрд╛рдпрд╛ред

рдпрд╣ рдЖрдХрд╕реНрдорд┐рдХ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╢реВрдиреНрдп/рд╢реВрдиреНрдп рдкрд░ рдЧреЛ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИред рдореИрдВрдиреЗ рдЧреЛ рдХреЛрдб рдореЗрдВ рдХрдИ рд╢реВрдиреНрдп рдбреАрд░реЗрдлрд░реЗрдВрд╕ рдХреНрд░реИрд╢ рджреЗрдЦреЗред рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕реА #/рдЬрд╛рд╡рд╛ рдореЗрдВ рд╢реВрдиреНрдп рд╡рд┐рдЪрд▓рди рдХреЗ рд╕рдорд╛рди рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЧреЛ рдореЗрдВ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рдЬреЛ рдорджрдж рдХрд░рддрд╛ рд╣реИ (рд╕реА # рднреА рдЙрдирдХреЗ рдкрд╛рд╕ рд╣реИ) рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕реНрд╡рд┐рдлреНрдЯ рдХреЛ рджреЗрдЦреЗрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ throws рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдлрдВрдХреНрд╢рди рдлреЗрдВрдХ рдирд╣реАрдВ рд╕рдХрддрд╛ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рд░рд┐рдЯрд░реНрди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рд╢рд╛рдпрдж рдХреБрдЫ рд░рдЬрд┐рд╕реНрдЯрд░ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдПрд░рд░ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдлрдВрдХреНрд╢рди рдереНрд░реЛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд░рд┐рдЯрд░реНрди рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдПрд░рд░ рд╡реИрд▓реНрдпреВ рд╣реЛрддреА рд╣реИред рддреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рд╕рдЯреАрдХ рдЬрдЧрд╣ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд╛рди рд╣реИрдВ рдФрд░ рд╕реНрдЯреИрдХ рдЕрдирдЗрдВрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡реЗ рддрдм рддрдХ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдЖрдк рдЙрд╕реЗ рдкрдХрдбрд╝ рдирд╣реАрдВ рд▓реЗрддреЗред

рдпрд╛ рдЬрдВрдЧ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реНрдкрд╖реНрдЯ рд╕рд╢рд░реНрдд рдмрдпрд╛рди рдХреЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рдЯрди рдЕрдЪреНрдЫрд╛рдИ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рдЧреЛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред

рдпреЗ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдПрдВ рджреЛрдиреЛрдВ рд╕рдорд╛рдзрд╛рди (рд╕реА рдФрд░ рдЬрд╛рд╡рд╛) рд▓реЗрддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рддреА рд╣реИрдВред рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ + рддреНрд░реБрдЯрд┐ рдорд╛рди рдФрд░ рд╕реА рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рдкреНрд░рд╡рд╛рд╣ + рдХреЛрдИ рдмрджрд╕реВрд░рдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдирд╣реАрдВ рдЬреЛ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрдирд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдорд┐рд▓рддреЗ рдЬреБрд▓рддреЗ рд╣реИрдВред рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рд╣реИред рдЕрдиреНрдпрдерд╛ рднрд╛рд╖рд╛рдПрдВ рдЙрдирдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░ рджреЗрдВрдЧреАред рдЦрд╛рд╕рдХрд░ рд╕реА ++ рдХреЗ рдмрд╛рджред

рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреИрд╕реЗ рдмреЗрдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдореИрдВ рдЕрдм рдирд╣реАрдВред

рдореИрдВрдиреЗ рдХрд╣рд╛ "рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░"ред рдЬреИрд╕рд╛ рдХрд┐, рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рдпрд╣ рджрд░реНрдЬрдиреЛрдВ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рдВрдмреА рд╣реИред

рдпрд╣ рдЖрдХрд╕реНрдорд┐рдХ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╢реВрдиреНрдп/рд╢реВрдиреНрдп рдкрд░ рдЧреЛ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИред

рддрдм рдЖрдк рдирд╣реАрдВ рд╕реБрди рд░рд╣реЗ рд╣реИрдВред рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рд╣рд┐рдд рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВред

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реНрдкрд╖реНрдЯ рд╕рд╢рд░реНрдд рдмрдпрд╛рди рдХреЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдареАрдХ рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ -- рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░-рдкреНрд░рд╕рд╛рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЕрд╕рд╣рдордд рд╣реИрдВред

рдХреНрдпрд╛ рд░рд╕реНрдЯ рдпрд╛ рд╕реНрд╡рд┐рдлреНрдЯ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж рдЬрд╛рд╡рд╛ рдЬреИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рдореИрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рдЬрд┐рд╕реЗ рдкреНрд░рд╢реНрди рдореЗрдВ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИред

@ рдХрд╛рдордпрд╛рд░рдПрдо рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

https://fsharpforfunandprofit.com/posts/the-option-type/

рдФрд░ рдареАрдХ рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ -- рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░-рдкреНрд░рд╕рд╛рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдЪ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рдкреИрдХреЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рджреВрд╕рд░реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдкреИрдХреЗрдЬ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдЕрдм _I_ рдХреЛ рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдореИрдВ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдпрд╛ рдирд╣реАрдВред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рдпрд╣ рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдкрд╣рд▓реВ рд╣реИ; рдЕрдзрд┐рдХрд╛рдВрд╢ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдкрдиреЗ рд╡рд┐рд╡реЗрдХ рд╕реЗ рдЪреБрди рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрд╡рд╛рдж, рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рд╕реЗ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдкреЗрдХреНрд╖рд┐рдд рдпрд╛ рдЕрдиреНрдпрдерд╛ред

рдореИрдВрдиреЗ рдХрд╣рд╛ "рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░"ред рдЬреИрд╕рд╛ рдХрд┐, рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рдпрд╣ рджрд░реНрдЬрдиреЛрдВ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рдВрдмреА рд╣реИред

рдФрд░ рд╕реИрдХрдбрд╝реЛрдВ рдЧреЛрд░реЛрдЗрди рдХреЗ рд╕рд╛рде рд╡рд┐рд╢рд╛рд▓ рдЧреЛ рдирд┐рд╢рд╛рди рдХрд┐рд╕реА рддрд░рд╣ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ? рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдБ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ рдФрд░ рдЧреЛ рдпрд╣рд╛рдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВред рдФрд░ рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реНрдЯреИрдХ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ рдЬрд╣рд╛рдВ рдпрд╣ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ред рд╕реА # рдФрд░ рдЧреЛ рдЯреНрд░реИрд╕ рдиреЗ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрдИ рдмрд╛рд░ рдорджрдж рдХреАред

рддрдм рдЖрдк рдирд╣реАрдВ рд╕реБрди рд░рд╣реЗ рд╣реИрдВред рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рд╣рд┐рдд рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрдврд╝рд╛, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП net.ParseIP )ред рдпрджрд┐ рдЖрдк рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдорд╛рди рд╢реВрдиреНрдп/рд╢реВрдиреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рддреЛ рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЧреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ рдФрд░ рд╕реА # рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╢реВрдиреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЪреНрдЫрд╛ рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рдж рдпрд╛ рдХреБрдЫ рдмрддрд╛рдП рдмрд┐рдирд╛ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ, рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдЗрд╕рдХреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рддрдм рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реАрд▓реНрдб рдкреЙрдЗрдВрдЯрд░/рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдВрддрд░рд┐рдХ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдХреНрд╖рд╛/рд╕рдВрд░рдЪрдирд╛ рдлрд╝реАрд▓реНрдб рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЖрдк рдкрд╣рд▓реЗ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдкрд╣реБрдВрдЪред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдФрд░ рдЧреЛ рдореЗрдВ рдХреБрдЫ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдХрдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рджреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдирд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдереЛрдбрд╝реА рдорджрдж рдХрд░рддреА рд╣реИрдВ - рдЙрдкрдпреЛрдЧреА рдЦрд╛рд▓реА рдореВрд▓реНрдп рдФрд░ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ред рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдФрд░ рдареАрдХ рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ -- рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░-рдкреНрд░рд╕рд╛рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЕрд╕рд╣рдордд рд╣реИрдВред

рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЕрдиреНрдпрдерд╛ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреЗ рд▓реЛрдЧ рдЬрд╛рд╡рд╛/рд╕реА#/рд╕реА++ рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рдЗрддрдиреЗ рджреГрдврд╝ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирд╕реЗ рдереЛрдбрд╝рд╛ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ throws рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдареАрдХ рд╕реЗ рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЬрд╣рд╛рдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬрдВрдЧ рдореЗрдВ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╡реЗ рджреЛрдиреЛрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╣реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред

рдФрд░ рд╕реИрдХрдбрд╝реЛрдВ рдЧреЛрд░реЛрдЗрди рдХреЗ рд╕рд╛рде рд╡рд┐рд╢рд╛рд▓ рдЧреЛ рдирд┐рд╢рд╛рди рдХрд┐рд╕реА рддрд░рд╣ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ?

рдЧреЛ рдХреЗ рд╕рд╛рде, рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдХреЗ рдЙрдирд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдЖрдк рдПрдХ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪреБрдирддреЗ рддрдм рддрдХ рдХреЛрдИ рдмреИрдХрдЯреНрд░реЗрд╕ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдЦреИрд░, рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрдиреБрднрд╡ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдЗрд╕ рддрдереНрдп рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд╛рд╡рд╛ 8 рдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗред

рдЗрд╕ рдереНрд░реЗрдб рдиреЗ рдпрд╣рд╛рдВ рдЧреЛ рдХреА рдЦреВрдмрд┐рдпреЛрдВ рдФрд░ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдФрд░ рдЗрд╕рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рдЬрд┐рд╕рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореИрдВ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ:

https://elixirforum.com/t/discussing-go-split-thread/13006/2

рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдКрдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред

рд╣рдо рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдРрд╕реЗ рд╕реНрдирд┐рдкреЗрдЯ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:

a, err := fn()
if err != nil {
    return err
}
use(a)
return nil

рдЖрдЗрдП рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХ рджреЗрдВ рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рдЪрд░ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ) рдХреЛ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдмрди рдЬрд╛рдПрдЧрд╛:

a := fn()
use(a)

// or just

use(fn())

рдХрдВрдкрд╛рдЗрд▓рд░ err рдХреЛ рдирд┐рд╣рд┐рдд (рдЕрджреГрд╢реНрдп) рдЪрд░ рдореЗрдВ рдмрдЪрд╛рдПрдЧрд╛, рдЗрд╕реЗ nil рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ (рдпрджрд┐ рдЧрд▓рддреА == рд╢реВрдиреНрдп) рдпрд╛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВ (рдпрджрд┐ рдЧрд▓рддреА! = рд╢реВрдиреНрдп) рдФрд░ рдЕрдВрдд рдореЗрдВ рд╢реВрдиреНрдп рд▓реМрдЯрд╛рдПрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓реЗрдХрд┐рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдФрд░ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ред

рдпрджрд┐ err рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдЗрд╕реЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЪрд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

a, err := fn()
if err != nil {
    doSomething(err)
} else {
    use(a)
}
return nil

рддреНрд░реБрдЯрд┐ рдХреЛ рдЗрд╕ рддрд░рд╣ рджрдмрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

a, _ := fn()
use(a)

рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рджреБрд░реНрд▓рдн (рд╢рд╛рдирджрд╛рд░) рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реЛрдЧрд╛ (рдЬреИрд╕реЗ рдЕрднреА):

err1, err2 := fn2()
if err1 != nil || err2 != nil {
    return err1, err2
}
return nil, nil

рдпрд╣ рдореЗрд░рд╛ рддрд░реНрдХ рднреА рд╣реИ - рд╣рдо рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓рд╛ рд╣реИред рдФрд░ рд╢рд╛рдпрдж рдЗрд╕реЗ рдХреБрдЫ рд╕рдВрджрд░реНрдн рджреЗрдВред рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрдн рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЧреЛ рдЬреИрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд╛рде рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдФрд░ рд╕рд░рд▓ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рддреЗред рдФрд░ рдареАрдХ рдпрд╣реА рдмрд╛рдд рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рд╕рдВрддреБрд▓рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реА рд╣реИрдВред

рддреЛ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ "рдЖрдЗрдП рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рдЪрд░ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ) рдХреЛ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛" рд▓реЗрдХрд┐рди рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдореБрдЭреЗ рдЦрд░рд╛рдм рдХрд░рддрд╛ рд╣реИред рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рдпрд╣реА рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЙрдирд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рдЗрддрдиреЗ рдЦрд┐рд▓рд╛рдл рд╣реИрдВред рд╡реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдмрджрд▓рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдмреБрд░реА рдмрд╛рдд рд╣реИ.

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕реНрд╡рд┐рдлреНрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛

func a() throws {}
func b() throws {
  a()
}

a рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП try a() рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк throws рдХреЛ b throws рд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ try a() рд╕рд╛рде рднреА рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ b рдЕрдВрджрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдЙрджреНрджреЗрд╢реНрдп-рд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╡рд╛рдЪрд╛рд▓рддрд╛ рджреЛрдиреЛрдВ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╛рдлреА рд╣рдж рддрдХ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рддрд░рд╣ рд╣реИ рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИред рдореБрдЭреЗ рдЬреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рд╡рд╣ try, catch рд╕рд╛рдорд╛рди рд╣реИ рдЬреЛ рд╕реНрд╡рд┐рдлреНрдЯ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рддреЛ рдореИрдВ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреВрдВрдЧрд╛ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдирд╛ рд╣реИред рддрд╛рдХрд┐ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рд╕реНрд╡рдпрдВ рд╣реА рдмрддрд╛рдП рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рдЧреЛ рдЕрдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ред рдЖрдк _ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рд░ рдЫреЛрдЯреА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ, printf ред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдХреБрдЫ рд▓реЙрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреЗ рдХрд╖реНрдЯрдкреНрд░рдж рдЖрдпрд╛рдд рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдЯреВрд▓реАрдВрдЧ рд╕реЗ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ред

рд╕рдордп рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЕрднреА рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВред рдЬреИрд╕реЗ рдЕрднреА рдЬрд╛рдУ, рддреНрд░реБрдЯрд┐ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрдВред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдереАред рдпрд╣ рдХреБрдЫ рднреА рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪреБрдкрдЪрд╛рдк рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрдд рдФрд░ рдЖрд╕рд╛рди рдХреИрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╛рдорд▓реЗ рдереЗ рдЬрдм рдореИрдВ рдЖрд▓рд╕реА рдерд╛ рдпрд╛ рд╕рдордп рд╕реЗ рдмрд╛рд╣рд░ рдерд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдерд╛ рдХрд┐ рдЙрд╕реА рдХреЛрдб рдореЗрдВ рдПрдХ рдмрдЧ рдХреЗ рд╕рд╛рде рдорд╛рд░рд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдХрд┐рд╕реА рдиреИрджрд╛рдирд┐рдХ тАЛтАЛтАЛтАЛрдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реБрдЖред рдХрдо рд╕реЗ рдХрдо рдЗрд╕реЗ рд▓реЙрдЧрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред

рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд▓реЛрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдЬрдЧрд╣ try, catch(...) ред рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдРрд╕рд╛ рдХрд░рдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХреБрдЫ рд▓реЛрдЧ рдЬреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХрд╛ рднреНрд░рдо рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдирдЪрд╛рд╣реЗ рдЕрдкрд╡рд╛рдж рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдШрдмрд░рд╛рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╕реНрдореГрддрд┐ рд▓рд╛рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ "рд░рдХреНрд╖рд╛рддреНрдордХ" рдХреЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рди рд╣реЛред рдореЗрд░реЗ рд▓рд┐рдП рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛ рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд╛рдорд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд┐рд░реНрдгрдп рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╣рд╛рдВ рдЖрддрдВрдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╣реИрдВрдбрд▓ рди рдХрд░рдиреЗ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдкреИрдирд┐рдХ рдЙрддреНрдкрдиреНрди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рдпрд╣ рдЧреЛрд░реЛрдЗрди рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ? рд╢рд╛рдпрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдордЭреМрддреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?

@ рдирд┐рдХ-рдХреЛрд░реНрд╕рд╛рдХреЛрд╡ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ (рдпрд╣ рдореБрджреНрджрд╛) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ:

рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╕рд╛рди (рд╢рд╛рдпрдж рдмрд╣реБрдд рдЖрд╕рд╛рди) рд╣реИ (рджреЗрдЦреЗрдВ #20803)ред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрдИ рдореМрдЬреВрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд╕рдВрд╢реЛрдзрд┐рдд рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, #16225, #18721, #21146, #21155)ред рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред

рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рднреА рджреЗрдЦреЗрдВред

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдкреНрд░рдЧрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд▓реВрдк рдореЗрдВ рдЪрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп) рд╣рдореЗрдВ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЧрдпрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреНрдпрд╛ рд╣реИред рдкреВрд░реА рдмрд╛рдд рдкрдврд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рддреАрди-рд╕реЗрдХрдВрдб рдХреА рд╕реБрдирд╣рд░реА рдордЫрд▓реА рд╕реНрдореГрддрд┐ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд▓рдЧрддреА рд╣реИ (рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд/рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рдЕрдЪреНрдЫреЗ рд░рдЪрдирд╛рддреНрдордХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдЕрдкрд╡рд╛рдж/рдЖрддрдВрдХ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рджреЛрд╣рд░рд╛ рд░рд╣рд╛ рд╣реИ)ред

рдПрдХ рдФрд░ рдмрд╛рдЗрдХрд╢реЗрдб:

func makeFile(url string) (size int, err error){
    rsp, err := http.Get(url)
    try err
    defer rsp.Body.Close()

    var data dataStruct
    dec := json.NewDecoder(rsp.Body)
    err := dec.Decode(&data)
    try errors.Errorf("could not decode %s: %v", url, err)

    f, err := os.Create(data.Path)
    try errors.Errorf("could not open file %s: %v", data.Path, err)
    defer f.Close()

    return f.Write([]byte(data.Rows))
}

try рдЕрд░реНрде рд╣реИ "рдЦрд╛рд▓реА рдорд╛рди рдирд╣реАрдВ рддреЛ рд╡рд╛рдкрд╕реА"ред рдЗрд╕рдореЗрдВ рдореИрдВ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ errors.Errorf nil рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрдм рдЧрд▓рддреА рд╢реВрдиреНрдп рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрддрдиреА рд╣реА рдмрдЪрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрд┐рддрдиреА рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдЖрд╕рд╛рди рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдХреЗ рд░рд╣рддреЗ рд╣реИрдВред

рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕реНрдХреИрдирд░ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреА рд╣реИрдВред

type Scanner struct{
    err error
}
func (s *Scanner) Scan() bool{
   if s.err != nil{
       return false
   }
   // scanning logic
}
func (s *Scanner) Err() error{ return s.err }

рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╕реЗ рдореБрдХреНрдд рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдХрд┐рд╕реА рд░рдЪрдирд╛рддреНрдордХ рдФрд░ рд╡рд┐рдЪрд┐рддреНрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рдпрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдирд┐рдпрдВрддреНрд░рдг рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЧрд▓рддреА рдХреЛ рдХреЛрд╢рд┐рд╢ {} рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЧрд▓рддреА рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рд╕реЗрдЯ рд╣реИ - рдХреЛрд╢рд┐рд╢ {} рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдмреНрд▓реЙрдХ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреВрд░реА рдмрд╛рдд рдХрд░реАрдм рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЬреЛ if err != nil break рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рдж рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЧрд▓рддреА рдЕрд╕рд╛рдЗрди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдЬреИрд╕реЗ:

...
try(err) {
   err = doSomethig()
   err, value := doSomethingElse()
   doSomethingObliviousToErr()
   err = thirdErrorProneThing()
} 
catch(err SomeErrorType) {
   handleSomeSpecificErr(err)
}
catch(err Error) {
  panic(err)
}

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реА ++ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рдж рдореИрдиреНрдпреБрдЕрд▓ if err != nil {...} рд╕реЗ рднреА рдкреНрд░рд╕рд┐рджреНрдз рдФрд░ рдХреНрд▓реАрдирд░ рд╣реИред

@рдЬреИрд╕рд╛

рд╕реНрдХреИрдирд░ рдкреНрд░рдХрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╣рдо рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдордЬрд╛рдХ рди рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдХреГрдкрдпрд╛ред

@carlmjohnson

рдпрджрд┐ рд╣рдо рд╕рд╛рдзрд╛рд░рдг рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдирд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдПрдХ рд▓рд╛рдЗрди рдмреНрд▓реЙрдХ рдХреА рд╢реБрд░реБрдЖрдд рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

func makeFile(url string) (size int, err error){
    rsp, err := http.Get(url)
    if err != nil return err
    defer rsp.Body.Close()

    var data dataStruct
    dec := json.NewDecoder(rsp.Body)
    err := dec.Decode(&data)
    if err != nil return errors.Errorf("could not decode %s: %v", url, err)

    f, err := os.Create(data.Path)
    if err != nil return errors.Errorf("could not open file %s: %v", data.Path, err)
    defer f.Close()

    return f.Write([]byte(data.Rows))
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд▓реНрдкрдирд╛ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдХрд╛рдлреА рднреЛрд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :))

Block = "{" StatementList "}" | "return" Expression .

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдЧрд░ рдЧрд▓рддреА рд╕реЗ рддреАрди рдХреА рдмрдЬрд╛рдп рдПрдХ рд▓рд╛рдЗрди рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕рд┐рдВрдЧ рд░рд┐рдЯрд░реНрди рд╕рд┐рд░реНрдл gofmt рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред

@urandom

рдПрдХ рдмреЙрдХреНрд╕ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЖрдЧреЗ рдПрдХрддреНрд░рд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдЕрд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрдн рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреА рдХрдореА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╕реНрдХреИрдирд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рдкреВрд░реЗ "рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдп" рдордВрддреНрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрдврд╝рд╛ рд╣реИ:

  1. рдпрд╣ рд╣рд░ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдореЗрдВ рдмреЗрдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░-рдкреНрд▓реЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕реА рддреНрд░реБрдЯрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХрдИ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдЗрд╕рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
  2. рдпрд╣ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрдкрд░рд┐рдЪрд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд░рд┐рдЪрдп рдХреЗрд╡рд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЬрд░реВрд░рдд рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХреА рдХрдореА рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВред
  3. рдпрд╣ рддрд░реНрдХ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓рд╛рдн рдХреЗ рдЗрд╕рд╕реЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм (рдЬрдЯрд┐рд▓ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣) рд▓реЗрдХрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред
  4. рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЧрдгрдирд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрдЧрд╛ред рд╣рд░ рдХреЙрд▓ рдХреЛ рдмреЗрдХрд╛рд░ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдкрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рджрд┐рдпреЛрдВ рдкрд╣рд▓реЗ рд╣реБрдЖ рдерд╛ред
  5. рдпрд╣ рдареАрдХ рдЙрд╕реА рдЬрдЧрд╣ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереАред рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рдХреБрдЫ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрд╛рд░реНрд╕ рдпрд╛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЙрд▓ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛрдЧреАред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдкрд╣рд▓рд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдЖрдк рдХреИрд╕реЗ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╣реБрдИ? рдпрд╣ рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдпрд╛ рдХреНрд░рдордмрджреНрдз рдХрд░ рд░рд╣рд╛ рдерд╛? "рдЖрдИрдУ рддреНрд░реБрдЯрд┐", "рдЯрд╛рдЗрдордЖрдЙрдЯ" - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмреЗрдХрд╛рд░ рд╣реЛрдВрдЧреАред рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдирд╛рдо)ред рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдмреЗрд╣рддрд░ рдпрд╣реА рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдкреВрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдЦрд┐рд▓рд╛рдл рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЧрдгрдирд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрдЧрд╛ред

рдмреЗрдВрдЪрдорд╛рд░реНрдХ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдЧрдгрдирд╛ рд╕рдВрд╕рд╛рдзрди" рдХреНрдпрд╛ рд╣реИ?

рдпрд╣ рдареАрдХ рдЙрд╕реА рдЬрдЧрд╣ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереАред

рдирд╣реАрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИрдВ

рдХрдИ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдЗрд╕рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
рдпрд╣ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрдкрд░рд┐рдЪрд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ
рд╕реНрдХреИрдирд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рдкреВрд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрдврд╝рд╛ рд╣реИ "рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореВрд▓реНрдп рд╣реИрдВ"

рдореЗрд░реА рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рдЖрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВред рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдирд┐рдпрдорд┐рдд рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдмрд╛рд░реАрдХреА рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ _read_ рдХреА рд╕рдмрд╕реЗ рдмреБрд░реА рдЪреАрдЬ рдХреЗ рдмрдЬрд╛рдп рд╕рдмрд╕реЗ рдмреБрд░реА рдЪреАрдЬ рд╣реЛред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдвреЗрд░ рдореЗрдВ рдЕрдкрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ, рдЙрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдкрдврд╝ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдЬрдмрдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрджреНрджрд╛ рддреНрд░реБрдЯрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИред рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╕ рдЙрд╕ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрддрд░ рдкрд░ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдХреЗрд▓реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рд╕реНрддрд╛рд╡

рдЧреИрд░-рд╢реВрдиреНрдп error рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдШрдмрд░рд╛рд╣рдЯ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ _! рдЯреЛрдХрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░реЗрдВ

val, err := something.MayError()
if err != nil {
    panic(err)
}

рдмрди рд╕рдХрддрд╛ рд╣реИ

val, _! := something.MayError()

рддрдерд╛

if err := something.MayError(); err != nil {
    panic(err)
}

рдмрди рд╕рдХрддрд╛ рд╣реИ

_! = something.MayError()

рдмреЗрд╢рдХ, рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддреАрдХ рдмрд╣рд╕ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдореИрдВрдиреЗ _^ , _* , @ , рдФрд░ рдЕрдиреНрдп рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реБрдЭрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ _! рдЪреБрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рд╕рдмрд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдЧрд╛ред

рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ, _! (рдпрд╛ рдЪреБрдирд╛ рдЧрдпрд╛ рдЯреЛрдХрди) error рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрд╕ рджрд╛рдпрд░реЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ nil рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рд╕рдордп рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, nil рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рдЧреИрд░-рд╢реВрдиреНрдп error рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдШрдмрд░рд╛рд╣рдЯ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ _! (рдпрд╛, рдлрд┐рд░ рд╕реЗ, рдЯреЛрдХрди рдЪреБрдирд╛ рдЧрдпрд╛) рдЬрд╛рдиреЗ рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдирд╛рдо рдЯрдХрд░рд╛рд╡ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣ рдИрдерд░ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗрд╡рд▓ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рдорд╛рдиред рдпрджрд┐ рдПрдХ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдкрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдФрдЪрд┐рддреНрдп

рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд▓реЛрдЪрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╡рд╛рдЪрд╛рд▓рддрд╛ рд╣реИред API рд╕реАрдорд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдХреЛрдИ рдмреБрд░реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИрдВред рдПрдкреАрдЖрдИ рд╕реАрдорд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд░реНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдПред рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЛрдб рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрдХрдиреАрдХ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬрдВрдЧрд▓реА рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЧреЛ рдХреЗ рдкрд╛рд░реНрд╕рд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдХрднреА-рдХрднреА, рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧреАред рдЬрдм рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдШрдмрд░рд╛рдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдЬрдЯрд┐рд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдореЗрдВ, рдХрднреА-рдХрднреА рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреИрдирд┐рдХ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рдЕрдзрд┐рдХ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рдХрд╣реАрдВ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред рдЗрди рд╕рднреА рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдШрдмрд░рд╛рд╣рдЯ рд╕реЗ рдмрдЪрдирд╛ рдЧреЛ рдХрд╛ рджрд░реНрд╢рди рд╣реИред рд╡реЗ рдПрдкреАрдЖрдИ рд╕реАрдорд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реЗ рднрд╛рд╖рд╛ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рддред рдирд┐рдЬреА рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдирд┐рдХреНрд╕ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ, рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рдХреЛрдб рдХреЛ рдХреНрд▓реАрдирд░ рдФрд░, рдпрдХреАрдирди, рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "if-error-panic" рдлреЙрд░реНрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ _! (рдпрд╛ @ , рдпрд╛ `_^, etc...) рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рдЖрд╕рд╛рди рд╣реИред рдПрдХ рдЯреЛрдХрди рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдЙрд╕ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ/рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛/рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ
  2. рдЕрдЧрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
  3. рдЕрдЧрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рдХрд┐рд╕реА рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд░рд╣, рджреБрд░реБрдкрдпреЛрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рднреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрддрдВрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рд╕рдореБрджрд╛рдп рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЬреЛрдбрд╝ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рддреЗрдЬреА рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдореИрдВ рдХреЛрдб рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдЬрдм рдореИрдВ рдЦрд┐рд▓реМрдирд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ "рдЗрдл-рдПрд░рд░-рдкреИрдирд┐рдХ" рдлреЙрд░реНрдо рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рдХрдо рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдХреЛрдб рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдПрдХ рдмрд╛рд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдб рдореЗрдВ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЙрдЪрд┐рдд рд╕реАрдорд╛рдУрдВ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реВрдВред рдореИрдВ рдкреНрд░реЛрдбрдХреНрд╢рди рдХреЛрдб рдореЗрдВ рдлреНрд░реА рдкреИрдирд┐рдХ рдирд╣реАрдВ рдЫреЛрдбрд╝реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдШрдмрд░рд╛рд╣рдЯ рдХрд┐рд╕реА рдЕрдиреНрдп рдирд╛рдо рд╕реЗ рдХреЗрд╡рд▓ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рдФрд░ рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рдж рдЕрд╕рд╛рдзрд╛рд░рдг рд╣реИрдВред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рджреЗрдХрд░ рдФрд░ рдЕрдзрд┐рдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред

@carlmjohnson рджреЛ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕рдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рдЖрддрдВрдХ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдпрд╛
  2. рдЖрддрдВрдХ рдХреЗ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рднрд╛рд╖рд╛ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ 1 рд╣реИред
рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рднреА рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ "рдЖрддрдВрдХ рдХрд┐рд╕реА рдЕрдиреНрдп рдирд╛рдо рд╕реЗ рд╕рд┐рд░реНрдл рдЕрдкрд╡рд╛рдж рд╣реИрдВ"ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╣рд╛рде рд╣рд┐рд▓рд╛рдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдЖрддрдВрдХ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмреАрдЪ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдШреБрдЯрдиреЗ рдХреЗ рдмрд▓ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА "рдШрдмрд░рд╛рд╣рдЯ рдЦрд░рд╛рдм рд╣реИрдВ" рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрддрдВрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рднрд╛рд╡рдирд╛рдПрдВ рдЗрд╕ рддрдереНрдп рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИрдВ рдХрд┐ рдЖрддрдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреЛрдиреЛрдВ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдЪрд░рдг (рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛) рдореЗрдВ рдЧрд╣рди рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдирд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЧрд╣рди рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рди рдХреЗрд╡рд▓ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЙрдкрдпреЛрдЧ рд▓рдЧрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдЙрдкрдпреЛрдЧ рднреА рд╣реИред

рджрд╣рд╢рдд рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╡рд╛рдж рдХрд░рддреА рд╣реИ:

рдпрд╣рд╛рдБ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рдЬрд┐рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рддреИрдпрд╛рд░ рдирд╣реАрдВ рдерд╛

рдХреЛрдб рдореЗрдВ рд╣рдореЗрд╢рд╛ рдРрд╕реЗ рд╕реНрдерд╛рди рд╣реЛрдВрдЧреЗ рдЬрд╣рд╛рдБ рдпрд╣ рд╕рддреНрдп рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЬрд▓реНрджреАред рдЧреЛ рдХреЛ рдкрд╣рд▓реЗ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЕрдиреБрднрд╡ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ред рдЕрд╡рд╛рдВрдЫрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЬрдм рддрдХ рдХрд┐ рдЖрдк рд╕реНрд░реЛрдд рдХреЗ рдХрд░реАрдм рдПрдХ рд╕реНрддрд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдФрд░ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрддреНрддрд░реЛрддреНрддрд░ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рднрд╛рд╖рд╛ рдореЗрдВ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕рдмрд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЖ рд╕рдХрддрд╛ рд╣реВрдВред рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп, рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрдореА рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реБрдП, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдкреВрд░реЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдореЙрдбрд▓ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ "рдЧреЛ рдХреЛрдб рдХреЛ рдПрдкреАрдЖрдИ рд╕реАрдорд╛рдУрдВ рд╕реЗ рдШрдмрд░рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП"ред рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рджреБрд░реНрд▓рдн рдЕрд╡рд╕рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЙрд▓реНрд▓рдВрдШрди)ред рднрд╛рд╖рд╛ рдореЗрдВ рдпрд╣ рдЬреЛрдбрд╝ рдЙрд╕ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдХрд╛ рд╕реНрдерд╛рди рдирд╣реАрдВ рд▓реЗрдЧрд╛ред рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдХреЛрдб рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рд╕реНрдХреЗрдЪрд┐рдВрдЧ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

var1, _! := trySomeTask1()
var2, _! := trySomeTask2(var1)
var3, _! := trySomeTask3(var2)
var4, _! := trySomeTask4(var3)

рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ

var1, err := trySomeTask1()
if err != nil {
    panic(err)
}
var2, err := trySomeTask2(var1)
if err != nil {
    panic(err)
}
var3, err := trySomeTask3(var2)
if err != nil {
    panic(err)
}
var4, err := trySomeTask4(var3)
if err != nil {
    panic(err)
}

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдХрдореА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЧреЛ рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ рдФрд░ рдЬрд╛рд╡рд╛ рдпрд╛ рдкрд╛рдпрдерди рдЖрджрд┐ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЗ рдмреАрдЪ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдореМрд▓рд┐рдХ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ (рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдирд╣реАрдВ рд╣реИ)ред рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╣ рд╡рд╣реА рд╣реИред

рдмреЗрд╢рдХ рдЖрддрдВрдХ рдХрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╡реИрдз рд╕реНрдерд╛рди рд╣реИред рдЖрддрдВрдХ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдиреНрдпрдерд╛ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдкрдХреА рдЕрдкрдиреА рдЧрд▓рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдШрдмрд░рд╛рддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдпрджрд┐ рдЖрдк рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ nil рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЖрджрд┐ред рд╡реЗ рдЪреАрдЬреЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИрдВ-рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд╣реАрдВ, рдЬреИрд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдбрд╛рдЙрди рд╣реЛрдирд╛ рдпрд╛ рдЦрд░рд╛рдм рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓-рдЗрд╕рд▓рд┐рдП рд╡реЗ рдмрд╕ рдШрдмрд░рд╛рддреЗ рд╣реИрдВ рдФрд░ рдвреЗрд░ рдХреЛ рдЙрдбрд╝рд╛ рджреЛред рдЧреЛ рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рддрд░рд╣ рдШрдмрд░рд╛рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИ рдФрд░ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдПрдХ рдШрдмрд░рд╛рд╣рдЯ рд╣реИред

рд▓реЛрдЧ рдХрднреА-рдХрднреА рд╕реНрдЯреИрдХ рдХреЛ рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдкрдардиреАрдпрддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЗ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред

рдЧреЛ рдкреИрдирд┐рдХреНрд╕ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрдкрд╡рд╛рдж рдХрд╛рдлреА рд╣рдж рддрдХ рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рдорд╛рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдФрд░ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИрдВред рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрддрдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рди рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

рд▓реЛрдЧ рдХрднреА-рдХрднреА рд╕реНрдЯреИрдХ рдХреЛ рд╢реЙрд░реНрдЯ рд╕рд░реНрдХрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдкрдардиреАрдпрддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реЛрддрд╛ рд╣реИ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрдардиреАрдпрддрд╛ рдХрд╛ рдореБрджреНрджрд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реАрдзреЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:

// clearly, linearly shows that these steps must occur in order,
// and any errors returned cause a panic, because this piece of
// code isn't responsible for reporting or handling possible failures:
// - IO Error: either network or disk read/write failed
// - External service error: some unexpected response from the external service
// - etc...
// It's not this code's responsibility to be aware of or handle those scenarios.
// That's perhaps the parent process's job.
var1, _! := trySomeTask1()
var2, _! := trySomeTask2(var1)
var3, _! := trySomeTask3(var2)
var4, _! := trySomeTask4(var3)

рдмрдирд╛рдо

var1, err := trySomeTask1()
if err != nil {
    panic(err)
}
var2, err := trySomeTask2(var1)
if err != nil {
    panic(err)
}
var3, err := trySomeTask3(var2)
if err != nil {
    panic(err)
}
var4, err := trySomeTask4(var3)
if err != nil {
    panic(err)
}

рдкрдардиреАрдпрддрд╛ рдХреЛ рдлрд┐рд▓рд╣рд╛рд▓ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВ рддреЛ рджреВрд╕рд░рд╛ рдХрд╛рд░рдг рдкреНрд░рджрд░реНрд╢рди рд╣реИред
рд╣рд╛рдВ, рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдкреИрдирд┐рдХ рдФрд░ рдбрд┐рдлрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдЬреБрд░реНрдорд╛рдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЕрдВрддрд░ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдирдЧрдгреНрдп рд╣реИред рдбрд┐рд╕реНрдХ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдИрдУ, рдФрд╕рддрди, рдбрд┐рдлрд░реНрд╕/рдкреИрдирд┐рдХ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдЯреИрдХ рдореИрдЬрд┐рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред

рдореИрдВрдиреЗ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдШрдмрд░рд╛рд╣рдЯ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдмрд╣реБрдд рдХреБрдЫ рддреЛрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рдмреЗрдорд╛рдиреА рд╣реИ рдХрд┐ рдЖрддрдВрдХ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдЧрд┐рд░рд╛рд╡рдЯ рд╣реИред рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдПрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреА рддрд░рд╣ред рдпрджрд┐ рдЖрдк рдПрдХ рддрдВрдЧ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдШрдмрд░рд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреНрд░рджрд░реНрд╢рди рд╣рд┐рдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕ рд▓реВрдк рдХреЗ рднреАрддрд░ рднреА рд╕реНрдердЧрд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдИ рднреА рдХрд╛рд░реНрдп рдЬреЛ рд╕реНрд╡рдпрдВ рдШрдмрд░рд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирддрд╛ рд╣реИ, рдЙрд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрддрдВрдХ рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реА рддрд░рд╣, рдЖрдЬ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдЧреЛ рдлрдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдФрд░ рдШрдмрд░рд╛рд╣рдЯ рджреЛрдиреЛрдВ рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ, рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдЗрд╕реА рддрд░рд╣ рд╣рдо рдЬрд╛рд╡рд╛, рдкрд╛рдпрдерди, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЖрджрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдЖрджреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рдЧреЛ рдХреЛрдб рдореЗрдВ рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдкреИрдирд┐рдХ рдХреЗ рдЬрд░рд┐рдП рдХреЙрд▓ рд╕реНрдЯреИрдХ рд▓реЛрдЧреЛрдВ рдХреЗ рдкреИрдирд┐рдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд╡реЗ рд╡реИрд╕реЗ рднреА рдкреИрдирд┐рдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрд╕ рддрдереНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдРрд╕реЗ рдЙрдкрдпреЛрдЧ рд╣реИрдВ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдз рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдХреЛрдб рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реБрд╡рд┐рдзрд╛ рд╕рдХреНрд╖рдо рд╣реЛрдЧреА, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ/рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣реИ? рдпрджрд┐ рдХреЛрдИ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдШрдмрд░рд╛рд╣рдЯ/рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд░рд╛рд╢ рд╣реИ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реЛрдВред рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрддреНрддрд░ рджреЗрдВ:

  1. рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдЖрдк рдХрд┐рд╕ рдЧрд╛рд▓реА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ?
  2. var1, err := trySomeTask1(); if err != nil { panic(err) } рдХреНрдпрд╛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ var1, _! := trySomeTask1() рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рдХреНрдпреЛрдВ?

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рддрд░реНрдХ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ "рдШрдмрд░рд╛рд╣рдЯ рдмреБрд░реА рд╣реЛрддреА рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП"ред
рдореИрдВ рдЕрдирдкреИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдФрд░ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдпрджрд┐ рд╡реЗ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╡реЗ рдЪреАрдЬреЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИрдВ - рдПрдХ рдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ, рдЬреИрд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдбрд╛рдЙрди рд╣реЛрдирд╛ рдпрд╛ рдЦрд░рд╛рдм рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ - рдЗрд╕рд▓рд┐рдП рд╡реЗ рдмрд╕ рдШрдмрд░рд╛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреИрдХ рдХреЛ рдЙрдбрд╝рд╛ рджреЗрддреЗ рд╣реИрдВред

рдореИрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЛрдлрд░реЛрдВ рдХреА рддрд░рд╣, рддреНрд░реБрдЯрд┐рдпреЛрдВ-рдХреЗ-рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЗ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдкреАрдЖрдИ рд╕реАрдорд╛рдУрдВ рдкрд░ рдпрд╣ рд╕рдм рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рдХреЛрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрди рдПрдкреАрдЖрдИ рд╕реАрдорд╛рдУрдВ рдХреЗ рднреАрддрд░ рдпрд╣ рд╕рдм рдЖрдкрдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рдЖрдк рдЦреБрд╢ рдкрде рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╡рд╣ рдкрде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХреЛрдб рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред

рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдпрджрд┐ рдореИрдВ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреИрдХ рдиреАрдЪреЗ рд╣реИ - рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реЗ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рдореИрдВ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдХрд░ рджреВрдВрдЧрд╛ред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдореЗрд░реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ, рдХрдИ рдмрд╛рд░ рдореИрдВ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореВрд▓ рдХрд╛рд░реНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рджреЗрдирд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ http.HandlerFunc рдбрд┐рд╕реНрдХ рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИ - рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдареАрдХ рд╕реЗ рд▓рд┐рдЦрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ (рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддреНрд░реБрдЯрд┐) рдпрд╛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ред рдПрдХ рдмрд╛рд░ http.HandlerFunc рдкреИрдирд┐рдХ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдпрд╣ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдмреЗрд╕ рд╣реИрдВрдбрд▓рд░ рдЙрд╕ рдкреИрдирд┐рдХ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ 500 рд▓рд┐рдЦреЗрдВрдЧреЗред рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдореИрдВ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ _! рдХреЛ err рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рд╣реИрдВрдбрд▓рд░ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЖрдИрдУ рд╡рд┐рдлрд▓рддрд╛рдУрдВ, рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдЖрджрд┐ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ if err != nil { panic(err) } рдпрд╛ if err != nil { return ..., err } рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реВрдВред рдЬрдм рдореБрдЭреЗ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддрдм рднреА рдореИрдВ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕рд┐рд░реНрдл if err != nil { panic(err) } рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╛, рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг, рдЕрдЧрд░ рдореИрдВ рдПрдХ рдЯреНрд░реА (http рд░рд╛рдЙрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд╣реЗрдВ) рдХреЛ рджреЛрдмрд╛рд░рд╛ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди func (root *Node) Find(path string) (found Value, err error) рдШреЛрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛ред рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдкреЗрдбрд╝ рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрдЧрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рдХреГрдд рдкреНрд░рдпрд╛рд╕ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреБрдЫ рдЖрдИрдУ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд╣реА рдЕрдиреБрдорддрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ? рдпреЗ рдореБрджреНрджреЗ рдореЗрд░реЗ рдЯреНрд░рд╛рдИ рд╕рд░реНрдЪ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИрдВ - рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрдирд╛рддрд╛ - рд▓реЗрдХрд┐рди рд╡реЗ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореБрдЭреЗ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдЯреИрдХ рдкрд░ рд╕рднреА рддрд░рд╣ рд╕реЗ рд▓реМрдЯрдиреЗ рд╕реЗ рдвреЗрд░ рд╕рд╛рд░реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдХрдИ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдорд╛рди рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЙрд╕ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рддрдХ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдШрдмрд░рд╛рдирд╛ рдФрд░ рдЙрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪреБрди рд╕рдХрддрд╛ рд╣реВрдВред рдлрд┐рд▓рд╣рд╛рд▓, рдпрд╣ рдЕрднреА рднреА рдЙрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рд╡рд┐рд╢реЗрд╖ рдХреИрд╕реЗ рдорд╛рдирд╛ рдЬрд╛рдПред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ (рдкрд╣рд▓реЗ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА) рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдореИрдВрдиреЗ рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рд╢рд╛рджреА рдирд╣реАрдВ рдХреА рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдП рдХреЛрдг рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХреЛрдИ рднреА рдЙрд╕ рдЙрдкрдиреНрдпрд╛рд╕ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЕрдкрдиреА рд╕рдордЭ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕реЗ рдмрд╣реБрдд рд╕реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдЙрдиреНрд╣реЗрдВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рд▓реИрдВрдЧреЗрдЬ рдХреЛ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдирд┐рдорд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЪрд░реНрдЪрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЬреАрдд рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@mccoljr рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдПрдХ рд▓рдХреНрд╖реНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рднреА рддреАрди рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рддрд░реАрдХреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рд╣реИ: рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ, рддреНрд░реБрдЯрд┐ рдХреЛ рдмрд┐рдирд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рд╡рд╛рдкрд╕ рдХрд░реЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред рдЖрдкрдХрд╛ рдкреИрдирд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рддреАрд╕рд░реЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

@mccoljr рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рд╕реАрдорд╛рдПрдВ рдЖрдкрдХреЗ рдЕрдиреБрдорд╛рди рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреАрддрд░-рдПрдкреАрдЖрдИ рдХреЙрд▓ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рдпрд╣ рджреВрд╕рд░реА рддрд░рдл рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХреБрдЫ рдбреЗрдЯрд╛ рдпрд╣рд╛рдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛)ред рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╕рд╣реА рджрд┐рд╢рд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдкреАрдЖрдИ рдХреЗ рднреАрддрд░ return рдПрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп panic рдПрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдо рддреМрд░ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдпрджрд┐ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ)ред panic рдПрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЬрд╣рд╛рдБ рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВ рд╡реЗ рджреБрд░реНрд▓рдн рд▓рдЧрддреА рд╣реИрдВред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрддрдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдлреИрд▓рд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдЖрддрдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреБрдо рдЧрд▓рдд рд╣реЛред рд▓реЛрдЧ рдЖрдкрдХреЗ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдСрдкрд░реЗрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡реЗ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдШрдмрд░рд╛рд╣рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдХреНрдпрд╛ рдкреИрдирд┐рдХ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рд╢рд╛рдпрдж рд╣реА рдХрднреА, рдФрд░ рдЪрд╛рд╣реЗ рд╡реЗ рдПрдкреАрдЖрдИ рд╕реАрдорд╛рдУрдВ рдХреЗ рднреАрддрд░ рдпрд╛ рднреАрддрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВ, рд▓рд╛рд▓ рдЭреБрдВрдб рд╣реИрдВред рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдмрд╣реБрдд рд╕реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╣рдо рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рджрд┐рдПред

рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЕрдВрддрд░ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдирдЧрдгреНрдп рд╣реИ

рд╕рдЪ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЦрддрд░рдирд╛рдХ рд╕рдбрд╝рдХ рд╣реИред рдкрд╣рд▓реЗ рддреЛ рдирдЧрдгреНрдп рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдпрд╣ рдвреЗрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЕрдВрддрддрдГ рдмрд╛рдж рдореЗрдВ рджреЗрд░ рд╣реЛрдиреЗ рдкрд░ рд╕рдбрд╝рдХ рдХреЗ рдиреАрдЪреЗ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯ рдФрд░ рд░рд╕реНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╕рд░рд▓ рд░рд┐рдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд╣рд╛рдВ, рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрд░рд┐рдЪрд┐рдд рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдФрд░ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдм рдХреБрдЫ рдЫреЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЗрд╕ рддрдереНрдп рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдкрд╡рд╛рдж рд╣реИред

рдкрд╣рд▓реЗ рддреЛ рдирдЧрдгреНрдп рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдпрд╣ рдвреЗрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЕрдВрддрддрдГ рдмрд╛рдж рдореЗрдВ рджреЗрд░ рд╣реЛрдиреЗ рдкрд░ рд╕рдбрд╝рдХ рдХреЗ рдиреАрдЪреЗ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рдЬрд╛рдПрдЧрд╛ред

рдЬреА рдирд╣реАрдВ, рдзрдиреНрдпрд╡рд╛рджред рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдмрд╛рдзрд╛рдПрдВ рдЬреНрдпрд╛рдорд┐рддреАрдп рд░реВрдк рд╕реЗ рдирдЧрдгреНрдп рдкреНрд░рджрд░реНрд╢рди рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВред

рдЬреА рдирд╣реАрдВ, рдзрдиреНрдпрд╡рд╛рджред рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдмрд╛рдзрд╛рдПрдВ рдЬреНрдпрд╛рдорд┐рддреАрдп рд░реВрдк рд╕реЗ рдирдЧрдгреНрдп рдкреНрд░рджрд░реНрд╢рди рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВред

рдХреГрдкрдпрд╛ рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рдЕрдкрдиреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдЖрдк рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдбрд╛рдЙрди рд╡реЛрдЯ рдЫреЛрдбрд╝ рджреЗрдВ рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣рд░ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рдЗрди рдирд┐рд░рд░реНрдердХ рдЙрддреНрддрд░реЛрдВ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рддреЗ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдЖрдкрдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╛рд╡рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╢рдмреНрджреЛрдВ рдФрд░ рдЕрдВрдЧреВрдареЗ рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рджреЛрд╕реНрддреЛрдВ, рдХреГрдкрдпрд╛ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕рдореНрдорд╛рдирдЬрдирдХ рдФрд░ рд╡рд┐рд╖рдп рдкрд░ рд░рдЦреЗрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЧреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

https://golang.org/conduct

рдореИрдВ рдлрд┐рд░ рд╕реЗ "рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕/рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде" рднрд╛рдЧ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрджрд╛ _ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рдПрдХ рджреЛ-рд╢рдмреНрдж рдХреАрд╡рд░реНрдб рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ) рд╣реЛ рд╕рдХрддреА рд╣реИред рджреЛ рд╢рдмреНрджреЛрдВ рд╡рд╛рд▓рд╛ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рджреБрдЧрдирд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЧреВрдврд╝ рд╣реИ, рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреВрд░реНрд╡ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ "рдпрд╛ рдмрдмрд▓" рдЪреБрдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде or рд╢рдмреНрдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдпрд╣рд╛рдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА or рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ (рдкрд░реНрд▓, рдкрд╛рдпрдерди) рд╕реЗ рдПрдХ рдЭреВрдареЗ рдореВрд▓реНрдп рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдФрд░ data := Foo() or ... рдкрдврд╝рдиреЗ рд╕реЗ рдЕрд╡рдЪреЗрддрди рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ data рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ or рдмрдпрд╛рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░рд╛, bubble рдХреАрд╡рд░реНрдб рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯрд╛ рд╣реЛрдиреЗ рдкрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдКрдкрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдвреЗрд░)ред up рд╢рдмреНрдж рднреА рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреВрд░рд╛ or up рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдВрдд рдореЗрдВ, рдкреВрд░реА рдмрд╛рдд рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЖрдк рдЬрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИрдВ, рдЙрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ' рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдордд рд░реЛрдХреЛ, рдХрд┐рд╕реА рдФрд░ рдХреЛ рдареАрдХ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛)ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд╛рдкрд╕реА рддрд░реНрдХ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди:

рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

func Worker(path string) ([]byte, error) {
    data := ioutil.ReadFile(path) or bubble

    return data;
}

рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

func Worker(path string) ([]byte, error) {
    data := ioutil.ReadFile(path) or bubble fmt.Sprintf("reading file %s", path)

    modified := modifyData(data) or bubble "modifying the data"

    return data;
}

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдиреБрдХреВрд▓рд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдПрдбреЗрдкреНрдЯрд░ рддрдВрддреНрд░ рдкреЗрд╢ рдХрд░реЗрдВ:

// Default Bubble Processor
errors.BubbleProcessor(func(msg string, err error) error {
    return fmt.Errorf("%s: %v", msg, err)
})

// Some program might register the following:
errors.BubbleProcessor(func(msg string, err error) error {
    return errors.WithMessage(err, msg)
})

рдЕрдВрдд рдореЗрдВ, рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╡рд░реНрдмреЛрдЬрд╝ рддрд░реАрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдкред рд╡реИрд╢реНрд╡рд┐рдХ рдмрдмрд▓ рд╣реИрдВрдбрд▓рд░ рд╣реЛрдиреЗ рд╕реЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЯреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдЙрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓рд╛рдн рд╣реИред рдУрдЯреАрдУрдПрдЪ, рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ func(string, error) error , рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмреБрд▓рдмреБрд▓реЗ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░, рдЬреИрд╕реЗ error рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ред

рд╕рд╛рде рд╣реА, or bubble рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ or die рдпрд╛ or panic рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдпрд╛ рдмрдЧ рд╣реИред

рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЧреВрдврд╝ рд╣реИ, рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреВрд░реНрд╡ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ - рдпрд╣ рдмрд╣реБрдд рд╡рд░реНрдмреЛрдЬрд╝ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЪреАрдЬрд╝ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рд▓реЗрддрд╛ рд╣реИ - рд╕реНрдЯреИрдХ рдХреЛ рдмрдмрд▓ рдЕрдк рдХреЗ рд╕рд╛рде рдЕрдирд╣реЗрд▓реНрдб рдПрд░рд░ред рдСрдкрд░реЗрдЯрд░ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдЧреБрдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╡реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рд╕рднреА рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдкрд░реАрдд рд╣реЛрддрд╛ рд╣реИред рд╡реЗ рдореБрдЦреНрдп рддрд░реНрдХ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЗрддрдиреЗ рд╢рдмреНрдж рд╣реЛрдиреЗ рд╕реЗ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдкрдардиреАрдпрддрд╛ рдХреЛ рдЪреЛрдЯ рдкрд╣реБрдВрдЪреЗрдЧреАред рдХрдо рд╕реЗ рдХрдо рдЙрдиреНрд╣реЗрдВ orbubble рдпрд╛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдореБрдЭреЗ рд╡рд╣рд╛рдВ рджреЛ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЧреЛ рдХреЛ рдмреЛрд▓реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡реАрдмреА)

рдореИрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдХреВрд▓рдХ рдХрд╛ рдЕрдзрд┐рдХ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред рдпрджрд┐ рдореЗрд░рд╛ рдкреИрдХреЗрдЬ рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХрд╛ рднреА рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕рдХреА рдЬреАрдд рд╣реЛрддреА рд╣реИ?

@ рд╡рд╕реНрддреБ88
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЙрдЧрд░ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ (рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ) рдЖрдЙрдЯрдкреБрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд▓реЙрдЧрд┐рдВрдЧ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИ; рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕реВрдЪрдирд╛рддреНрдордХ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рдХрд┐ рдореБрдЭреЗ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдареАрдХ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкреИрдХреЗрдЬ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдЦрд░рд╛рдм рдЬрдЧрд╣ рдкрд░ рд╣реИрдВред

рдХреГрдкрдпрд╛ рдЯреНрд░рд╛рдЗ рдХреИрдЪ рдЕрдВрдд рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВ рдФрд░ рд╣рдореЗрдВ рдЕрдм рдФрд░ рд▓рдбрд╝рд╛рдИ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рднреА рдХреЛ рдЦреБрд╢ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред рдЬрд╛рд╡рд╛ рдиреЗ рдпрд╣ рдХрд┐рдпрд╛ рдФрд░ рд╕реА # рдиреЗ рднреА рдХрд┐рдпрд╛ рдФрд░ рд╡реЗ рджреЛрдиреЛрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдлрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред GO рд╕рдореБрджрд╛рдп (рдпрд╛ рд▓реЗрдЦрдХ) рдХреГрдкрдпрд╛ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВред

@ рдХрд╛рдордпрд╛рд░ , рдореИрдВ рд╕рдореНрдорд╛рдирдкреВрд░реНрд╡рдХ рдЕрд╕рд╣рдордд рд╣реВрдВ; рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ _not_ рд╕рднреА рдХреЛ рдЦреБрд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдИ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ рд╡рд╕реНрддреБ88
рдЕрд╕рд▓ рдореЗрдВ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдмрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕реВрдЪрдирд╛рддреНрдордХ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд▓реЙрдЧрд░ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдкреИрдХреЗрдЬ рд╕реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдЖрдк рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред

рдЖрдкрдХреЗ рдЕрдВрдЧреВрдареЗ рдиреАрдЪреЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдареАрдХ рдпрд╣реА рд╡рд╣ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЧреЛ рд╕рдореБрджрд╛рдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕ рдорд╛рдорд▓реЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реА ++ рдХреЗ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдордХрдХреНрд╖ рдЧреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рджрд┐рди рджреЗрдЦ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореИрдВ рдЗрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЖрдпрд╛:

рд╡реА: = рдирдХреНрд╢рд╛ [рдмреВрд▓] рдЗрдВрдЯ {рд╕рдЪ: рдкрд╣рд▓рд╛_рдПрдХреНрд╕рдкреНрд░реЗрд╢рди, рдЭреВрдард╛: рджреВрд╕рд░рд╛_рдПрдХреНрд╕рдкреНрд░реЗрд╢рди} [рд╢рд░реНрдд]
рдмрд╕ рдХреЗ рдмрдЬрд╛рдп
рд╡реА = рд╢рд░реНрдд? рдлрд░реНрд╕реНрдЯ_рдПрдХреНрд╕рдкреНрд░реЗрд╢рди: рд╕реЗрдХреЗрдВрдб_рдПрдХреНрд╕рдкреНрд░реЗрд╢рди;

рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рджреЛ рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди-рд╕рд╛ рдкрд╕рдВрдж рд╣реИ? рдКрдкрд░ рдПрдХ рдЕрдкрдардиреАрдп рдХреЛрдб (рдЧреЛ рдорд╛рдИ рд╡реЗ) рд╢рд╛рдпрдж рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рджрд░реНрд╢рди рдореБрджреНрджреЛрдВ рдпрд╛ рд╕реА ++ (рд░рд╛рдЬрдорд╛рд░реНрдЧ) рдореЗрдВ рджреВрд╕рд░рд╛ рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде? рдореБрдЭреЗ рд╣рд╛рдИрд╡реЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдкрд╕рдВрдж рд╣реИрдВред рдореИрдВ рддреБрдореНрд╣рд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред

рддреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рд▓рд╛рдПрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЙрдзрд╛рд░ рд▓реЗрдВред рдЙрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред

рд╕рд╛рджрд░,

рдЧреЛ рд╕рдореБрджрд╛рдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрднрд╡ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдВ, рдЬрдм рдХреЛрдИ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ рдпрд╛ ?: рддреЛ рд╕рдореБрджрд╛рдп рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдирдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реИрдВред рд╣рдо рд▓рдЧрднрдЧ рд╕рднреА рдХреЛ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИред рд╣рдо рдЙрдирд╕реЗ рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдФрд░ рд╣рдо рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рджреИрдирд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдкреНрд░рддрд┐рд░реЛрдз рдЗрд╕ рдмрд╛рдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдпреЗ рдкреБрд░рд╛рдиреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдирдП рдирд╣реАрдВред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдмрджрд▓рд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ: рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рд╕реЗ рджреВрд░ рдПрдХ рдмрджрд▓рд╛рд╡ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рджреВрд░ рдПрдХ рдмрджрд▓рд╛рд╡?:ред рд╣рдо рдЬрд┐рд╕ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реИрдВ, рд╡рд╣ рдЗрди рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _back_ рдХреЛ рдмрджрд▓ рд░рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЕрд╕рд▓ рдореЗрдВ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдмрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕реВрдЪрдирд╛рддреНрдордХ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд▓реЙрдЧрд░ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдкреИрдХреЗрдЬ рд╕реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдмрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рддреЛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ рд▓реЗрдХрд┐рди рдпрджрд┐ рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рддреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреБрдЫ рддрд░реНрдХ рдмрдирд╛рдирд╛ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдкреНрд░рддрд┐ рд░рдирдЯрд╛рдЗрдо рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрдШрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреБрд╕реНрдЦрд╛ рд╣реЛрдЧрд╛ред

@urandom , рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдорд╛рдореВрд▓реА рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди error , рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдПрдбреЙрдкреНрдЯрд░ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рдПрдбреЙрдкреНрдЯрд░ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рдХреЛрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

@KamyarM рднрд╛рд╖рд╛ рдФрд░ рдЙрд╕рдХреЗ рдореБрд╣рд╛рд╡рд░реЗ рдПрдХ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВред рдЬрдм рд╣рдо рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рди рдХреЗрд╡рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ) рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рднреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЯреНрд░рд╛рдИ-рдХреИрдЪ-рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрдХреНрд░рд╛рдордХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛: рдпрд╣ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрд╕ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЧреЛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╣реИрдВ: рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рдЫрд▓рд╛рдВрдЧ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрджрд┐ред

рдПрдХ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рд╣рд╛рдБ, рдЖрдк рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЬ рдирдХрд▓реА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗред рдпрд╣ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ:

    var v int
    if condition {
        v = first_expression
    } else {
        v = second_expression
    }

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдЙрдзрд╛рд░ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдмрд╛рдХреА рдХреА рднрд╛рд╖рд╛ рдФрд░ рдмрд╛рдХреА рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдлрд┐рдЯ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдЬ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред

@KamyarM рдореИрдВ рдЧреЛ рдФрд░ рдЬрд╛рд╡рд╛ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЬреЛрд░рджрд╛рд░ рд░реВрдк рд╕реЗ _do not_ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рд╕реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рдПред рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЬрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдФрд░ рдХреГрдкрдпрд╛ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдореБрджреНрджреЗ рдкрд░ рд▓реЗ рдЬрд╛рдПрдВ, рдЬреИрд╕реЗ #23248ред

@lpar рддреЛ рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдг рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ GoLang рдХреЛ рдЕрдкрдиреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдмрд╕ рдЕрдкрдиреА рдиреМрдХрд░реА рдЫреЛрдбрд╝рдиреЗ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ !? рдЖ рдЬрд╛рдУ рднрд╛рдИ!

@bcmills рдЖрдк рд╡рд╣рд╛рдВ рд╕реБрдЭрд╛рдП рдЧрдП рдХреЛрдб рдХреЛ рдЧрд┐рди рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреА 6 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЛрдб рд╕рд╛рдЗрдХреНрд▓реЛрдореИрдЯрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдмрд┐рдВрджреБ рдорд┐рд▓рддреЗ рд╣реИрдВ (рдЖрдк рд▓реЛрдЧ рд▓рд┐рдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╣реА?)ред

@carlmjohnson рдФрд░ @bcmills рдХреЛрдИ рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛ рдкреБрд░рд╛рдирд╛ рдФрд░ рдкрд░рд┐рдкрдХреНрд╡ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдЦрд░рд╛рдм рд╣реИред рдЕрд╕рд▓ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИред

рдЕрдЪреНрдЫрд╛ рд╣реБрдЖ рдХрд┐ рдЖрдк рдпрд╣ GO рдореБрд╣рд╛рд╡рд░рд╛ рд▓реЗрдХрд░ рдЖрдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЬрдм рднреА рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреЛрдИ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЕрд░реЗ рдирд╣реАрдВ рдпрд╣ рдЧреЛ рдореБрд╣рд╛рд╡рд░реЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИред рдореИрдВ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рднреА рдирдП рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рдмрд╣рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред

@KamyarM рдХреГрдкрдпрд╛ рд╡рд┐рдирдореНрд░ https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ

рд╕рд╛рде рд╣реА, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯрд┐рдкреНрдкрдгреА, рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдХреА рд╣рд╛рд▓рд┐рдпрд╛ рдЪрд░реНрдЪрд╛ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рддред

рдЗрд╕ рд╕рд┐рд▓рд╕рд┐рд▓реЗ рдореЗрдВ рдХрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдП рд╣реИрдВред рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдЕрднреА рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╣рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ (рд╕рдорд╕реНрдпрд╛рдУрдВ) рдкрд░ рдПрдХ рдордЬрдмреВрдд рдкрдХрдбрд╝ рд╣реИред рдореБрдЭреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдирдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдЕрдЧрд░ рдХреЛрдИ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рдВрдЧрдард┐рдд рдФрд░ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рд╕реВрдЪреА рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдореИрдВ рднреА рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдВред

@ рдЬреЛрд╢реЗрд░рд┐рдпрди рдореИрдВ рд╡рд╣реАрдВ рдЦреБрд▓рдХрд░ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рд╕рдЯреАрдХ рдореБрджреНрджреЛрдВ рдХреЛ рднрд╛рд╖рд╛ рдпрд╛ рд╕рдореБрджрд╛рдп рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕реЗ рдЕрдзрд┐рдХ рдЖрд▓реЛрдЪрдирд╛ рдорд╛рдиреЗрдВред GoLang рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ?

@KamyarM рдпрджрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕реА рдРрд╕реА рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЕрдкрдиреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯ рдХреЛ рдЪреБрдирд╛ рдерд╛, рддреЛ рдХреНрдпрд╛ рдЖрдк рд░рд╕реНрдЯ

рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЬрд╛рд╡рд╛-рд╢реИрд▓реА рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдирдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреА рдХрдореА рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкрд╣рд▓реА рдмрд╛рд░ 1988 рдореЗрдВ рд▓рд┐рд╕реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЕрдиреНрдп рд▓реЛрдЧ рднреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЙрдирд╕реЗ рдкрд╣рд▓реЗ рднреА рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдерд╛ - рдпрд╣ рд╡рд┐рдЪрд╛рд░ 1970 рдХреЗ рджрд╢рдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реИред

рдЯрд░реНрдирд░реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдпрд╣реА рд╕рдЪ рд╣реИред рдЧреЛ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдкрд░ рдкрдврд╝реЗрдВ - рдЧреЛ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗрди рдереЙрдореНрдкрд╕рди рдиреЗ 1969 рдореЗрдВ рдмреЗрд▓ рд▓реИрдмреНрд╕ рдореЗрдВ рдмреА рднрд╛рд╖рд╛ (рд╕реА рдХреЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА) рдореЗрдВ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рд▓рд╛рднреЛрдВ рдФрд░ рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдерд╛ред рдХреНрдпрд╛ рдЗрд╕реЗ рдЧреЛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реИред

рдЧреЛ рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ рдордВрдЪреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╡рд┐рдирдореНрд░ рд╣реЛред рд╕реНрдкрд╖реНрдЯрд╡рд╛рджреА рд╣реЛрдирд╛ рдЕрд╕рднреНрдп рд╣реЛрдиреЗ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред https://golang.org/conduct рдХрд╛ "рдЧреЛрдлрд░ рдорд╛рди" рдЕрдиреБрднрд╛рдЧ

@lpar рд╣рд╛рдВ, рдЕрдЧрд░ рдЬрдВрдЧ рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рдордВрдЪ рд╣реИ рддреЛ рдореИрдВ рдРрд╕рд╛ рдХрд░реВрдВрдЧрд╛ ;-) рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдореИрдВ рдРрд╕рд╛ рдХрд░реВрдВрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реА рдЖрд╡рд╛рдЬ рд╕реБрдиреА рдЬрд╛рдПред

@ianlancetaylor рдХреНрдпрд╛ рдореИрдВрдиреЗ рдХрд┐рд╕реА рдЕрд╢реНрд▓реАрд▓ рд╢рдмреНрдж рдпрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛? рдХреНрдпрд╛ рдореИрдВрдиреЗ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдпрд╛ рдХрд┐рд╕реА рдХреЛ рдбрд░рд╛рдиреЗ-рдзрдордХрд╛рдиреЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдкреНрд░рд┐рдп рдпреМрди рд╕рдВрдмрдВрдз рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛? рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред
рдЪрд▓реЛ рдпрд╛рд░, рд╣рдо рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдл рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕реА рдзрд░реНрдо рдпрд╛ рд░рд╛рдЬрдиреАрддрд┐ рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред
рдореИрдВ рд╕реНрдкрд╖реНрдЯрд╡рд╛рджреА рдерд╛ред рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореЗрд░реА рдЖрд╡рд╛рдЬ рд╕реБрдиреА рдЬрд╛рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдордВрдЪ рд╣реИред рдЖрд╡рд╛рдЬреЗрдВ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдПред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЖрдкрдХреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рдпрд╛ рдореЗрд░реА рдЖрд▓реЛрдЪрдирд╛ рдкрд╕рдВрдж рди рдЖрдПред рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореБрдЭреЗ рдмрд╛рдд рдХрд░рдиреЗ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЕрдиреНрдпрдерд╛ рд╣рдо рд╕рднреА рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИ рдФрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдЧреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@josharian рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдЙрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░

рдЦреИрд░, рдореИрдВрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдкреАрдЫреЗ рдореБрдбрд╝рдХрд░ рджреЗрдЦрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд╣рд╛рдВ рдХреБрдЫ рдмреБрд░рд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЕрдкрдорд╛рди рдХрд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдореИрдВ рдЕрднреА рднреА рдЙрд╕ рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдХрд╣рддрд╛ рд╣реВрдВ) GoLang рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореБрд╣рд╛рд╡рд░реЗ рд╣реИрдВ! рд╣рд╛рд╣рд╛!

рд╣рдорд╛рд░реЗ рд╡рд┐рд╖рдп рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдореЗрд░реА рдЖрд╡рд╛рдЬ рд╕реБрдирддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЧреЛ рдСрдерд░реНрд╕ рдЯреНрд░рд╛рдИ рдХреИрдЪ рдмреНрд▓реЙрдХреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕реЗ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВ рдпрд╛ рдирд╣реАрдВ (рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд╣реИ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреИрдирд┐рдХ рдбрд┐рдлрд░ рд░рд┐рдХрд╡рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХреИрдЪ рдЯреНрд░рд╛рдИ рдХрд░реЗрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реИ?)
рдореИрдВрдиреЗ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд▓ рд╕реБрдЭрд╛рдпрд╛ред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИред

рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╕реЗ рд╕реНрд╡рдпрдВ рдХреЛ рдореБрдХреНрдд рдХрд░ рд▓реВрдВрдЧрд╛ред

рдЗрд╕ рдореМрдХреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╢реБрдХреНрд░рд┐рдпрд╛ред

@KamyarM рдЖрдк рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдЕрд╕рд╣рдорддрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдирдореНрд░ рд░рд╣реЗрдВред рдЬрдм рд▓реЛрдЧ рдЖрдкрд╕реЗ рдЕрд╕рд╣рдордд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЬреИрд╕реЗ "рдЖрдкрдХреЗ рдЕрдВрдЧреВрдареЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдпрд╣реА рд╡рд╣ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЧреЛ рд╕рдореБрджрд╛рдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ" рдЯреА рдЙрд╕ рддрд░рд╣ред"

рдПрдХ рдмрд╛рд░ рдлрд┐рд░: рдХреГрдкрдпрд╛ рд╡рд┐рдирдореНрд░ рд░рд╣реЗрдВред рддрдХрдиреАрдХреА рддрд░реНрдХреЛрдВ рдкрд░ рдЯрд┐рдХреЗ рд░рд╣реЗрдВред рдРрд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдШрд░реЗрд▓реВ рддрд░реНрдХреЛрдВ рд╕реЗ рдмрдЪреЗрдВ рдЬреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рд▓реЛрдЧреЛрдВ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░рд╛ рдорддрд▓рдм рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕ рдкрд░ рдСрдлрд╝рд▓рд╛рдЗрди рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВ; рдореБрдЭреЗ рдИрдореЗрд▓ рдХрд░реЛред рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рдЕрдкрдирд╛ 2c рдЕрдВрджрд░ рдлреЗрдВрдХ рджреВрдВрдЧрд╛, рдФрд░ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдЪрдореБрдЪ рдЕрдиреНрдп рдПрди рд╕реМ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдЫ рджреЛрд╣рд░рд╛ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ (рдпрд╛ urandom рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЪрд░реНрдЪрд╛ рдкрд░ рдХрджрдо рдЙрдард╛ рд░рд╣рд╛ рд╣реИ)ред

рдореБрдЭреЗ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ рдЬреЛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рджреЛ рдкреНрд░рд╛рдердорд┐рдХ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде:

  • рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ: рдореЗрд░рд╛ рджреГрдврд╝ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдореЗрдВ рдирд┐рд╣рд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдореМрдЬреВрджрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рд╡рд╣рд╛рдВ ?! рдлреЗрдВрдХ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЧреЛ рдореЗрдВ рдореМрдЬреВрджрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝реЛрдВ рд╕реЗ рдореИрдВ рдЦреБрд╢ рд╣реВрдВред

  • рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЖрд░рдПрдЪрдПрд╕ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рджреЗрд╡реЛрдВ рдХреЛ рдмрд╣реБрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рдХреЛрдб рд▓рд┐рдЦрдиреЗ рджреЗрдЧрд╛, рдЬрдмрдХрд┐ рдЕрднреА рднреА рдЙрдирдХреЗ рдЗрд░рд╛рджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рд╡реЗ рдЬреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рд▓рдЪреАрд▓рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

func returnErrorf(s string, args ...interface{}) func(error) error {
  return func(err error) error {
    return errors.New(fmt.Sprintf(s, args...) + ": " + err.Error())
  }
}

func foo(r io.ReadCloser, callAfterClosing func() error, bs []byte) ([]byte, error) {
  // If r.Read fails, returns `nil, errors.New("reading from r: " + err.Error())`
  n := r.Read(bs) ?! returnErrorf("reading from r")
  bs = bs[:n]
  // If r.Close() fails, returns `nil, errors.New("closing r after reading [[bs's contents]]: " + err.Error())`
  r.Close() ?! returnErrorf("closing r after reading %q", string(bs))
  // Not that I advocate this inline-func approach, but...
  callAfterClosing() ?! func(err error) error { return errors.New("oh no!") }
  return bs, nil
}

рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ рдЖрд░рдПрдЪрдПрд╕ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдб рдХрд┐рд╕реА рднреА рдмрдВрдж рдпрд╛ рдЦреБрд╢ рдкрде рдкрд░ рдЬреЛ рдХреБрдЫ рднреА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ "рдУрд╡рд░рд▓реЛрдб" рдХрд░рдирд╛ рднреА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдореЗрд░реЗ рдорди рдореЗрдВ рддреАрди рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо return рд╕рд╢рд░реНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрд░рдПрдЪрдПрд╕ рдПрдХ func(error) (error, bool) , рдЬреИрд╕реЗ (рдпрджрд┐ рд╣рдо рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрд┐рдирд╛ рд╢рд░реНрдд рд░рд┐рдЯрд░реНрди рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ ?? , рд▓реЗрдХрд┐рди рдореЗрд░рд╛ "рдореБрдЭреЗ рддрдм рддрдХ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдпрд╣ рдЕрд▓рдЧ рд╣реИ" рдХрдерди рдЕрднреА рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ):

func maybeReturnError(err error) (error, bool) {
  if err == io.EOF {
    return nil, false
  }
  return err, true
}

func id(err error) error { return err }

func ignoreError(err error) (error, bool) { return nil, false }

func foo(n int) error {
  // Does nothing
  id(io.EOF) ?? ignoreError
  // Still does nothing
  id(io.EOF) ?? maybeReturnError
  // Returns the given error
  id(errors.New("oh no")) ?? maybeReturnError
  return nil
}

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо RHS рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

func foo(r io.Reader) ([]int, error) {
  returnError := func(err error) ([]int, error) { return []int{0}, err }
  // returns `[]int{0}, err` on a Read failure
  n := r.Read(make([]byte, 4)) ?! returnError
  return []int{n}, nil
}

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func returnOpFailed(name string) func(bool) error {
  return func(_ bool) error {
    return errors.New(name + " failed")
  }
}

func returnErrOpFailed(name string) func(error) error {
  return func(err error) error {
    return errors.New(name + " failed: " + err.Error())
  }
}

func foo(c chan int, readInt func() (int, error), d map[int]string) (string, error) {
  n := <-c ?! returnOpFailed("receiving from channel")
  m := readInt() ?! returnErrOpFailed("reading an int")
  result := d[n + m] ?! returnOpFailed("looking up the number")
  return result, nil
}

...рдЬреЛ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рддрдм рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛ рдЬрдм рдореБрдЭреЗ рдХреБрдЫ рднрдпрд╛рдирдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ map[string]interface{} рд╣рд╛рде рд╕реЗ рдбрд┐рдХреЛрдб рдХрд░рдирд╛ред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреМрди (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рд╕рд╛рджрдЧреА, рд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрддреБрд▓рди рдмрдирд╛рддрд╛ рд╣реИред

рдореИрдВ рдлрд┐рд░ рд╕реЗ "рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕/рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде" рднрд╛рдЧ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрджрд╛ _ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рдПрдХ рджреЛ-рд╢рдмреНрдж рдХреАрд╡рд░реНрдб рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ) рд╣реЛ рд╕рдХрддреА рд╣реИред

@urandom рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╕рд╣рдордд рд╣реИ, рдХреЛрдИ рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП BubbleProcessor рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред @object88 рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдИ рдЧрдИ рдЪрд┐рдВрддрд╛рдПрдВ рд╡реИрдз IMO рд╣реИрдВ; рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдРрд╕реА рд╕рд▓рд╛рд╣реЗрдВ рджреЗрдЦреА рд╣реИрдВ рдЬреИрд╕реЗ "рдЖрдкрдХреЛ http рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ/рдкрд░рд┐рд╡рд╣рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП", рдпрд╣ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдФрд░ рдмрди рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рд╕рд┐рд▓рд╕рд┐рд▓реЗ рдореЗрдВ рдХрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдП рд╣реИрдВред рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдЕрднреА рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╣рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ (рд╕рдорд╕реНрдпрд╛рдУрдВ) рдкрд░ рдПрдХ рдордЬрдмреВрдд рдкрдХрдбрд╝ рд╣реИред рдореБрдЭреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдирдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдЕрдЧрд░ рдХреЛрдИ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рдВрдЧрдард┐рдд рдФрд░ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рд╕реВрдЪреА рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдореИрдВ рднреА рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдВред

рдЕрдЧрд░ @ianlancetaylor рдЖрдкрдХреЛ рдирд┐рдпреБрдХреНрдд рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЖрдк @josharian рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? :рдмреНрд▓рд╢: рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдХреА рдпреЛрдЬрдирд╛/рдЪрд░реНрдЪрд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рд┐рд░реНрдл "рд╕реБрдЭрд╛рд╡ рдмреЙрдХреНрд╕" рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

@KamyarM

@bcmills рдЖрдк рд╡рд╣рд╛рдВ рд╕реБрдЭрд╛рдП рдЧрдП рдХреЛрдб рдХреЛ рдЧрд┐рди рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреА 6 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЛрдб рд╕рд╛рдЗрдХреНрд▓реЛрдореИрдЯрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдмрд┐рдВрджреБ рдорд┐рд▓рддреЗ рд╣реИрдВ (рдЖрдк рд▓реЛрдЧ рд▓рд┐рдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╣реА?)ред

рдЪрдХреНрд░реАрдп рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рд╕реЗ рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕реЗ рджреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ strlen ?)ред рдЬрд┐рд╕ рддрд░рд╣ "рдЫреЛрдЯрд╛" рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рджреЗрдЦрдирд╛ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИред

рд╕реНрд░реЛрдд рдореЗрдВ рдХреЛрдИ рднреА рдХрдерди рдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдкреБрди: рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреА рд╣реИ, рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрджрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдпрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЗ рдмреАрдЪ рдХрд╛ рдирд┐рд░реНрдгрдп рд╣реИ, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдЕрдЪреНрдЫрд╛ рд╣реБрдЖ рдХрд┐ рдЖрдк рдпрд╣ GO рдореБрд╣рд╛рд╡рд░рд╛ рд▓реЗрдХрд░ рдЖрдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЬрдм рднреА рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреЛрдИ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЕрд░реЗ рдирд╣реАрдВ рдпрд╣ рдЧреЛ рдореБрд╣рд╛рд╡рд░реЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИред рдореИрдВ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рднреА рдирдП рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рдмрд╣рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред

рдирдП рдФрд░ рдлрд╛рдпрджреЗрдордВрдж рдореЗрдВ рдЕрдВрддрд░ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рд╣реА рдЕрдиреБрдореЛрджрди рдХреЗ рдпреЛрдЧреНрдп рд╣реИ? рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдХреГрдкрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдЯреНрд░реИрдХрд░ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдпрджрд┐ рд╕рдореБрджрд╛рдп рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╣рд░ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдордВрдЬреВрд░реА рджреА рдЧрдИ рдереА, рддреЛ рдЖрдЬ рд╣реА рдЬрд╛рдПрдВред

рд╢рд╛рдпрдж рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рджреВрд╕рд░реЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдЖрддреА рд╣реИред рдмрд╛рддрдЪреАрдд рдХреЛ рдЦрд░рд╛рдм рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рдкреВрд░реА рдкреНрд░рдгрд╛рд▓реА рдХреИрд╕реЗ рдЯреВрдЯ рдЧрдИ рд╣реИ, рдЖрд▓реЛрдЪрдирд╛рдУрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдВ, рдмрд┐рдВрджреБ-рджрд░-рдмрд┐рдВрджреБ, рдпрд╛ рдЕрдкрдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдордзреНрдп рдЬрдореАрди рдЦреЛрдЬреЗрдВред

@ рдЬреАрдбреАрдПрдо85
рдореИрдВрдиреЗ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬреЛрдбрд╝рд╛ред рдФрд░ рдЬрдмрдХрд┐ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдЖрдк рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВред рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЙрдЧрд░ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ http рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд╣реА рд╢реНрд░реЗрдгреА рдореЗрдВ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рднреА рд╣реИрдВред

рдореБрдЭреЗ @gburgessiv рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдкрд╕рдВрдж рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕реНрд╡рдпрдВ рдХреНрд░рд┐рдкреНрдЯрд┐рдХ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ (рд╢рд╛рдпрдж рдХрдо рд╕реЗ рдХрдо ? рдЬреИрд╕реЗ рд░рд╕реНрдЯ рдореЗрдВ рдЪреБрдиреЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧреВрдврд╝ рд╣реИ)ред рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд▓рдЧреЗрдЧрд╛:

func foo(r io.ReadCloser, callAfterClosing func() error, bs []byte) ([]byte, error) {
  // If r.Read fails, returns `nil, errors.New("reading from r: " + err.Error())`
  n := r.Read(bs) or returnErrorf("reading from r")
  bs = bs[:n]
  // If r.Close() fails, returns `nil, errors.New("closing r after reading [[bs's contents]]: " + err.Error())`
  r.Close() or returnErrorf("closing r after reading %q", string(bs))
  // Not that I advocate this inline-func approach, but...
  callAfterClosing() or func(err error) error { return errors.New("oh no!") }
  return bs, nil
}

рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ errors рдкреИрдХреЗрдЬ рдореЗрдВ рдХрд╣реАрдВ рдЙрдирдХреЗ returnErrorf рдХреЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж errors.Returnf() ред

@KamyarM
рдЖрдкрдиреЗ рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдиреА рд░рд╛рдп рд╡реНрдпрдХреНрдд рдХрд░ рджреА рд╣реИ, рдФрд░ рдЕрдкрд╡рд╛рдж рдХрд╛рд░рдг рдХреЗ рдкреНрд░рддрд┐ рд╕рд╣рд╛рдиреБрднреВрддрд┐рдкреВрд░реНрдг рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЕрдиреНрдп рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣реА рдмрд╛рдд рджреЛрд╣рд░рд╛рдиреЗ рд╕реЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рд╡рд╣ рдЖрдкрдХрд╛ рд▓рдХреНрд╖реНрдп рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

@ рдЬреЛрд╢реЗрд░рд┐рдпрди , рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рдкрдХреНрд╖рдкрд╛рддреА рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдорд┐рд╢реНрд░рдг рдореЗрдВ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдФрд░ рдЕрдзреВрд░рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкреВрд░реЗ рдзрд╛рдЧреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реВрдВред

рд╣рдо рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ рдЧреЛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рджреГрд╢реНрдп рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ред рдпрд╣рд╛рдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ ( рд╕реНрд░реЛрдд ):

func (ds *GitDataSource) Fetch(from, to string) ([]string, error) {
    if err := createFolderIfNotExist(to); err != nil {
        return nil, err
    }
    if err := clearFolder(to); err != nil {
        return nil, err
    }
    if err := cloneRepo(to, from); err != nil {
        return nil, err
    }
    dirs, err := getContentFolders(to)
    if err != nil {
        return nil, err
    }
    return dirs, nil
}

рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдХрдИ рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рд╡реЗ рдЦреБрд╢ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рджрдЦрд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЙрддрдирд╛ рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ред рдЙрдирдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдХреЛрдИ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рдРрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреЛ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдХреБрдЫ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдПрдХ рд░реВрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЧреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЪреБрди рд╕рдХрддрд╛ рдерд╛ рдФрд░ рдирд╣реАрдВ рдЪреБрдирд╛, рдпреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдВ рдХрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди (рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡) рд╕реЗ рд▓реМрдЯрдирд╛ рдпрд╛ рдШрдмрд░рд╛рдирд╛, рдФрд░ рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЬреЛ рдЙрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡реЗ рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рджреВрд╕рд░реЛрдВ рдХреА рдХреАрдордд рдкрд░ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рджреЗрддреЗ рд╣реИрдВред рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, t.Fatal рдФрд░ log.Fatal рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрднреА-рдХрднреА рд╕рднреА рдПрдХ рд╣реА рджрд┐рди рдореЗрдВред

рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рдХрд╛рдлреА рдХрдард┐рди рдмрдирд╛рддреЗ рд╣реИрдВред рдпреЗ рднреА рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд░реИрдкрд┐рдВрдЧ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЫреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЕрдм рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╢реЗрд╖ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрдВ рдХреБрдЫ рдЪреАрдиреА рдФрд░ рдХрднреА-рдХрднреА рдереЛрдбрд╝рд╛ рд╕рд╛ рдЬрд╛рджреВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдпрд╛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред My рдФрд░ @bcmills рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рдкрдардиреАрдпрддрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреАрдиреА рдФрд░ рд╢реВрдиреНрдп рдЬрд╛рджреВ рдХреА рдиреНрдпреВрдирддрдо рдорд╛рддреНрд░рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рдПрдХ рдЦрд░рд╛рдм рдкреНрд░рдХрд╛рд░ рдХреА рдмрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдПред

рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд╢ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдпрд╛ рдЕрдВрдд рдореЗрдВ рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рдЕрдиреБрднрд╛рдЧред

рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо, @mpvl рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╢реБрджреНрдзрддрд╛ рдФрд░ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХреЗред рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдореНрдореЛрд╣рдХ рддрд░реНрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднрд╛рд░реА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореМрдЬреВрджрд╛ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛

рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдпрд╣рд╛рдБ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реИ, рдЙрдирд╕реЗ рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ред

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдореБрдЭрд╕реЗ рдЪреАрдиреА рдФрд░ рдЬрд╛рджреВ рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫреЗрдЧрд╛ред (рдореИрдВ рдЦреБрдж рдпрд╣ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВред)

рдЪреАрдиреА рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рддрд╛ рд╣реИред рд▓рдШреБ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ := рдЪреАрдиреА рд╣реИред рддреЛ рд╕реА рдХрд╛ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ ?: ред

рдЬрд╛рджреВ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╣рд┐рдВрд╕рдХ рд╡реНрдпрд╡рдзрд╛рди рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдЪрд░ рдХреЛ рдмрд┐рдирд╛ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдПрдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдкреЗрд╢ рдХрд░рдирд╛, рдпрд╛ рдПрдХ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдг рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХрд░рдирд╛ред

рд░реЗрдЦрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзреБрдВрдзрд▓реА рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, @jbaред рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ред рдХреЗрд╡рд▓ рд╣рд╛рдЗрд▓рд╛рдЗрдЯреНрд╕ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдм рддрдХ рдкрд╣рдЪрд╛рдиреА рдЧрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдХрд╛рд░рдг рджреГрд╢реНрдп рдЕрд╡реНрдпрд╡рд╕реНрдерд╛

рддрдерд╛

рдЖрддрдВрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ (рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ) рдЬреЛ @jba рдФрд░ рдореИрдВ рдЪреВрдХ рдЧрдП рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ (рдХрд┐рд╕реА рдХреЛ) рдЭрдВрдХрд╛рд░ рдХрд░реЗрдВред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕, рдХреЛрдб рдХреНрд▓рдЯрд░, рд╕рд╛рдЗрдХреНрд▓реЛрдореИрдЯрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛, рд╕реНрдЯрдЯрд░, рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЗрддреНрдпрд╛рджрд┐ рдХреЛ "рд╡рд┐рдЬреБрдЕрд▓ рдХреНрд▓рдЯрд░" рд╕рдорд╕реНрдпрд╛ (рдпрд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдореВрд╣) рдХреЗ рд░реВрдкреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реВрдВред

@josharian рдХреНрдпрд╛ рдЖрдк рд╕реНрдХреЛрдкрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ (https://github.com/golang/go/issues/21161#issuecomment-319277657) рдХреЛ "рджреГрд╢реНрдп рдЕрд╡реНрдпрд╡рд╕реНрдерд╛" рд╕рдорд╕реНрдпрд╛ рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

@bcmills рдореЗрд░реЗ рд▓рд┐рдП рдЕрд▓рдЧ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реВрдХреНрд╖реНрдо рд╢реБрджреНрдзрддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░/рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ (рдпрд╛ рдХреЛрдб рдмрд▓реНрдХ рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╢реБрджреНрдзрддрд╛ рдореБрджреНрджреЛрдВ рдкрд░) рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред рдзрдиреНрдпрд╡рд╛рдж! рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдПрдХ-рдкрдВрдХреНрддрд┐ рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдореБрдЭрд╕реЗ рдЪреАрдиреА рдФрд░ рдЬрд╛рджреВ рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫреЗрдЧрд╛ред (рдореИрдВ рдЦреБрдж рдпрд╣ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВред)

рдореИрдВ рдЬрд╛рджреВ рдХреА рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: рдХреБрдЫ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрджрд┐ рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рд▓рд╛рдЗрди рдкрд░ рдпрд╛ рдлрдВрдХреНрд╢рди рдореЗрдВ рдореМрдЬреВрдж рд╕рднреА рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░, рдХреАрд╡рд░реНрдб рдФрд░ рдЧреНрд░рд╛рдорд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВред
  2. рд╡реНрдпрд╛рдХрд░рдг рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
  3. рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛ рд░рд╣реЗ рдХреЛрдб рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрдВрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕ рд╕реНрдХреЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣реЛрдЧрд╛ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рд╕рдЯреАрдХ рд░рд╣реЗрдВред

рдпрджрд┐ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдердо _reliably_ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреА рд╕рд╣реА рд╕рдордЭ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЬрд╛рджреБрдИ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЬрд╛рджреВ рд╣реИред рдЬрдм рдЖрдк рдЕрдиреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдВрджрд░реНрднреЛрдВ рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рддрдиреА рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╢реНрди рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ/рдХреЛрдб рдХреЗ _complexity_ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЬрд╛рджреВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдРрд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬрд┐рдирдХреЗ рдореВрд▓ рдореЗрдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЙрдиреНрд╣реЗрдВ рдмрд┐рдирд╛ рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рд╣реИ (рдЧреЛ рдореЗрдВ рдбреЙрдЯ рдЖрдпрд╛рдд, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ)ред рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдХреЛ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рднреА рдХреНрд╖рдорддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдХреБрдЫ рдСрдкрд░реЗрдЯрд░ рдХреНрдпрд╛ рд╣рд▓ рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдХреЛрдб рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЧреИрд░-рдореМрдЬреВрдж рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред рд░рдирдЯрд╛рдЗрдо рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕реНрдХреАрдорд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рд╕рдордп рдкрд░ рдХреЛрдИ рдХрдореЛрдмреЗрд╢ рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд╣рд╛рдБ рд╣реЛрдВрдЧреЗред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рд╡рд┐рд╖рдпрдкрд░рдХрддрд╛ рдХреЛ рдкреНрд░рд╢реНрди рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджреЗрддрд╛ рд╣реИред

рд╡рд┐рд╖рдп рдкрд░ рд╡рд╛рдкрд╕, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЯрди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рдФрд░ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬреЛ рд╕рднреА рдХреЛ "рд╣рд╛рдВ! рдмрд╕ рдЗрддрдирд╛ рд╣реА!" рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╢реВрдиреНрдпред

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдмрд╛рддрдЪреАрдд рдХреЛ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЖрдпрд╛рдореЛрдВ рдХреЛ рд╢реНрд░реЗрдгреАрдмрджреНрдз рдХрд░рдиреЗ рдФрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрд╛ рдмреЛрдз рдХрд░рд╛рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд░рд╣реА рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЫрд▓рд╛рдВрдЧ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рд┐рдХрд╛рдпрддреЗрдВ рджреЗрдЦреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП, рдмрд╣реБрдд рд╣реА рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ, рдЕрдЧрд░ рд╡реЗ рдЖрдо рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдЖрда рдмрд╛рд░ || &PathError{"chdir", dir, err} рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХреЛ рдХреБрдЫ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣ рдмрд╛рд░-рдмрд╛рд░ рдХреЛрдб рд╕реЗ рдПрд▓рд░реНрдЬреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдмрд╛рд░-рдмрд╛рд░ рдХреЛрдб рдбрд╛рдпрд╡рд░реНрдЬреЗрдВрд╕ рдмрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬреЛрдЦрд┐рдо рдореЗрдВ рд╣реИред) рд▓реЗрдХрд┐рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрдВрддреНрд░ рд╣реИ, рддреЛ рдХреЛрдб рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ, рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЫрд▓рд╛рдВрдЧ рдХреЗ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ? рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдкрд░ рдирд┐рд╣рд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рдЕрдиреНрдп рдкрд░рд╕реНрдкрд░-рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░реЗрдЧреАред

рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╕рдореБрджрд╛рдп рдЗрд╕ рд╕рднреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рдж рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╕реЗрдЯ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд╡рд╢ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рд╕реБрдЧрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред

(рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирдП рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рдорд╛рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдЕрдзреАрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓рдХреНрд╖реНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рд╣реИ, рдкреВрд░реНрдгрддрд╛ рдирд╣реАрдВ; рджреЛ рдпрд╛ рддреАрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╕рд╣реА рд╣реИрдВ рдкрдХреНрд╖рд╛рдШрд╛рдд рдХрд╛ рдорд╛рд░реНрдЧ рд╣реИред рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ (imho, рд╡рд╣ рдорд╛рдорд▓рд╛ рдЬрд╣рд╛рдВ рд╣рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡реИрдз рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рджреБрд░реНрд▓рдн рд╣реИ рд▓реЗрдХрд┐рди рд╣реЛрддрд╛ рд╣реИ) , рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд░рд╣реЗрдЧрд╛ред)

рдореИрдВ рдЗрд╕ рдкрд░ рджреВрд╕рд░реА рдмрд╛рд░ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ, рдпрд╣ рдореБрдЭреЗ рдорд╛рд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╢рд░реНрдд рд╡рд╛рдкрд╕реА рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдордЭ рдХреЗ рд╕рд╛рде рдЯрд░реНрдирд░реА рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ рд╣рдо рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╛рд░реНрд╕рд┐рдВрдЧ/рд╕рдВрдХрд▓рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ '?' рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╣рд╛рдВ рдлреЗрдВрдХ рджреВрдВрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдкрд░реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рднреА рд╣реЛрдВрдЧреЗред

рддреЛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func example1() error {
    err := doSomething()
    return err != nil ? err
    //more code
}

func example2() (*Mything, error) {
    err := doSomething()
    return err != nil ? nil, err
    //more code
}

рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рд╛рдл рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣реИрдВрдбрд▓рдИрд░ рдиреЗ рдПрдХ рдЧрд▓рддреА рд▓реМрдЯрд╛ рджреА рд╣реИ:

func example3() error {
    err := doSomething()
    return err !=nil ? handleErr(err)
    //more code
}

func example4() (*Mything, error) {
    err := doSomething()
    return err != nil ? nil, handleErr(err)
    //more code
}

рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рднреА рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рд▓рд╛рдЗрдирд░ рддрдХ рдХрдо рдХрд░ рдкрд╛рдПрдВрдЧреЗ:

func example5() error {
    return err := doSomething(); err !=nil ? handleErr(err)
    //more code
}

func example6() (*Mything, error) {
    return err := doSomething(); err !=nil ? nil, handleErr(err)
    //more code
}

@jba рд╕реЗ рдкрд┐рдЫрд▓рд╛ рд▓рд╛рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣

func (ds *GitDataSource) Fetch(from, to string) ([]string, error) {

    return err := createFolderIfNotExist(to); err != nil ? nil, err
    return err := clearFolder(to); err != nil ? nil, err
    return err := cloneRepo(to, from); err != nil ? nil, err
    dirs, err := getContentFolders(to)

    return dirs, err
}

рдЗрд╕ рд╕реБрдЭрд╛рд╡ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА, рд╢рд╛рдпрдж рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдмрдЪрд╛рдиреЗ рдореЗрдВ рдмрдбрд╝реА рдЬреАрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╢рд╛рдпрдж рдЙрд╕ рдореЛрд░реНрдЪреЗ рдкрд░ рдХреБрдЫ рд╡реНрдпрд╛рдкрдХ рдЧрд▓рдд рдзрд╛рд░рдгрд╛рдПрдВ)ред

рдЖрдк рд╢рд╛рдпрдж рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреАрд╡рд░реНрдб рдЬреЛ рд╕реНрдкрд╖реНрдЯрддрд╛ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рди рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рднреА рдЯреВрд▓рд┐рдВрдЧ рд╕реЛрдЪрдХрд░), рдЗрдиреНрд╣реЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ / рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ, рд╣рдореЗрдВ рдпрд╣ рджреЗ рд░рд╣рд╛ рд╣реИ:

func (ds *GitDataSource) Fetch(from, to string) ([]string, error) {

    return? err := createFolderIfNotExist(to); err != nil ? nil, err
    return? err := clearFolder(to); err != nil ? nil, err
    return? err := cloneRepo(to, from); err != nil ? nil, err
    dirs, err := getContentFolders(to)

    return dirs, err
}

рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рдЕрдВрддрд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ

return err != nil ? err

рддрдерд╛

 if err != nil { return err }

рд╕рд╛рде рд╣реА, рдХрднреА-рдХрднреА рдЖрдк рд╡рд╛рдкрд╕реА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЬреИрд╕реЗ panic рдпрд╛ log.Fatal рдХреЙрд▓ рдХрд░реЗрдВред

рдореИрдВ рдЗрд╕ рдкрд░ рдХрддрд╛рдИ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рдерд╛, рдФрд░ рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ @thejerf рд╕реЗ рд╕рд╣рдордд

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрддрд╛рдИ рдЧрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ рдХрд┐ рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЧреЛ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ 4 рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛
  2. рдЕрд╕рдВрд╢реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдирд╛
  3. рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдирд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
  4. рдкреИрдирд┐рдХрд┐рдВрдЧ (рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдорд╛рд░рдирд╛)

рдкреНрд░рд╕реНрддрд╛рд╡ рддреАрди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:

  1. рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА try-catch-finally рд╢реИрд▓реА рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред
  2. рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА 4 рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕/рдмрд┐рд▓рд┐рди рдЬреЛрдбрд╝реЗрдВ
  3. рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ go рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕/рдмрд┐рд▓рд┐рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИред

рджрд┐рдП рдЧрдП рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рдЖрд▓реЛрдЪрдирд╛рдУрдВ рдХреЛ рдХреЛрдб рдкрдардиреАрдпрддрд╛, рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдЫрд▓рд╛рдВрдЧ, рджрд╛рдпрд░реЗ рдореЗрдВ рдЪрд░ рдХреЗ рдирд┐рд╣рд┐рдд рдЬреЛрдбрд╝, рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдкрд░ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рд░рд╣реА рд╣реИред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░реА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдЙрджреНрджреЗрд╢реНрдп рдорд╛рдирджрдВрдб рдирд╣реАрдВ рд╣реИред

рдореИрдВ рд╢рд╛рдпрдж рд╡рд╣ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ рдЬреЛ рдорд╛рдирджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд╡рд╛рдж-рд╡рд┐рд╡рд╛рдж рдХреА рдЕрдкрдиреА рд╕рдордЭ рдХреЛ рдЕрдм рддрдХ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ 1. рд╣рдордиреЗ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ, 2. рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ, 3. рд╡реЗ рдЪреАрдЬреЗрдВ рдЧрд▓рдд рдХреНрдпреЛрдВ рд╣реИрдВ, рдФрд░ 4. рд╣рдо рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ 3 рдЖрдЗрдЯрдореЛрдВ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд░рд╛рд╢рд┐ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ "рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рд╣реИ" рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЖрдЗрдЯрдо 4 рдХреЗ рдЙрддреНрддрд░ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред

рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП @jba рдХреЗ рдКрдкрд░ рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рд╕рд╛рд░рд╛рдВрд╢ рдЯрд┐рдкреНрдкрдгреА рд╣реИред рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рдпрд╣рд╛рдВ рдХрд╣рд╛ рд╣реИ, рд╡рд╣ рдмрд╣реБрдд рдХреБрдЫ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣рддрд╛ рд╣реИред

@ianlancetaylor , рдпрд╛ рдХреЛрдИ рдФрд░ рдореЗрд░реЗ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдПрдХ "рдФрдкрдЪрд╛рд░рд┐рдХ" (рд╕рднреА рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ, рд╕рдВрдЧрдард┐рдд, рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рд╡реНрдпрд╛рдкрдХ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдирд╣реАрдВ) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЙрди рдорд╛рдирджрдВрдбреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ 4-6 рдмреБрд▓реЗрдЯ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреБрдЫ рдФрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмреВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рдорд╛рдирджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд╕реЗрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣ рдЙрди рдЪреАрдЬреЛрдВ рдХреА рдПрдХ рдЕрдзреВрд░реА рд╕реВрдЪреА рд╣реИ рдЬреЛ рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рддрднреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реЛред

  • 1 рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди) рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛; 2) рдЕрд╕рдВрд╢реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдирд╛; 3) рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рд▓рдкреЗрдЯрдирд╛ред
  • рдЬрдмрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╣рд╛рд╡реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдореМрдЬреВрджрд╛ рдЧреЛ 1 рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдкреВрд░реА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдЧреЛ 1 рдХреЛ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдпрд╛рдВрддреНрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╕рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЪрд╛рд╣реЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╣реА рдЪреАрдЬ рдХреБрдЫ рднреА рд╣реЛред
  • рдХреЛрдИ рднреА рдирдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯрд╛ рдФрд░/рдпрд╛ рдХрдо рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рднрд╛рд╖рд╛ рдЖрдЬ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдФрд░ рд╣рд░ рдмрджрд▓рд╛рд╡ рдХреА рдХреАрдордд рдЪреБрдХрд╛рдиреА рдкрдбрд╝рддреА рд╣реИред рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд▓рд╛рдн рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧрдд рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рд┐рд░реНрдл рдзреЛрдирд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдиреЛрдЯреНрд╕ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЖрдИрдПрдордПрдЪрдУ рдПрдХ рдФрд░ рдмрдбрд╝реА рдмрд╛рдзрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрдЪреНрдЫрддрд╛ред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ рдФрд░ рдмрд╛рд╣рд░реА рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рд╣реИред (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ stdlib рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реНрд░реЛрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдЪрд┐рдВрддрд╛рдПрдВ рдЧрд╛рдпрдм рд╣реИрдВ, рджреВрд╕рд░реЛрдВ рдХреЗ рдмреАрдЪ ..)

func NewClient(...) (*Client, error) {
    listener, err := net.Listen("tcp4", listenAddr)
    if err != nil {
        return nil, err
    }
    defer func() {
        if err != nil {
            listener.Close()
        }
    }()

    conn, err := ConnectionManager{}.connect(server, tlsConfig)
    if err != nil {
        return nil, err
    }
    defer func() {
        if err != nil {
            conn.Close()
        }
    }()

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    err = toServer.Send(&client.serverConfig)
    if err != nil {
        return nil, err
    }

    err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
    if err != nil {
        return nil, err
    }

    session, err := communicationProtocol.FinalProtocol(conn)
    if err != nil {
        return nil, err
    }
    client.session = session

    return client, nil
}

(рдЖрдЗрдП рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рди рдХрд░реЗрдВред рдореИрдВ рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдореЗрд░рд╛ рдЕрд╕рд▓реА рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдФрд░ рдереЛрдбрд╝рд╛ рдЙрд▓рдЭрд╛ рд╣реБрдЖ рд╣реИред рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдирдореВрдирд╛ рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд╕рдХрддрд╛ред)

рдЕрд╡рд▓реЛрдХрди:

  1. рдпрд╣ рд╕рд╣реА рдХреЛрдб рдирд╣реАрдВ рд╣реИ; рдореИрдВ рдмреЗрдпрд░ рдПрд░рд░ рдмрд╣реБрдд рд▓реМрдЯрд╛рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рдХреЛрдб рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдФрд░ рдХрд┐рддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╡реЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. if forwardPort == 0 рдЦрдВрдб _deliberately_ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рд░реА рд╣реИ, рдФрд░ рд╣рд╛рдБ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рди рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдореИрдВрдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рд╣реИред
  3. рдпрд╣ рдХреЛрдб рдпрд╛ рддреЛ рдПрдХ рд╡реИрдз, рдХрдиреЗрдХреНрдЯреЗрдб рдХреНрд▓рд╛рдЗрдВрдЯ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рд╕рдВрд╕рд╛рдзрди рд▓реАрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП .Close() (рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╣рд░) рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИред рдиреЛрдЯ рднреА рдмрдВрдж рдХрд░реЗрдВ рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЛ рдореЗрдВ рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред
  4. рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХрд╣реАрдВ рдФрд░ рд╡рд┐рд╡рд╢ рд╣реИ, рдЗрд╕рд▓рд┐рдП url.Parse рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ (рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛)ред

рдореИрдВ рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╣рд░ рд╕рдВрднрд╡ рддреНрд░реБрдЯрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╕рд░рдЧрдо тАЛтАЛтАЛтАЛрд╢рд╛рдорд┐рд▓ рд╣реИред (рдореИрдВ рдЕрдХреНрд╕рд░ рдПрдЪрдПрди рдкрд░ рдЧреЛ рдХрд╛ рдмрдЪрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗ рдХрд┐ рдЬрдм рддрдХ рдореЗрд░рд╛ рдХреЛрдб рдЦрд╛рдирд╛ рдкрдХрд╛рдиреЗ рдХреЗ рд╕рдордп рддрдХ рд╣реЛрддрд╛ рд╣реИ, рддрдм рддрдХ рдореЗрд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕рд░реНрд╡рд░ рдореЗрдВ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ; рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ, 1 / 3rd рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ 1/2 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рдХрд┐рдпрд╛ред)

рдореИрдВ рдЗрд╕ рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ (рдЕрджреНрдпрддрди) рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рднреА (рдкреБрдирдГ-) рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдореБрдЭреЗ рдЖрд╢реНрд╡рд╕реНрдд рди рдХрд░реЗ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдХреБрдЫ рдмреЗрд╣рддрд░ рд╣реИ), рд▓реЗрдХрд┐рди рдмрд╛рддрдЪреАрдд рдкрд░ рдПрдХрд╛рдзрд┐рдХрд╛рд░ рди рдХрд░рдиреЗ рдХреЗ рд╣рд┐рдд рдореЗрдВ рдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрдо рд╕реЗ рдХрдо рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВред (рдпрд╣ рдЬрд┐рддрдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдХрдо рдкрд╛рда рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд░реЛрдд рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА ....)

try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╣рд╛рдВ try if != nil return рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рд╣реИ, рдХреЛрдб рдХреЛ 59 рдореЗрдВ рд╕реЗ 6 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд▓рдЧрднрдЧ 10% рд╣реИред

func NewClient(...) (*Client, error) {
    listener, err := net.Listen("tcp4", listenAddr)
    try err

    defer func() {
        if err != nil {
            listener.Close()
        }
    }()

    conn, err := ConnectionManager{}.connect(server, tlsConfig)
    try err

    defer func() {
        if err != nil {
            conn.Close()
        }
    }()

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    err = toServer.Send(&client.serverConfig)
    try err

    err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
    try err

    session, err := communicationProtocol.FinalProtocol(conn)
    try err

    client.session = session

    return client, nil
}

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рдореИрдВ try x() рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдбрд┐рдлрд░реНрд╕ рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдПрдХ рдФрд░ред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ try рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ 47 рд▓рд╛рдЗрдиреЛрдВ рддрдХ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

func NewClient(...) (*Client, error) {
    try listener, err := net.Listen("tcp4", listenAddr)

    defer func() {
        if err != nil {
            listener.Close()
        }
    }()

    try conn, err := ConnectionManager{}.connect(server, tlsConfig)

    defer func() {
        if err != nil {
            conn.Close()
        }
    }()

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    try err = toServer.Send(&client.serverConfig)

    try err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})

    try session, err := communicationProtocol.FinalProtocol(conn)

    client.session = session

    return client, nil
}
import "github.com/pkg/errors"

func Func3() (T1, T2, error) {...}

type PathError {
    err Error
    x   T3
    y   T4
}

type MiscError {
    x   T5
    y   T6
    err Error
}


func Foo() (T1, T2, error) {
    // Old school
    a, b, err := Func(3)
    if err != nil {
        return nil
    }

    // Simplest form.
    // If last unhandled arg's type is same 
    // as last param of func,
    // then use anon variable,
    // check and return
    a, b := Func3()
    /*    
    a, b, err := Func3()
    if err != nil {
         return T1{}, T2{}, err
    }
    */

    // Simple wrapper
    // If wrappers 1st param TypeOf Error - then pass last and only unhandled arg from Func3() there
    a, b, errors.WithStack() := Func3() 
    /*
    a, b, err := Func3()
    if err != nil {
        return T1{}, T2{}, errors.WithStack(err)
    }
    */

    // Bit more complex wrapper
    a, b, errors.WithMessage("unable to get a and b") := Func3()
    /*
    a, b, err := Func3()
    if err != nil {
        return T1{}, T2{}, errors.WithMessage(err, "unable to get a and b")
    }
    */

    // More complex wrapper
    // If wrappers 1nd param TypeOf is not Error - then pass last and only unhandled arg from Func3() as last
    a, b, fmt.Errorf("at %v Func3() return error %v", time.Now()) := Func3()
    /*
    a, b, err := Func3()
    if err != nil {
        return T1{}, T2{}, fmt.Errorf("at %v Func3() return error %v", time.Now(), err)
    }
    */

    // Wrapping with error types
    a, b, &PathError{x,y} := Func3()
    /*
    a, b, err := Func3()
    if err != nil {
        return T1{}, T2{}, &PathError{err, x, y}
    }
    */
    a, b, &MiscError{x,y} := Func3()
    /*
    a, b, err := Func3()
    if err != nil {
        return T1{}, T2{}, &MiscError{x, y, err}
    }
    */

    return a, b, nil
}

рдереЛрдбрд╝рд╛ рдЬрд╛рджреВ (-1 рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ) рд▓реЗрдХрд┐рди рдпрд╛рдВрддреНрд░рд┐рдХ рдЕрдиреБрд╡рд╛рдж рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

рдпрд╣ рд╡рд╣реА рд╣реИ (рдХреБрдЫ рд╣рдж рддрдХ рдЕрджреНрдпрддрди) рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

func NewClient(...) (*Client, error) {
    defer annotateError("client couldn't be created")

    listener := pop net.Listen("tcp4", listenAddr)
    defer closeOnErr(listener)
    conn := pop ConnectionManager{}.connect(server, tlsConfig)
    defer closeOnErr(conn)

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
         forwardOut = forwarding.NewOut(pop url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort)))
    }

    client := &Client{listener: listener, conn: conn, forward: forwardOut}

    toServer := communicationProtocol.Wrap(conn)
    pop toServer.Send(&client.serverConfig)
    pop toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
    session := pop communicationProtocol.FinalProtocol(conn)
    client.session = session

    return client, nil
}

func closeOnErr(c io.Closer) {
    if err := erroring(); err != nil {
        closeErr := c.Close()
        if err != nil {
            seterr(multierror.Append(err, closeErr))
        }
    }
}

func annotateError(annotation string) {
    if err := erroring(); err != nil {
        log.Printf("%s: %v", annotation, err)
        seterr(errwrap.Wrapf(annotation +": {{err}}", err))
    }
}

рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ:

pop рдлрд╝рдВрдХреНрд╢рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдиреВрдиреА рд╣реИ рдЬрд╣рд╛рдВ рд╕рд╣реА-рдЕрдзрд┐рдХрддрдо рдорд╛рди рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ "рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ рдФрд░ рд╡рд╣ рддреНрд░реБрдЯрд┐, рдЕрдиреНрдпрдерд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ"ред pop рдХрд╛ erroring() рд╕рд╛рде рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдирд╣реАрдВ рд╣реИ; рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдкрд╕реА рдЕрднреА рднреА erroring() рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЖрдк рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рднреА рдЖрд╕реНрдердЧрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░реВрдкрдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреА "рд╕реВрдЪреА" рд╕реЗ рд╕рдмрд╕реЗ рд╕рд╣реА рддрддреНрд╡ рдХреЛ рдкреЙрдк рдХрд░ рд░рд╣рд╛ рд╣реИред

erroring() рдХреЛ рдЪрд▓ рд░рд╣реЗ рдЖрд╕реНрдердЧрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдХреЗ рдКрдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд┐рдЫрд▓реЗ рд╕реНрдЯреИрдХ рддрддреНрд╡ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреНрдпреВрдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИ), рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд▓реВред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╛ рддреЛ рдШрдмрд░рд╛рдПрдВ рдпрд╛ рд╢реВрдиреНрдп рд▓реМрдЯреЗрдВ (рдЬреЛ рднреА рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ)ред рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд╛рди pop рд╕реЗ рдЖрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдХреБрдЫ рднреА рд╣реИ рдЬреЛ рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред

seterr(error) рдЖрдкрдХреЛ рд▓реМрдЯрд╛рдП рдЬрд╛ рд░рд╣реЗ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рддрдм рдХрд┐рд╕реА рднреА рднрд╡рд┐рд╖реНрдп рдХреЗ erroring() рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреА рдЧрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣реА рдбрд┐рдлрд░-рдЖрдзрд╛рд░рд┐рдд рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣рд╛рдБ рд╣реИрд╢рд┐рдХреЙрд░реНрдк рд░реИрдкрд┐рдВрдЧ рдФрд░ рдорд▓реНрдЯреАрдПрд░рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ; рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЪрддреБрд░ рдкреИрдХреЗрдЬ рдбрд╛рд▓реЗрдВред

рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рднреА, рдпреЛрдЧ рдЫреЛрдЯрд╛ рд╣реИред рдореИрдВ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧреЛрдВ рдореЗрдВ рдкрд░рд┐рд╢реЛрдзрди рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЧрд┐рдирдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреБрдЫ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ рдлреЙрд░рд╡рд░реНрдбрдкреЛрд░реНрдЯ рдХреЛ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред рдПрдХ рдЕрд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛрдирд╛ рдареАрдХ рд╣реИред

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдЖрдИрдПрдордПрдЪрдУ рдХреЗрд╡рд▓ рддрднреА рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЖрдк рдЗрд╕реЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрдВред рдпрд╣ рдХрд╛рдлреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ _collection_ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдХрдард┐рди рд╣реИред (рдЬреИрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЛ рдХреЛрдб рдореЗрдВред рдмрдВрдж рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдкрд╡рд╛рдж-рдЖрдзрд╛рд░рд┐рдд рдХреЛрдб рдореЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред)

рдпрд╣ рдореМрдЬреВрджрд╛ рдЧреЛ рдкреИрдЯрд░реНрди рдЬреИрд╕реЗ defer рдФрд░ рдЖрд╕рд╛рди рд╕рд╣реА рддреНрд░реБрдЯрд┐-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреИрдЯрд░реНрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ-рдХреЗ-рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╛ рддреЛ рд╡рд░реНрддрдорд╛рди рдЧреЛ рдпрд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХрдЯреНрдЯрд░рдкрдВрдереА рд╕рд░реНрдЬрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП (рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛), рдФрд░ рд╕рд╛рде рд╣реА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _require_ рдПрдХ Go 2.0 рдирд╣реАрдВ рд╣реИред

рдиреБрдХрд╕рд╛рди рдореЗрдВ erroring , pop , рдФрд░ seterr рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рджрд╛рд╡рд╛ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрди рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП defer рдУрд╡рд░рд╣реЗрдб

рдпрд╣рд╛рдБ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдЪрд░реНрдЪрд╛ рд╣реИред

рдореИрдВ рддреНрд░реБрдЯрд┐ рдЪрд░ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдХреЛрдИ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдкреЗрд╢ рди рдХрд┐рдП рдЬрд╛рдПрдВред рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рдореИрдВ рдЙрд╕реА рд▓рд╛рдЗрди рдкрд░ рддреНрд░реБрдЯрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ || -рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП "рдмрд╣реБрдд рдмреВрд▓рд┐рдпрди" рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ "рд╡рд╛рдкрд╕реА" рдЫреБрдкрд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреАрд╡рд░реНрдб "рд░рд┐рдЯрд░реНрди?" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рдКрдВрдЧрд╛ред C# рдореЗрдВ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╢реЙрд░реНрдЯрдХрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдИ. рдЬреА. рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп:

if(foo != null)
{ foo.Bar(); }

рдЖрдк рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
foo?.Bar();

рддреЛ рдЧреЛ 2 рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

func foobar() error {
    return fmt.Errorf("Some error happened")
}

// Implicitly return err (there must be exactly one error variable on the left side)
err := foobar() return?
// Explicitly return err
err := foobar() return? err
// Return extended error info
err := foobar() return? &PathError{"chdir", dir, err}
// Return tuple
err := foobar() return? -1, err
// Return result of function (e. g. for logging the error)
err := foobar() return? handleError(err)
// This doesn't compile as you ignore the error intentionally
foobar() return?

рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдЪрд╛рд░:

рдлреВ, рдЧрд▓рддреА: = myFunc ()
рдЧрд▓рддреА!= рд╢реВрдиреНрдп? рд╡рд╛рдкрд╕реА рд▓рдкреЗрдЯреЛ (рддреНрд░реБрдЯрд┐)

рдпрд╛

рдЕрдЧрд░ рдЧрд▓рддреА!= рд╢реВрдиреНрдп? рд╡рд╛рдкрд╕реА рд▓рдкреЗрдЯреЛ (рддреНрд░реБрдЯрд┐)

рдпрджрд┐ рдЖрдк рдЙрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреБрдЫ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рд▓рдЧрд╛рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!

if err != nil { return wrap(err) }

рдЖрдкрдХреЗ рдкрд╛рд╕ _all_ рдордирдЪрд╛рд╣рд╛ рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ (рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рд╕реЗ рдХреЛрдб рдХреА рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрд╛ рд╣реИ, рдпрд╣ 100% рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реИ), рдпрд╣ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИ, рдФрд░ рдпрд╣ рд╣реИ рдЖрд╕рд╛рдиред рдпрд╣ рдЗрдпрд╛рди рдХреЗ рдХрдИ gofmt рдЯреВрд▓реАрдВрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдореИрдВрдиреЗ рдХрд╛рд░реНрд▓рдордЬреЙрдирд╕рди рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд▓рд┐рдЦрд╛ рдерд╛, рдЬреЛ рд╕рдорд╛рди рд╣реИ ...

рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ # ред

рд▓реЗрдХрд┐рди рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рд╛рдорд╛рдиреНрдп if err != nil { ... } рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░ рд╕рдХреЗрдВ, рдпрд╣ рдиреНрдпреВрдирддрдо рддреНрд░реБрдЯрд┐ рдХреЛ рдмреЗрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк after рдирд╛рдордХ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдЯрд░реНрди рдорд┐рдбрд▓рд╡реЗрдпрд░ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗред , рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рдЪрд▓рддрд╛ рд╣реИ... (рдЬреИрд╕реЗ defer рд▓реЗрдХрд┐рди args рдХреЗ рд╕рд╛рде)ред

@after(func (data string, err error) {
  if err != nil {
    log.Error("error", data, " - ", err)
  }
})
func alo() (string, error) {
  // this is the equivalent of
  // data, err := db.Find()
  // if err != nil { 
  //   return "", err 
  // }
  str, #err := db.Find()

  // ...

  #err = db.Create()

  // ...

  return str, nil
}

func alo2() ([]byte, []byte, error, error) {
  // this is the equivalent of
  // data, data2, err, errNotFound := db.Find()
  // if err != nil { 
  //   return nil, nil, err, nil
  // } else if errNotFound != nil {
  //   return nil, nil, nil, errNotFound
  // }
  data, data2, #err, #errNotFound := db.Find()

  // ...

  return data, data2, nil, nil
}

рдХреНрд▓реАрдирд░ рдлрд┐рд░:

func alo() (string, error) {
  str, err := db.Find()
  if err != nil {
    log.Error("error on find in database", err)
    return "", err
  }

  // ...

  if err := db.Create(); err != nil {
    log.Error("error on create", err)
    return "", err
  }

  // ...

  return str, nil
}

func alo2() ([]byte, []byte, error, error) {
  data, data2, err, errNotFound := db.Find()
  if err != nil { 
    return nil, nil, err, nil
  } else if errNotFound != nil {
    return nil, nil, nil, errNotFound
  }

  // ...

  return data, data2, nil, nil
}

рдХреИрд╕реЗ рдХреА рддрд░рд╣ рдПрдХ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ guard рдмрдпрд╛рди рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд╡рд╛рдп guard...else рдпрд╣ guard...return :

file, err := os.Open("fails.txt")
guard err return &FooError{"Couldn't foo fails.txt", err}

guard os.Remove("fails.txt") return &FooError{"Couldn't remove fails.txt", err}

рдореБрдЭреЗ рдЧреЛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЦреЛрдЬрдХрд░реНрддрд╛ рдкрд╕рдВрдж рд╣реИред рдПрдХрдорд╛рддреНрд░ рдкрд░реЗрд╢рд╛рдиреА, рдЗрдореНрд╣реЛ, рдпрд╣ рдХрд┐рддрдиреА рдЬрдЧрд╣ рд▓реЗрддреА рд╣реИред рдореИрдВ 2 рдЯреНрд╡рд┐рдХреНрд╕ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:

  1. рдмреВрд▓рд┐рдпрди рд╕рдВрджрд░реНрдн рдореЗрдВ рд╢реВрдиреНрдп-рд╕рдХреНрд╖рдо рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЬрд╣рд╛рдВ nil false рдмрд░рд╛рдмрд░ рд╣реИ, рдЧреИрд░- nil рд╕реЗ true
  2. && рдФрд░ || рдЬреИрд╕реЗ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдХрдВрдбреАрд╢рдирд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

рдЗрд╕рд▓рд┐рдП

file, err := os.Open("fails.txt")
if err != nil {
    return &FooError{"Couldn't foo fails.txt", err}
}

рдмрди рд╕рдХрддрд╛ рд╣реИ

file, err := os.Open("fails.txt")
if err {
    return &FooError{"Couldn't foo fails.txt", err}
}

рдпрд╛ рдЙрд╕рд╕реЗ рднреА рдЫреЛрдЯрд╛

file, err := os.Open("fails.txt")
err && return &FooError{"Couldn't foo fails.txt", err}

рдФрд░, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

i,ok := v.(int)
ok || return fmt.Errorf("not a number")

рдпрд╛ рд╢рд╛рдпрдж

i,ok := v.(int)
ok && s *= i

рдпрджрд┐ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ && рдФрд░ || рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдХреБрдЫ рдЕрдиреНрдп рд╡рд░реНрдгреЛрдВ (2 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ) рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ ? рдФрд░ # рдпрд╛ ?? рдФрд░ ## , рдпрд╛ ?? рдФрд░ !! , рдЬреЛ рднреА рд╣реЛред рдиреНрдпреВрдирддрдо "рд╢реЛрд░" рд╡рд░реНрдгреЛрдВ (рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛, рдмреНрд░реЗрд╕рд┐рдЬрд╝, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рд╕рд╢рд░реНрдд рдХрдерди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдмрд┐рдВрджреБред рдСрдкрд░реЗрдЯрд░ && рдФрд░ || рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдорд┐рд╕рд╛рд▓ рд╣реИред

рдпрд╣ рдЬрдЯрд┐рд▓ рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рд╕рд╢рд░реНрдд рд╡рд┐рд╡рд░рдг рд╣реИрдВред

рд╕рд╛рде рд╣реА, рдпрд╣ рдХреБрдЫ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ "рд╕рддреНрдпрддрд╛" рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИред рдпреЗ рд╕рд╢рд░реНрдд рдХреЗрд╡рд▓ рд╢реВрдиреНрдп/рдЧреИрд░-рд╢реВрдиреНрдп, рдпрд╛ рдмреВрд▓рд┐рдпрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗред

рдЗрди рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХрд▓ рдЪрд░ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓, рдпрд╛ else рдХреНрд▓реЙрдЬ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ if ... рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд┐рд░реНрдл рдПрдХ рдкрд╣рд┐рдпрд╛ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ рдФрд░ рдЬреНрдЮрд╛рдд try..catch рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреИрд╕рд╛ рдХрд┐ @mattn рдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛? )

try {
    a := foo() // func foo(string, error)
    b := bar() // func bar(string, error)
} catch (err) {
    // handle error
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрдХрдбрд╝реЗ рдЧрдП рддреНрд░реБрдЯрд┐ рд╕реНрд░реЛрдд рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ if err != nil рдмрд┐рдирд╛ try..catch рдХреЗ рдкреБрд░рд╛рдиреЗ рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╛рде рд╣реА, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рдХреЛ "рдлреЗрдВрдХрдиреЗ" рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреА рд╣реИ?

func foo() (string, error) {
    f := bar() // similar to if err != nil { return "", err }
}

func baz() string {
    // Compilation error.
    // bar's error must be handled because baz() does not return error.
    return bar()
}

@gobwas рдкрдардиреАрдпрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХреЛрдИ рдирд╣реАрдВ рдмрддрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд░реЗрдЦрд╛ рдХреИрдЪ рдмреНрд▓реЙрдХ рдкрд░ рдХреВрджрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИред рдпрд╣ рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП goto рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рддрд░рд╣ рд╣реИред рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдХрд┐ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдПрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рдлреА рд╣рдж рддрдХ return рдпрд╛ goto рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рдеред

@creker рд╣рд╛рдБ, рдореИрдВ

рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛:

try {
    a ::= foo() // func foo(string, error)
    b ::= bar() // func bar(string, error)
} catch (err) {
    // handle error
}

рдпрд╛ рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡ рдЬреИрд╕реЗ try a := foo() ..?

@gobwas

рдЬрдм рдореИрдВ рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рдЙрддрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЯреНрд░рд╛рдИ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреМрди рд╕рд╛ рдлрдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛?

@urandom рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддреЛ рдЖрдк рд╢рд╛рдпрдж if err != nil рдмрд┐рдирд╛ try..catch ред

@ рд░реЙрдмрд░реНрдЯ-рд╡рд╛рд▓рд┐рд╕: рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рдЧрд╛рд░реНрдб рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛

@pdk

рдмреВрд▓рд┐рдпрди рд╕рдВрджрд░реНрдн рдореЗрдВ рд╢реВрдиреНрдп-рд╕рдХреНрд╖рдо рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЬрд╣рд╛рдВ рд╢реВрдиреНрдп рдЧрд▓рдд рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЧреИрд░-рд╢реВрдиреНрдп рд╕реЗ рд╕рддреНрдп рд╣реИ

рдореИрдВ рдЗрд╕реЗ рдзреНрд╡рдЬ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБрдд рд╕реА рдмрдЧреЛрдВ рдХреА рдУрд░ рдЕрдЧреНрд░рд╕рд░ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рд▓реЛрдЧ if myflag { ... } рд▓рд┐рдЦреЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм if *myflag { ... } рд▓рд┐рдЦрдирд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдкрдХрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред

рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдХреЗрд╡рд▓ рддрднреА рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрдИ рдЪреАрдЬреЛрдВ рдХреЛ рдмреИрдХ-рдЯреВ-рдмреИрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рднреА рд╕рд╣рдордд рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдЖрджрд┐ рдХреЗ рдХрд╛рд░рдг рдЦрд░рд╛рдм рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рд╕реНрд╡рд┐рдлреНрдЯ рдХреА рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдХрдо рд╕реЗ рдХрдо рджреГрд╢реНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдирд╣реАрдВ рдХрд┐ рдХреМрди рд╕реЗ рдмрдпрд╛рди рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ:

do {
    let dragon = try summonDefaultDragon() 
    try dragon.breathFire()
} catch DragonError.dragonIsMissing {
    // ...
} catch DragonError.halatosis {
    // ...
}

@ рд░реЙрдмрд░реНрдЯ-рд╡рд╛рд▓рд┐рд╕, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

file, err := os.Open("fails.txt")
guard err return &FooError{"Couldn't foo fails.txt", err}

guard os.Remove("fails.txt") return &FooError{"Couldn't remove fails.txt", err}

guard рдХреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдкрд░, рдпрд╣ if err != nil { return &FooError{"Couldn't foo fails.txt", err}} рдЬреИрд╕рд╛ рдмрд╣реБрдд рднрдпрд╛рдирдХ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝реА рдЬреАрдд рд╣реИред

рджреВрд╕рд░реЗ рдЙрдкрдпреЛрдЧ рдкрд░, рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ err рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ os.Open рд╕реЗ рд▓реМрдЯрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдерд╛? рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдЧрд╛?

guard err = os.Remove("fails.txt") return &FooError{"Couldn't remove fails.txt", err}

рдХрд┐рд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ ...

if err = os.Remove("fails.txt"); err != nil { return &FooError{"Couldn't remove fails.txt", err}}

рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рдХрдо рджреГрд╢реНрдп рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИред if err = , ; err != nil { - рднрд▓реЗ рд╣реА рдпрд╣ рдПрдХ рд▓рд╛рдЗрдирд░ рд╣реЛ, рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рдЪрд▓ рд░рд╣рд╛ рд╣реИ

рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдХрдо рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИред рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрдо? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╣рд╛рдВ рд╕рд╣рдордд рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛/рд╕реА#/... рдореЗрдВ рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреА рдкрдардиреАрдпрддрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рджреНрд╡рд╛рд░рд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реБрдХрд╛рд╡рдЯ рдХреЗ "рдЦреБрд╢ рдкрде" рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рдЧреЛрдЯреЛ рддрдВрддреНрд░ рд╣реИред

рдЧреЛ рдореЗрдВ рдореИрдВ "рдЦреБрд╢ рдкрде" рддрд░реНрдХ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд╛рдж рдЦрд╛рд▓реА рд▓рд╛рдЗрдиреЗрдВ рдбрд╛рд▓рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред рддреЛ рдЗрд╕ рдирдореВрдиреЗ рдореЗрдВ рд╕реЗ golang.org (9 рд▓рд╛рдЗрди) рд╕реЗ

record := new(Record)
err := datastore.Get(c, key, record) 
if err != nil {
    return &appError{err, "Record not found", 404}
}
err := viewTemplate.Execute(w, record)
if err != nil {
    return &appError{err, "Can't display record", 500}
}

рдореИрдВ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдБ (11 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

record := new(Record)

err := datastore.Get(c, key, record) 
if err != nil {
    return &appError{err, "Record not found", 404}
}

err := viewTemplate.Execute(w, record)
if err != nil {
    return &appError{err, "Can't display record", 500}
}

рдЕрдм рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд╡рд╛рдкрд╕, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (3 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

record := new(Record)
err := datastore.Get(c, key, record) return? &appError{err, "Record not found", 404}
err := viewTemplate.Execute(w, record) return? &appError{err, "Can't display record", 500}

рдЕрдм рдореБрдЭреЗ рдЦреБрд╢реА рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╕рд╛рдл рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред рдореЗрд░реА рдЖрдВрдЦреЛрдВ рдХреЛ рдЕрднреА рднреА рдкрддрд╛ рд╣реИ рдХрд┐ рджрд╛рдпреАрдВ рдУрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдЗрд╕реЗ "рдЖрдИ-рдкрд╛рд░реНрд╕" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рднреА рдкрдХреНрд╖реЛрдВ рд╕реЗ рдПрдХ рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

func foobar() error {
    return fmt.Errorf("Some error")
}
func main() {
    foobar()
}

рдЖрдИрдПрдордПрдЪрдУ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ:

func main() {
    _ := foobar()
}

@ianlancetaylor рдореВрд▓ рдкреЛрд╕реНрдЯ рдХреЗ рдмрд┐рдВрджреБ 3 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдорд┐рдиреА рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ ред

рдЧреЛ рдХреЗ рд▓рд┐рдП рдПрдХ flac рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо @davecheney pkg/errors рдкреИрдХреЗрдЬ (https://github.com/mewkiz/flac/issues/22) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред рд╡рд┐рдерд╕реНрдЯреИрдХ рдЬреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдирдпрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд┐рдерд╕реНрдЯреИрдХ , рдкреНрд░рдХрд╛рд░ рд╣реИ

type withStack struct {
    error
    *stack
}

рдЕрдм, рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкрд░рдВрдкрд░рд╛ рд╣реИред io.EOF ред

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрдм рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП errors.Cause рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ https://github.com/mewkiz/flac/blob/0884ed715ef801ce2ce0c262d1e674fdda6c3d94/cmd/flac2wav/flac2wav.go#L78 рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдореВрд▓реНрдп:

frame, err := stream.ParseNext()
if err != nil {
    if errors.Cause(err) == io.EOF {
        break
    }
    return errors.WithStack(err)
}

рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдкреАрдХреЗрдЬреА/рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреБрди: рд╕рдХреНрд░рд┐рдп рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдПред рд╢реВрдиреНрдп-рдкреИрдбрд┐рдВрдЧ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдПрдХ io.Reader рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд░реАрдб рдмрд╛рдЗрдЯреНрд╕ рд╢реВрдиреНрдп рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдЕрдиреНрдпрдерд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдЪрд╛рдирдХ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд▓рдЧреЗ ред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ zeros.Read рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдЕрдм io.EOF рдХреЗ рдмрдЬрд╛рдп error.withStack рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрд╛рдж рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рд╣реБрдИрдВ рдЬрдм рд╣рдордиреЗ рдЙрд╕ рдкрд╛рдардХ рдХреЛ io.Copy рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ io.EOF рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ, рдФрд░ errors.Cause рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрдЯ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ "рдЕрдирд░реИрдк" рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рд╕рдВрджрд░реНрднрд┐рдд рдЬрд╛рдирдХрд╛рд░реАред рдЪреВрдВрдХрд┐ рд╣рдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрджреНрдпрддрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдпрд╣ рдерд╛ рдХрд┐ рдмрд┐рдирд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рджреА рдЬрд╛рдП (https://github.com/mewkiz/flac/commit/6805a34d854d57b12f72fd74304ac296fd0c07be)ред

рдареЛрд╕ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрдЯ рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЦреЛрдирд╛ рдПрдХ рдиреБрдХрд╕рд╛рди рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рд╣рдорд╛рд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ рджреВрд░ рдпрд╣ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдиреЗ рдЗрд╕реЗ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ред рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХреА, рдХреНрдпреЛрдВрдХрд┐ zeros рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА io.Reader рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдпрд╣ рднреА рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╣рдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рддреНрд░реБрдЯрд┐ рдПрдиреЛрдЯреЗрд╢рди рдПрдХ рдорд╢реАрди рдЬрдирд┐рдд рдкреБрдирд░реНрд▓реЗрдЦрди рдерд╛, рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реБрдЖ, рдФрд░ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдЧреЛ 2 рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╕рдордп, рдЬреИрд╕реЗ рдХрд┐ рддреНрд░реБрдЯрд┐ рддреБрд▓рдирд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЕрднреА рднреА рдореВрд▓ рд░реВрдк рд╕реЗ рд╣реИред

рд╕рд╣реГрджрдп рдирд┐рд╡реЗрджрди,
рд░реЛрдмрд┐рди

@mewmew , рдЖрдЗрдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рдЦреЗрдВред рдХреИрд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд░реИрдк рдФрд░ рдЕрдирд░реИрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рдХрд╣реАрдВ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣рдж рддрдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИред

рдореИрдВ рдЖрдкрдХреЗ рдХреЛрдбрдмреЗрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдИрдУрдПрдл рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА? рдпрджреНрдпрдкрд┐ рдЗрд╕реЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, EOF рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдорд╛рди рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ io.Reader рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рд╣реИред рдпрджрд┐ рдпрд╣ io.EOF рдирд╣реАрдВ рд╣реЛрддрд╛ рддреЛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛?

рд╣рд╛рдБ, рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджреЗрдВ рдЬреИрд╕реЗ рд╡реЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рдерд╛ рдХрд┐ рдЧреЛ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬрд╣рд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЬрдм рдЖрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдШрдмрд░рд╛рд╣рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реИред

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝-рдлреЗрдВрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЖрддрдВрдХ() рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд() рдХрд╛ рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИ?

рдЖрд╣, рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╕рдбрд╝рдХ рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

_, ? := foo()
x?, err? := bar()

рдпрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛ рднреА

_, err := foo(); return err?
x, err := bar(); return x? || err?
x, y, err := baz(); return (x? && y?) || err?

рдЬрд╣рд╛рдВ ? if var != nil{ return var } рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдЙрдкрдирд╛рдо рдмрди рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдмрд┐рд▓рд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рдзрд┐ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИ

func ?() bool //looks funky but avoids breakage.

рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдирдП рдФрд░ рдмреЗрд╣рддрд░ рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@mortdeus

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред
рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рд╣реИрдкреНрдкреА рдкрде рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рддреЛ рдЖрдИрдбреАрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд╢реЙрд░реНрдЯрдХрдЯ рдХреЗ рд╕рд╛рде if err != nil { return [...] } рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлреЛрд▓реНрдб/рдкреНрд░рдХрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рд╣рд░ рд╣рд┐рд╕реНрд╕рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред err != nil рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред return ... рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдФрд░ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдРрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдЬреЛ err рдЪрд░ рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕рд╢рд░реНрдд рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЧреЛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддреА рд╣реИрдВред рдореИрдВ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

рдПрдХреНрд╕, рд╡рд╛рдИ, рдЧрд▓рддреА: = рдмрд╛рдЬрд╝ (); рд╡рд╛рдкрд╕реА ( x? && y? ) || err?

рдЬрд╣рд╛рдВ ? рдЕрдЧрд░ var == nil {рд░рд┐рдЯрд░реНрди var} рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдЙрдкрдирд╛рдо рдмрди рдЬрд╛рддрд╛ рд╣реИред

рдПрдХреНрд╕, рд╡рд╛рдИ, рдЧрд▓рддреА: = рдмрд╛рдЬрд╝ (); рд╡рд╛рдкрд╕реА ( if x == nil{ return x} && if y== nil{ return y} ) || if err == nil{ return err}

рдПрдХреНрд╕, рд╡рд╛рдИ, рдЧрд▓рддреА: = рдмрд╛рдЬрд╝ (); рд╡рд╛рдкрд╕реА (рдПрдХреНрд╕? && рд╡рд╛рдИ?) || рдЧрд▓рддреА?

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдПрдХреНрд╕, рд╡рд╛рдИ, рдЧрд▓рддреА: = рдмрд╛рдЬрд╝ ();
рдЕрдЧрд░ ((x != nil && y !=nil) || рдЧрд▓рддреА !=nil)){
рд╡рд╛рдкрд╕реА рдПрдХреНрд╕, рд╡рд╛рдИ, рддреНрд░реБрдЯрд┐
}

рдЬрдм рдЖрдк рдПрдХреНрд╕ рджреЗрдЦрддреЗ рд╣реИрдВ? && рд╡рд╛рдИ? || рдЧрд▓рддреА? рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ "рдХреНрдпрд╛ x рдФрд░ y рдорд╛рдиреНрдп рд╣реИрдВ? рдЧрд▓рддреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?"

рдпрджрд┐ рдирд╣реАрдВ рддреЛ рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдПрдХ рдирдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирдП рд╡рд┐рд╢реЗрд╖ рдмрд┐рд▓реНрдЯрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг 2 рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЬреЛрдбрд╝реЗрдВред

рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИ:

func Func() error {
    func1()
    func2()
    return nil
}

func func1() error {
    ...
}

func func2() error {
    ...
}

рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:

func Func() error {
    err := func1()
    if err != nil {
        return err
    }

    err = func2()
    if err != nil {
        return err
    }

    return nil
}

func func1() error {
    ...
}

func func2() error {
    ...
}

рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрд▓рддреА рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рдпрд╛ _ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

_ = func1()

рдпрд╛

err := func1()

рдПрдХрд╛рдзрд┐рдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдорд╛рди рд╣реИ:

func Func() (*YYY, error) {
    ch, x := func1()
    return yyy, nil
}

func func1() (chan int, *XXX, error) {
    ...
}

рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:

func Func() (*YYY, error) {
    ch, x, err := func1()
    if err != nil {
        return nil, err
    }

    return yyy, nil
}

func func1() (chan int, *XXX, error) {
    ...
}

рдпрджрд┐ Func () рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛: "рдХреГрдкрдпрд╛ Func () рдореЗрдВ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ"
рддрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ Func() рдореЗрдВ рдЧрд▓рддреА рд▓реЙрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдФрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрд▓рддреА рд╕реЗ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ:

func Func() (*YYY, error) {
    ch, x := func1() ? Wrap(err, "xxxxx", ch, "abc", ...)
    return yyy, nil
}

рдпрд╛

func Func() (*YYY, error) {
    ch, x := func1() ? errors.New("another error")
    return yyy, nil
}

рдлрд╛рдпрджрд╛ рд╣реИ,

  1. рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  2. рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рдХрдИ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рднрд╛рд╖рд╛ рдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрддрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдбрд╛рд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ "рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд░рд┐рдкреАрдЯреЗрдЯрд┐рд╡ рд╣реИ"ред

рдХреЛрдб рдХреА рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ (рдЬрд╣рд╛рдВ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ) рдХреЗ рдмрд╛рдж if (err != nil) { return nil } (рдпрд╛ рд╕рдорд╛рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдбреАрдЖрд░рд╡рд╛рдИ (рд╕реНрд╡рдпрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВ) рдкреНрд░рд┐рдВрд╕рд┐рдкрд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

try ... catch рд╕рд╛рде рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдЖрдкрдХреЛ рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ try...catch ред

рдореИрдВ рдирд╣реАрдВ рдорд╛рдирддрд╛ рдХрд┐ рдпреЗ рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рд╣реИрдВ; рд╣рдорд╛рд░реЗ рдкрд╛рд╕ try...catch рдмрд┐рдирд╛ throws рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдЪреАрдЬ рдЬрд┐рд╕реЗ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ try...catch рдмрд╛рд░реЗ рдореЗрдВ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╡рд╣ рд╣реИ try рдХреАрд╡рд░реНрдб рдХреА рдордирдорд╛рдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ред рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рд╕реНрдХреЛрдк рд▓рд┐рдорд┐рдЯрд░ рдХреЗ рдмрд╛рдж catch рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЬрд╣рд╛рдБ рддрдХ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИред (рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдХреЛрдИ рдЗрд╕реЗ рдмреБрд▓рд╛рдПрдЧрд╛)

рдореИрдВ рдпрд╣реА рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ:

  • рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬрд╣рд╛рдВ _ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
  • catch рдмрдЬрд╛рдп рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ, error? рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реНрдг рдкрд╢реНрдЪ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

^ рдЕрдЧрд░ рдореЗрд░реА рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рдпреЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реИрдВ, рдЧрд▓рдд рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред

func example() {
    {
        // The following line will invoke the catch block
        data, ? := foopkg.buyIt()
        // The next two lines handle an error differently
        otherData, err := foopkg.useIt()
        if err != nil {
            // Here we eliminated deeper indentation
            otherData, ? = foopkg.breakIt()
        }
        if data == "" || otherData == "" {
        }
    } catch (err) {
        return errors.Label("fix it", err)
        // Aside: why not add Label() to the error package?
    }
}

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛: рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ catch рдмреНрд▓реЙрдХ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдХреЛрдб рдкрд░ рдЧрд╣рд░реЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рднрд╛рд╡ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ try...catch ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЬреЛрдЦрд┐рдо рдкреНрд░рдмрдВрдзрдиреАрдп рд╣реИ - рд╕рдВрднрд╡рдд: рддреНрд░реБрдЯрд┐-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓рдиреЗ рдХреЗ рдореМрдЬреВрджрд╛ рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рдорд╛рди рдЬрдм рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рдХреЛрдб-рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдбреАрдЖрд░рд╡рд╛рдИ рдХрд╛ рдкрд╛рд▓рди рди рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рди рдЕрдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ (рдпрд╛рдиреА рдХреЛрдИ рдореБрдлреНрдд рджреЛрдкрд╣рд░ рдХрд╛ рднреЛрдЬрди рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐ ? рдмрд┐рдирд╛ рдХрд┐рд╕реА catch рдПрдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдПрдХ рдЖрддрдВрдХ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реА рдЪреАрдЬ рдереА рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛)

2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкрд╛рдЧрд▓ рд╡рд┐рдЪрд╛рд░: рд╢рд╛рдпрдж catch рдмреНрд▓реЙрдХ рд╕рд┐рд░реНрдл рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ ... рдпрд╣ рд╕рдЪрдореБрдЪ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрди рдореЗрдВ catch { ... } рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛ ? рдПрдб (рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ - рдЗрд╕рдХрд╛ рдЕрднреА рднреА рдЕрдкрдирд╛ рджрд╛рдпрд░рд╛ рд╣реЛрдЧрд╛)ред рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЗрд╕рдХрд╛ рдЕрднреНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП catch рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛... рдХреНрдпреЛрдВ рдирд╣реАрдВ?

@mewmew , рдЖрдЗрдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рдЦреЗрдВред рдХреИрд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд░реИрдк рдФрд░ рдЕрдирд░реИрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рдХрд╣реАрдВ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣рдж рддрдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИред

рдареАрдХ рд╣реИ, рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рджреЗрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд┐рдВрджреБ 3 рдХреЗ рдареЛрд╕ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА, рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ ред

@jba рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓рдкреЗрдЯрдиреЗ/

рдореИрдВ рдЖрдкрдХреЗ рдХреЛрдбрдмреЗрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдИрдУрдПрдл рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА? рдпрджреНрдпрдкрд┐ рдЗрд╕реЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, EOF рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдорд╛рди рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ io.Reader рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рд╣реИред рдЕрдЧрд░ рдпрд╣ io.EOF рдирд╣реАрдВ рд╣реЛрддрд╛ рддреЛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдлрд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реЛрддрд╛?

@DeedleFake рдореИрдВ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╖рдп рдкрд░ рдмрдиреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдореБрджреНрджреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓рдкреЗрдЯрдиреЗ/рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ (рдореЗрд░реЗ рд╕рд╣рд┐рдд) рдХреЛ рдкрдврд╝рддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рд╣реА рдХрдо рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдореИрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдкреНрд░рд╡рд░реНрддрди рдЧрд▓рддреА рд╕реЗ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдЕрдирджреЗрдЦрд╛ рди рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд▓рд╛рдЧреВ рдХрд░реЗрдВ
_ := returnsError()

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓рд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рдердо рд╕реНрддрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХреБрдЫ рдмрдЧ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рд╣реЛрдиреЗ рдЬреИрд╕рд╛ рд╣реИ - рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред рдЬрдм рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдореЗрдВ рднреА рдорджрдж рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рднреА рдЬрдЧрд╣реЛрдВ рдкрд░ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рдпрд╣рд╛рдБ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ "рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдорд╛рддреНрд░рд╛" рдпрд╛ "рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛" рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдореИрдВ рдХрд┐рд╕реА рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдЬреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ gofmt рдореБрджреНрджрд╛ рд╣реИред рдмрд╕ рдЗрдирд▓рд╛рдЗрди "рд╕рд┐рдВрдЧрд▓ рд▓рд╛рдЗрди рд╕реНрдХреЛрдк" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдФрд░ рд╣рдо рдЕрдЪреНрдЫреЗ рд╣реИрдВред

рдХреБрдЫ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реБрдЭрд╛рд╡ рдирд┐рд╣рд┐рдд рд╣реИ nil рдмреВрд▓рд┐рдпрди рдХреЗ рд╕рд╛рде рдХреА рддрд░рд╣ рдЬрд╛рдБрдЪ:

err := returnsError()
if err { return err }

рдпрд╛ рдФрд░ рднреА

if err := returnsError(); err { return err }

рдпрд╣ рд╕рднреА рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдореЗрд░реА рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬреЛ рдХреБрдЫ рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ + рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрдо рдкрдардиреАрдп рдХреЛрдб рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред

рдХрдо рдкрдардиреАрдп рдХреЛрдб рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред

рд╡рд░реНрдмреЛрдЬрд╝ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдо рдкрдардиреАрдп рдХреЛрдб рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕реНрдХреИрдирд░ рдПрдкреАрдЖрдИ рдЯреНрд░рд┐рдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ, рдЬреЛ рдЙрд╕ рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рд╡рд╛рд▓реА рд╣реЛрддреА рд╣реИ, рдЗрд╕реЗ рдФрд░ рднреА рдмрджрддрд░ рдмрдирд╛ рджреЗрддреА рд╣реИред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рдХрд┐ рдЕрдВрдд рдореЗрдВ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреНрдпрд╛ рд╣реИред рдирд╣реАрдВ рддреЛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдмреБрджрдмреБрджрд╛рдиреЗ рдФрд░ рдмрд╛рдХреА рд╕рдм рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп-рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреИрдЯрд░реНрди рдПрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдмреБрджрдмреБрджрд╛рддреЗ рд╣реБрдП рдФрд░ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп-рдорд╛рди рд▓реМрдЯрд╛рдиреЗ рдХрд╛ рдкреИрдЯрд░реНрди

19642 рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред


рд╕рд╛рде рд╣реА, рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП @mewmew рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдореЗрдВ рдЦрддрд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдореБрдЭреЗ рдЗрдирдореЗрдВ рд╕реЗ рдФрд░ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рд░ рдмрдирд╛рдпрд╛ (рдФрд░ рдХрдИ рдХрдорд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛)

https://gist.github.com/KernelDeimos/384aabd36e1789efe8cbce3c17ffa390

рдЗрд╕ рд╕рд╛рд░ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЙрди рдкрд░ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ

рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЕрд▓рдЧ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЧреЛ рдиреЗ collect рдХрдерди рдХреА рддрд░рд╣ рдХреБрдЫ рдкреЗрд╢ рдХрд┐рдпрд╛?

рдПрдХ collect рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдлреЙрд░реНрдо рдХрд╛ рд╣реЛрдЧрд╛ collect [IDENT] [BLOCK STMT] , рдЬрд╣рд╛рдВ ident рдореБрдЭреЗ nil -рдПрдмрд▓ рдЯрд╛рдЗрдк рдХрд╛ рдЗрди-рд╕реНрдХреЛрдк рд╡реИрд░рд┐рдПрдмрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред collect рдХрдерди рдХреЗ рднреАрддрд░, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░ _! рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬрд┐рд╕реЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред _! рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, _ ред рдЬрдм рднреА _! рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд nil рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ _! рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрди рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╢реЗрд╖ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИред

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

func TryComplexOperation() (*Result, error) {
    var result *Result
    var err error

    collect err {
        intermediate1, _! := Step1()
        intermediate2, _! := Step2(intermediate1, "something")
        // assign to result from the outer scope
        result, _! = Step3(intermediate2, 12)
    }
    return result, err
}

рдЬреЛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

func TryComplexOperation() (*Result, error) {
    var result *Result
    var err error

    {
        var intermediate1 SomeType
        intermediate1, err = Step1()
        if err != nil { goto collectEnd }

        var intermediate2 SomeOtherType
        intermediate2, err = Step2(intermediate1, "something")
        if err != nil { goto collectEnd }

        result, err = Step3(intermediate2, 12)
        // if err != nil { goto collectEnd }, but since we're at the end already we can omit this
    }

collectEnd:
    return result, err
}

рдХреБрдЫ рдЕрдЪреНрдЫреА рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реБрд╡рд┐рдзрд╛ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧреА:

// try several approaches for acquiring a value
func GetSomething() (s *Something) {
    collect s {
        _! = fetchOrNil1()
        _! = fetchOrNil2()
        _! = new(Something)
    }
    return s
}

рдирдИ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдХреАрд╡рд░реНрдб collect
  2. рд╡рд┐рд╢реЗрд╖ рдкрд╣рдЪрд╛рди _! (рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдЦреЗрд▓рд╛ рд╣реИ, рдЗрд╕ рдореИрдЪ рдХреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдкрд╣рдЪрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ)

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ "рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдмрд╣реБрдд рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╣реИ" рддрд░реНрдХ рдХреЛ рдЙрдмрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ "рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдмрд╣реБрдд рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИ"ред рдЧреЛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣реИрдВ рдЬреЛ рдпрдерд╛рд╡рдд рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдЖрдк _ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдХреЗрд╡рд▓ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдЖрдк if err != nil { return err } рд╕рд╛рде рдмрд┐рдирд╛ рд╕рдВрд╢реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ if err != nil { return wrap(err) } рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВред рдЙрди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА, рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ, рдмрд╣реБрдд рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рджреЛрд╣рд░рд╛рд╡ ( рдЬрд╛рд╣рд┐рд░ рд╣реИ ) рдкреВрд░реЗ рдХреЛрдб рдореЗрдВ рдЗрди рдпрд╛ рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрдердиреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рд╕реЗ рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рддрдХ рдмрдпрд╛рдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреЗрд╢ рдХрд░рдирд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░реЗрдВред

  • 1 рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди) рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛; 3) рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рд▓рдкреЗрдЯрдирд╛ред

рдЬрд╛рдВрдЪреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рд░рд╣рддрд╛ рд╣реИ (рдЬреНрдпрд╛рджрд╛рддрд░)

  • рдЬрдмрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╣рд╛рд╡реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдЕрдм рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдорд╛рдВрд╕ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдкрдардиреАрдп рддрд░реАрдХреЗ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

  • рдореМрдЬреВрджрд╛ рдЧреЛ 1 рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдкреВрд░реА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдЧреЛ 1 рдХреЛ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдпрд╛рдВрддреНрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдпрд╣ рдПрдХ рдЬреЛрдбрд╝ рд╣реИ рдФрд░ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ

  • рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╛рдВрдЪреЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЪреВрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдкрд╣рд▓реЗ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдХреЛ "рдПрдХрддреНрд░рд┐рдд" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╣рдореЗрдВ рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрдирд╛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИ

  • рдХреЛрдИ рднреА рдирдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯрд╛ рдФрд░/рдпрд╛ рдХрдо рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реБрдЭрд╛рдИ рдЧрдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдЕрдзрд┐рдХ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░рд┐рдЯрд░реНрди рдореЗрдВ рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ

  • рднрд╛рд╖рд╛ рдЖрдЬ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдФрд░ рд╣рд░ рдмрджрд▓рд╛рд╡ рдХреА рдХреАрдордд рдЪреБрдХрд╛рдиреА рдкрдбрд╝рддреА рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдзреЛрдирд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╣рдордд, рдФрд░ рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЬрд┐рд╕рдХрд╛ рджрд╛рдпрд░рд╛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдкрд░реЗ рд╣реИ, рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ nil рдЪреЗрдХ рдЗрди рдЧреЛ рджреЛрд╣рд░рд╛рд╡ рдФрд░ рд╡рд░реНрдмреЛрдЬрд╝ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ error рдПрдХ nil -рд╕рдХреНрд╖рдо рдкреНрд░рдХрд╛рд░ рд╣реИред

@KernelDeimos рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЖрдП рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдХрджрдо рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдФрд░ рд╕рдордЭрд╛рдпрд╛ рдХрд┐ рдХреНрдпреЛрдВ x, ? := doSomething() рддрд░реАрдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдл рд╣реИ рдХрд┐ рдореИрдВ рдЕрдХреЗрд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ рдЬреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИ? рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ред

https://github.com/golang/go/issues/25582

рдХреНрдпрд╛ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл рдЬрд╛рд▓ рдирд╣реАрдВ рд╣реИ ?

рдпрд╣рд╛рдБ рдПрдХ рд╕реНрдкрд┐рдЯрдмреЙрд▓ рд╣реИ:

func NewClient(...) (*Client, error) {
    trap(err error) {
        return nil, err
    }

    listener, err? := net.Listen("tcp4", listenAddr)
    trap(_ error) {
        listener.Close()
    }

    conn, err? := ConnectionManager{}.connect(server, tlsConfig)
    trap(_ error) {
        conn.Close()
    }

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    toServer.Send(&client.serverConfig)?

    toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})?

    session, err? := communicationProtocol.FinalProtocol(conn)
    client.session = session

    return client, nil
}

59 рдкрдВрдХреНрддрд┐рдпрд╛рдБ тЖТ 44

trap рдЕрд░реНрде рд╣реИ "рдЗрд╕ рдХреЛрдб рдХреЛ рд╕реНрдЯреИрдХ рдХреНрд░рдо рдореЗрдВ рдЪрд▓рд╛рдПрдВ рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ ? рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдЪрд░ рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реИред" рдпрд╣ defer рдЬреИрд╕рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ trap рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдереА? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, trap err error {} рд╡рд╛рдгреА рдПрдХ trap рдмреБрд▓рд╛рдпрд╛ err рдкреНрд░рдХрд╛рд░ рдХреЗ error , рдЬреЛ рдЬрдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реИред рдХреЛрдб рдХреЛ рд╡рд╛рдкрд╕ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ; рдЗрд╕реЗ рдмрд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдпрд╣ nil рд╡рд┐рд╢реЗрд╖ рд╣реЛрдиреЗ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рднреА рддреЛрдбрд╝рддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдХрд┐ рдореИрдВ рдлреЛрди рдкрд░ рдирд╣реАрдВ рд╣реВрдВред

func Example(r io.Reader) error {
  trap err error {
    if err != nil {
      return err
    }
  }

  n, err? := io.Copy(ioutil.Discard, r)
  fmt.Printf("Read %v bytes.\n", n)
}

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, trap рдПрдХ var рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рднреА рдЗрд╕реЗ ? рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреЛрдб рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред ? рдСрдкрд░реЗрдЯрд░ рднреА рдЬрдм рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЫрд╛рдпрд╛ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ := ред рдПрдХ trap рдХреЛ рдЙрд╕реА рджрд╛рдпрд░реЗ рдореЗрдВ рдкреБрдирд░реНрдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдПрдХ var рд╡рд┐рдкрд░реАрдд, рд▓реЗрдХрд┐рди рдпрд╣ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рдпрд╣ рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рдмреНрд▓реЙрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдкрде рд░рдЦрдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ err == io.EOF ред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬреЛ рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ errWriter рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд▓рдЧрддрд╛ рд╣реИ Errors are Values , рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдЯрдЕрдк рдореЗрдВ рдЬрд┐рд╕реЗ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

@carlmjohnson рдЖрдк
рднрд▓реЗ рд╣реА, рдпрд╣ trap рдЕрд╡рдзрд╛рд░рдгрд╛ defer рдХрдерди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдирд╣реАрдВ? рдХреЛрдб, рдЬреИрд╕рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡рд╣реА рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк panic 'd рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдкрд░ рдФрд░ рдлрд┐рд░ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рд╕рдлрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдмрдВрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдиреНрд╣реАрдВ рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ _! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрддрдВрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд┐рдзрд┐ рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рд░рдЦрддрд╛ рд╣реИред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрд╛ рдХрд┐ рдХреЛрдб, рдЬреИрд╕рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдореВрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдерд╛ред рдХреНрдпрд╛ рдпрд╣ trap рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЖрдЬ рдЬрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдирдХрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдиреЗ рд╕реЗ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реЛ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрдХрдбрд╝рдиреЗ рдФрд░ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП if err != nil { panic (err) } рдФрд░ defer рд╣реЛрдЧрд╛ред

рдпрд╣ рдКрдкрд░ рд╕реБрдЭрд╛рдП рдЧрдП collect рдмреНрд▓реЙрдХ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рдорд╛рди рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓реАрдирд░ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ ("рдпрджрд┐ рдпрд╣ рдорд╛рди рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЗрд╕рдХреЗ рд╕рд╛рде")ред рдЧреЛ рдХреЛ рд░реИрдЦрд┐рдХ рдФрд░ рд╕реНрдкрд╖реНрдЯрд╡рд╛рджреА рд╣реЛрдирд╛ рдкрд╕рдВрдж рд╣реИред trap panic / defer рд▓рд┐рдП рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХрдо рд╕реНрдкрд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рдеред

@mccoljr , рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ recover рд╕рд╛рде рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ - рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ред

рдореИрдВ рдпрд╣ рднреА рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ "рдЯреНрд░реИрдк" рдкреБрдирд░реНрд▓реЗрдЦрди рдиреЗ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ (_very_ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рд╛рдордиреЗ рдЖрдИрдВ), рдФрд░ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреНрд░реИрдк рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдХреИрд╕реЗ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реА рдХрдореА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддреА рд╣реИ рдФрд░, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐, рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реАрдзреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

рдкреНрд░рд╡рд╛рд╣ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕рдВрд╢реЛрдзрд┐рдд trap рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдордд рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдпрд╛ рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ рдпрд╛ рдирд╣реАрдВред рдпрд╣ collect , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдХреЛрдкрд┐рдВрдЧ рдирд┐рдпрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдереЛрдбрд╝рд╛ рд╕реНрдкреЗрдЧреЗрдЯреА-рдИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрддреБрд▓рди рдЦреЛрдЬрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

@thejerf рдЖрд╣, рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрддреНрддрд░ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ erroring() рдФрд░ recover() рдмреАрдЪ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реЛрдЧрд╛, рдЗрд╕ рддрдереНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд┐ recover panic рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдмрд░рд╛рд╣рдЯ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред рдбрд┐рдлрд░рд┐рдВрдЧ рднреА рдХреБрдЫ рд╣рдж рддрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@DeedleFake рд╡рд╣реА trap , рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ trap рдпрд╛ рддреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдЬреЛ рдХреЛрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреА рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рд╕реЗрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдЪрд╛рд░, рдпрд╛ рдЗрд╕реЗ goto рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ... рдЬреЛ, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ trap рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╣реИ defer ред рд╕рд╛рде рд╣реА, рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрдИ рдЬрд╛рд▓ рдмреНрд▓реЙрдХ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХрд┐рд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЧреЛ рдХреЛ рд░рд╛рдп рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ collect рдпрд╛ рдПрдХ рд╕рдорд╛рди рд░реИрдЦрд┐рдХ рдирд┐рд░реНрдорд╛рдг trap рддреБрд▓рдирд╛ рдореЗрдВ рдЧреЛ рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЧрдардмрдВрдзрди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try-catch рдкреЛрд╢рд╛рдХ рдореЗрдВ рдирд┐рд░реНрдорд╛рдгред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯреНрд░реИрдк рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ

рдпрджрд┐ trap рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рдЕрдиреНрдпрдерд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ( goto , continue , break , рдЖрджрд┐), рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛрдб рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ рдмреНрд▓реЙрдХ рд╕реЗ 'рдХреЙрд▓' рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдмреНрд▓реЙрдХ рд╕реНрд╡рдпрдВ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрд┐ рдкреНрд░рд╡рд╛рд╣ рддрдВрддреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдкрд╣реБрдВрдЪ рд╣реИред рддрдВрддреНрд░ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдмреНрд▓реЙрдХ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП

for {
  trap err error {
    break
  }

  err? = errors.New("Example")
}

рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рд╕рд╛рде рд╣реА, рдЕрдЧрд░ рдореИрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрдИ рдЬрд╛рд▓ рдмреНрд▓реЙрдХ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХрд┐рд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

рд╣рд╛рдБ, рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдирд╛рдо рдЯреНрд░реИрдк рджреНрд╡рд╛рд░рд╛ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдВ

trap err error {
  // Block 1.
}

trap n int {
  // Block 2.
}

n? = 3

рдмреНрд▓реЙрдХ 2 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрдбрд╝рд╛ рд╕рд╡рд╛рд▓ рд╢рд╛рдпрдж рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ n?, err? = 3, errors.New("Example") рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╢рд╛рдпрдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ #25609 рдореЗрдВ рдЖрдпрд╛ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рдПрдХ рд╕рдорд╛рди рд░реИрдЦрд┐рдХ рдирд┐рд░реНрдорд╛рдг рдЬрд╛рд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧреЛ рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЧрдардмрдВрдзрди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкреЛрд╢рд╛рдХ рдореЗрдВ рдПрдХ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ collect рдФрд░ trap рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ try-catch рд░рд┐рд╡рд░реНрд╕ рдореЗрдВ рд╣реИрдВред рдПрдХ рдорд╛рдирдХ try-catch рдПрдХ рд╡рд┐рдлрд▓-рджрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдиреАрддрд┐ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рдпрд╣ рд╡рд┐рд╕реНрдлреЛрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рдлрд▓-рджрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдПрдХ рдмрд╛рдд рдЬреЛ рдкреВрд░реА рдмрд╛рдд рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рдЬреИрд╕реЗ io.EOF , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реАрд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕реЗ collect рдпрд╛ trap , рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред

"рдЖрд╣, рдпрд╣ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрддреНрддрд░ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ () рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ () рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдЗрд╕ рддрдереНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХрд╛ рдЬрд╡рд╛рдм рд╣реИ рдШрдмрд░рд╛рд╣рдЯред"

рдмрд╣реБрдд рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдмрд╛рдд рд╣реИред рдореИрдВ рдЙрдирд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реБрдП рдмрдирд╛рдИ рдЧрдИ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдХ рдлреАрдЪрд░ рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдмрдЧ рдирд╣реАрдВред

рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ "рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЗрд╕ рдЖрд╡рд░реНрддреА рдЦрдВрдб рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо return err рдФрд░ рдЗрд╕реЗ ? " рд╕реЗ "рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ" рдмрд╛рдХреА рднрд╛рд╖рд╛? рдпрд╣ рдХреМрди рд╕реЗ рдирдП рдкреИрдЯрд░реНрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рдХреМрди рд╕реА рдирдИ 'рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ' рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ? рдХреМрди рд╕реА рдкреБрд░рд╛рдиреА 'рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдВ' рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд░рд╣ рдЬрд╛рддреА рд╣реИрдВ?" рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╣ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ рдХреЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдПрдХ рд╢рдХреНрддрд┐-рдЕрдзрд┐рдХрддрдо рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЗрд╕реЗ error рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрднреА рднреА рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡, рдЬрд┐рд╕рдХрд╛ рдореЗрд░рд╛ рдорддрд▓рдм "рд╢рдХреНрддрд┐рд╢рд╛рд▓реА" рдХреЗ рдЕрдЪреНрдЫреЗ рдФрд░ рдмреБрд░реЗ рджреЛрдиреЛрдВ рдЕрд░реНрдереЛрдВ рдореЗрдВ рд╣реИ), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирдП рдирд┐рд░реНрдорд╛рдг рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рд╕рд╛рдд рд▓рд╛рдЗрди рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб" рд╢реНрд░реЗрдгреА рдХреА ~ 50-100 рдкрдВрдХреНрддрд┐рдпреЛрдВ рддрдХ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред 5 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЧреЛ 1.0 рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд╢рд╛рдпрдж рдЗрд╕ рдХрд╛рд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрднрд╡реЛрдВ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдмрд╛рддрдЪреАрдд рд╣рд▓рдХреЛрдВ рдореЗрдВ рдШреВрдорддреА рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдЦреБрдж рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред (рдЕрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдбрд┐рдВрдЧ рдЕрдиреБрднрд╡реЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВ, 5-рд▓рд╛рдЗрди рдХреЗ рдирдореВрдиреЛрдВ рдкрд░ рдирд╣реАрдВ!)

"рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдмрд░рд╛рд╣рдЯ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред"

рдпрд╣ рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЖрдк pop рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╡рд╣ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдм рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЬреЛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╛рдХреНрдп рдореЗрдВ рдХреИрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╢рд╛рдпрдж рдПрдХ рдкреВрд░реНрдг рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд▓реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдХреЛрдИ рдЕрдиреНрддрд░реНрдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдЯреИрдХ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╛рдкрд╕реА рдХреА рддрд░рд╣; рдпрд╣ рдЙрддрдирд╛ рд╣реА рджрд╣рд╢рдд рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рд╡рд╛рдкрд╕реА рд╣реИ, рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд░ рдЖрдк pop рдХреЛ ? рдпрд╛ рдЬреЛ рдХреБрдЫ рднреАред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╢рдмреНрдж рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЧреЛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдкреНрд░рддреАрдХ-рд╕рдореГрджреНрдз рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЗрдирдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдПрдХ рдкреНрд░рддреАрдХ рдХрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдФрд░ рд╣рдо рдЙрди рдкрд░ рдХреНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирдП рд╢рдмреНрджрд╛рд░реНрде рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдиреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирдП рдФрд░ рдЕрдиреБрднрд╡реА рдореЛрд░реЗрд╕реЛ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

"рд╕реНрдердЧрд┐рдд рдХрд░рдирд╛ рдХреБрдЫ рд╣рдж рддрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рднреА рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред"

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рдЗрддрдирд╛ рдорд╣рдВрдЧрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдХрд╣рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЧрд░реНрдо рдХрд╛рд░реНрдп рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦреЗрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ 100% рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ 80% рдХреЛ рдЕрдзрд┐рдХ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ 20% рдорд╛рдорд▓реЛрдВ (рд╢рд╛рдпрдж рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ 98/2 рдХреА рддрд░рд╣, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ) рдХреЛ рд╡реИрд╕реЗ рд╣реА рд░рд╣рдиреЗ рджреЗрдВред рд╣реИрдВред рдЧреЛ рдХреЛрдб рдХрд╛ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдЦрд┐рд░ рдХреНрдпреЛрдВ defer рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдореМрдЬреВрдж рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдбрд┐рдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ trap рдЬреИрд╕реЗ рдХреБрдЫ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдШреЛрд╖рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рдХрд╣реАрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ defer рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдпрд╛рди рд╣реИ рдЬреЛ рдПрдХ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ рдЖрд╕реНрдердЧрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдвреЗрд░ рдкрд░ рд╣реИрдВрдбрд▓рд░ред рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ defer рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдирд╛ рддрд╛рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗ ... рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЙрди рдЬрд╛рд▓реЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЬреЛ рд▓реВрдк рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдЯрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ defer рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред

рдмрд╕ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдХреАрд╡рд░реНрдб рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реИред

package main

import (
    "fmt"
)

func return(i int)int{
    return i
}

func main() {
    return(1)
}

рдХрд╛ рдкрд░рд┐рдгрд╛рдо

prog.go:7:6: syntax error: unexpected select, expecting name or (

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо try , trap , assert , рдХрд┐рд╕реА рднреА рдХреАрд╡рд░реНрдб рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдЯрди рдХреЛрдб рдХреЛ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВред рдХреЛрдб рдЬрд┐рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ ? рдЧреЛ рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ? рд░реВрдк рдореЗрдВ рдЕрднреА рдХреЗ рдЪрд░рд┐рддреНрд░ рдХреЛ рдЪрд░ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╡реИрдз рдЪрд░рд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХрдИ рд░рд┐рдЯрд░реНрди рддрд░реНрдХреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

func getCoord() x int, y int, z int, err error{
    x, err = getX()
    if err != nil{
        return 
    }

    y, err = getY()
    if err != nil{
        return 
    }

    z, err = getZ()
        if err != nil{
        return 
    }
    return
}

рдЕрдЧрд░ рд╣рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ? рдпрд╛ рдпрджрд┐ рддреНрд░реБрдЯрд┐ != nil рдмреНрд▓реЙрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ lhs рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдиреНрдп рд╕рднреА рдорд╛рди рдЕрдм рдЯреНрд░реИрд╢ рд╣реИрдВ? рдХреНрдпрд╛ рд╣реБрдЖ рдЕрдЧрд░ рд╣рдордиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛

func GetCoord() (x, y, z int, err error) {
    err = try GetX(&x) // or err? = GetX(&x) 
    err = try GetY(&y) // or err? = GetY(&x) 
    err = try GetZ(&z) // or err? = GetZ(&x) 
}

рд╣рдо рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдзрд╛рд░рдгрд╛рдПрдБ рдмрдирд╛рддреЗ рд╣реИрдВ? рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореВрд▓реНрдп рдХреЛ рдлреЗрдВрдХрдирд╛ рдареАрдХ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдЕрдзрд┐рдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдорд╛рди x рдареАрдХ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЧрд▓рддреА рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рдлрд╝рдВрдХреНрд╢рди GetZ() рдФрд░ x, y рдорд╛рдиреЛрдВ рдХреЛ рдХреЙрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдЖрд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡рд╛рдкрд╕реА рддрд░реНрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдпрд╛ рдЪреИрдирд▓ рдЬреИрд╕реЗ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЙрд▓рд░ рдХреЛ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ?

рдЯреАрдПрд▓рдбреАрдЖрд░; рдЬреЛрдбрд╝рдирд╛? рдпрд╛ try рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП

if err != nil{
    return err
}

рднрддреНрддреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднреНрд░рдо рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред

рдФрд░ trap рд╕реБрдЭрд╛рд╡ рдЬреИрд╕рд╛ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЯреВрдЯрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рдорд┐рд▓рддрд╛ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рд░рдЦрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдкрд░ func ?() bool рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреА рддрд╛рдХрд┐ рдЬрдм рдЖрдк рдХреЙрд▓ рдХрд░реЗрдВ рддреЛ

x, err := doSomething; return x, err?    

рдЖрдк рдЙрд╕ рдЯреНрд░реИрдк рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдХреЗрд╡рд▓ рдмрдпрд╛рдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреИрд╕реЗ рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдмрдпрд╛рдиреЛрдВ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдореИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐рд╕реА рдХреЛ рдЙрди рдорд╛рдорд▓реЛрдВ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХреАрд╡рд░реНрдб рд╣реИрдВ + ?

switch {
    case select?:
    //side effect/trap code specific to select
    case return?:
    //side effect/trap code specific to returns
    case for?: 
    //side effect/trap code specific to for? 

    //etc...
}  

рдЕрдЧрд░ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ? рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдпрд╛ рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди рдкреНрд░рдХрд╛рд░, рдлрд┐рд░ рдЬрд╛рдБрдЪ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдЧрд░ var == nil || рд╢реВрдиреНрдп рдорд╛рди {рдХрдерди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ} рдЕрдиреБрдорд╛рдирд┐рдд рдЗрд░рд╛рджрд╛ рд╣реИред

Idk, рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реИ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, os.Chdir рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИ

func Chdir(dir string) error {
  if e := syscall.Chdir(dir); e != nil {
      return &PathError{"chdir", dir, e}
  }
  return nil
}

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд, рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func Chdir(dir string) error {
  syscall.Chdir(dir) || &PathError{"chdir", dir, err}
  return nil
}

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рддреАрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ рдпрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдбрд╛рд░реНрдЯ рдЗрд╕реЗ "рд╡рд╕рд╛ рддреАрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕" рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ

рдЬреИрд╕реЗ

func Chdir(dir string) error {
    syscall.Chdir(dir) => &PathError{"chdir", dir, err}
    return nil
}

рдбрд╛рд░реНрдЯ рдЯреВрд░ рд╕реЗ ред

рдХреЗрд╡рд▓ рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
=> рдПрдХреНрд╕рдкреНрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ {рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕рдкреНрд░; рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╢реБрд▓рд┐рдкрд┐ рд╣реИ; }. => рд╕рдВрдХреЗрддрди рдХреЛ рдХрднреА-рдХрднреА рд╡рд╕рд╛ рддреАрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@mortdeus , рдбрд╛рд░реНрдЯ рддреАрд░ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ, рдЬрдмрдХрд┐ syscall.Chdir(dir) рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рд╡реЗ рдХрдореЛрдмреЗрд╢ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд▓рдЧрддреЗ рд╣реИрдВред

@mortdeus рдореИрдВ рдкрд╣рд▓реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ рд╡рд╣ рд╢рд╛рдпрдж рд╣реА рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди рд╣реИред рдореБрдЭреЗ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ ? рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдиреЗ try...catch рд╕рд╛рде рдХреБрдЫ рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдХреЛрдб рдмреНрд▓реЙрдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ред рдореИрдВ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рдерд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдмрд╛рдд рдирд╣реАрдВ рдХреА рдЧрдИ рдереА рддрд╛рдХрд┐ рдореИрдВ рдПрдХ рдирдП рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗ рд╕рдХреВрдВред

рдПрдХ рдирдП рд╕рд╢рд░реНрдд return (рдпрд╛ returnIf ) рдХрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

return(bool expression) ...

рдЕрд░реНрдерд╛рддред

err := syscall.Chdir(dir)
return(err != nil) &PathError{"chdir", dir, e}

a, b, err := Foo()    // signature: func Foo() (string, string, error)
return(err != nil) "", "", err

рдпрд╛ рдмрд╕ fmt рдХреЛ рдПрдХ рд▓рд╛рдЗрдирд░ рд░рд┐рдЯрд░реНрди-рдУрдирд▓реА рдлрдВрдХреНрд╢рди рдХреЛ рддреАрди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд▓рд╛рдЗрди рдкрд░ рдлреЙрд░реНрдореЗрдЯ рдХрд░рдиреЗ рджреЗрдВ:

err := syscall.Chdir(dir)
if err != nil { return &PathError{"chdir", dir, e} }

a, b, err := Foo()    // signature: func Foo() (string, string, error)
if err != nil { return "", "", err }

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреБрдЫ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рд╕рд╣реА-рд╕рдмрд╕реЗ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ:

func NewClient(...) (c *Client, err error) {
    defer annotateError(&err, "client couldn't be created")

    listener := net.Listen("tcp4", listenAddr)?
    defer closeOnErr(&err, listener)
    conn := ConnectionManager{}.connect(server, tlsConfig)?
    defer closeOnErr(&err, conn)

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
         forwardOut = forwarding.NewOut(pop url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort)))
    }

    client := &Client{listener: listener, conn: conn, forward: forwardOut}

    toServer := communicationProtocol.Wrap(conn)
    toServer.Send(&client.serverConfig)?
    toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})?
    session := communicationProtocol.FinalProtocol(conn)?
    client.session = session

    return client, nil
}

func closeOnErr(err *error, c io.Closer) {
    if *err != nil {
        closeErr := c.Close()
        if err != nil {
            *err = multierror.Append(*err, closeErr)
        }
    }
}

func annotateError(err *error, annotation string) {
    if *err != nil {
        log.Printf("%s: %v", annotation, *err)
        *err = errwrap.Wrapf(annotation +": {{err}}", err)
    }
}

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧреЛ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рд╕рдордЭ рдирд╛рдорд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдирд╛рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдмреЗрд╢рдХ рдЕрдЧрд░ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдордЬрдмреВрдд рд╣реИ, рддреЛ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореБрдЭреЗ рд╡рд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВ (рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдХрд╛рд░рдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рд▓рд╛рдЗрди рдЧрд┐рдирддреА рдореЗрдВ рдХрдореА рднреА) рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде, рдореВрд▓ рд╕рд╣рд┐рдд . рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЧреЛ рд╕рдореБрджрд╛рдп рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди-рдмрд╛рдп-рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рджрд┐рд╢рд╛ рдореЗрдВ рдХреЛрдИ рдкреНрд░рддрд┐рдмрд╛рдзрд╛ рдмреЗрдореЗрд▓ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╡рд░реАрдпрддрд╛ рд╡реНрдпрдХреНрдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ OtherFunc(GetInt()?, "...") (рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд╣реИ) рдХреЗ рд╕рд╛рде рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ func GetInt() (x int, err error) рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрдирд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ред рдЬрдмрдХрд┐ рдирд┐рд░рдВрддрд░ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЦрдВрдб рдХреЗ рд▓рд┐рдП рдХрдо рдкрд░реЗрд╢рд╛рдиреА, рдореЗрд░реЗ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдЬреЛ рдХрд┐ рдПрд░реАрдЯреА 2 рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдирдкреИрдХ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрднреА рднреА рдХрд╖реНрдЯрдкреНрд░рдж рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдкрд░рд┐рдгрд╛рдореА рдХреЛрдбред

@thejerf , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдЖрдк net.Listen рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдЖрдк err рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╣реБрдП рд╕реНрдердЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ defer рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ annotateError рдХрднреА рднреА рд▓рд╛рдЧреВ рди рд╣реЛ? рдпрд╛ рд╡реЗ рдвреЗрд░ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ, рддреЛ рдХрд╣реЗрдВ, toServer.Send , рддреЛ closeOnErr рдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ annotateError рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ closeOnErr рдХреЗрд╡рд▓ рддрднреА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкрд┐рдЫрд▓реА рдХреЙрд▓ рдореЗрдВ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдВ? рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

conn := ConnectionManager{}.connect(server, tlsConfig)?
fmt.Printf("Attempted to connect to server %#v", server)
defer closeOnErr(&err, conn)

рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛, рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рднреА рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдореИрдВ рд╕рд┐рд░реНрдл рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛

client.session = communicationProtocol.FinalProtocol(conn)?

рд╕рдВрднрд╡рддрдГ, рдХреНрдпреЛрдВрдХрд┐ FinalProtocol рдПрдХ рдЧрд▓рддреА рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╛рдардХ рд╕реЗ рдЫрд┐рдкрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдЙрд╕рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛?

_рдкрд░рд┐рд╢рд┐рд╖реНрдЯ_

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдЙрдмрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ, рдЖрдк рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реИ:

env, err := environment.GetRuntimeEnvironment()

рдпрд╣ рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧрд▓рддреА рдЫрд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЕрдЧрд░ рдореИрдВ рдмрджрд▓ рдЧрдпрд╛ ...

forwardPort, err = env.PortToForward()
if err != nil {
    log.Printf("env couldn't provide forward port: %v", err)
}

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕

forwardPort = env.PortToForward()

рддрдм рдЖрдкрдХреА рдЖрд╕реНрдердЧрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк err рдЗрди-рд╕реНрдХреЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рди рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдВ?

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реИред рдореИрдВ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:

func (r Reader) Read(b []byte) (n int) fails {
    if somethingFailed {
        fail errors.New("something failed")
    }

    return 0
}

рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ ( fail рдХреЗ рдмрдЬрд╛рдп рдХреАрд╡рд░реНрдб return , рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рдкрд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рджреЗрддрд╛ рд╣реИред

func (c EmailClient) SendEmail(to, content string) fails {
    if !c.connected() {
        fail errors.New("could not connect")
    }

    // You can handle it and execution will continue if you don't fail or return
    n := r.Read(b) handle (err) {
        fmt.Printf("failed to read: %s", err)
    }

    // This shouldn't compile and should complain about an unhandled error
    n := r.Read(b)
}

рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди (рдХрдо рд╕реЗ рдХрдо рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ) рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рддрдВрддреНрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реЛрдЧрд╛ред

рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:

  • fails рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ err (рдпрд╛ errs ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдореМрдЬреВрджрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдЦрд░рд╛рдм рд╡рд┐рдХрд▓реНрдк рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ ( err рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рдЪрд░ рдирд╛рдо рд╣реИ, рдФрд░ errs рдХреЛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдпрд╛ рд╕рд░рдгреА рдпрд╛ рддреНрд░реБрдЯрд┐ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
  • handle рдереЛрдбрд╝рд╛ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ recover рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ panic s рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ...

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкрд░рд┐рд╡рд░реНрддрд┐рдд r. io.Reader.Read() рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рдг рдкрдврд╝реЗрдВред

рдЙрд╕ рд╕реБрдЭрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЯреВрд▓ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓реМрдЯрд╛ рд╣реБрдЖ error рдорд╛рди рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд╛рди рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ github.com/pkg/errors )ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИред

@ibrasho , рдЖрдк рдХреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ ...

func (c EmailClient) SendEmail(to, content string) error {
    // ...

    // You can handle it and execution will continue if you don't fail or return
    _, _, err := r.Read()
        if err != nil {
        fmt.Printf("failed to read: %s", err)
    }

    // This shouldn't compile and should complain about an unhandled error
    _, _, err := r.Read()
}

... рдЕрдЧрд░ рд╣рдо error рдХреЗ рдЕрдирдЪрд╛рд╣реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рдпрд╛ рд▓рд┐рдВрдЯ рджреЗрддреЗ рд╣реИрдВ? рдХреЛрдИ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рджреЛ рдЪреАрдЬрд╝реЗрдВ:

  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИред рдореИрдВ
  • рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧреЛ рдореЗрдВ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИ рдЬреЛ рдЯреВрд▓ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╣рдореЗрд╢рд╛ error рдорд╛рди рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд┐рдлрд▓ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдзрд╛рд░рдгрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди 2 error рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ?

рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдЪрд╛рд░ рдерд╛:

func (c EmailClient) SendEmail(to, content string) fails {
    n := r.Read(b)

    // Would automaticaly propgate the error, so it will be equivlent to this:
    // n := r.Read(b) handle (err) {
    //  fail err
    // }
}

рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкрд░рд┐рд╡рд░реНрддрд┐рдд r. io.Reader.Read() рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рдг рдкрдврд╝реЗрдВред

рддреЛ, рдпрд╣ рдПрдХ рд╡реИрдз рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реЛрдЧрд╛?

func (r *MyFileReader) Read(b []byte) (n int, err error) fails

(рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ io.Reader рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди io.EOF рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред)

рд╣рд╛рдВред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рднреА err рд╕реЗ рдпрд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд░реАрдб рдлреЗрд▓реНрдпреЛрд░ рдПрд░рд░ рдХреЛ рд╣реИрдВрдбрд▓ рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдорд╛рди рд╣реИрдВ, рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдХрд┐рд╕реА рд╡рд┐рд╖рдо рдХрд╛рд░рдг рд╕реЗ)ред

рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд╛рдкрд╕реА рдорд╛рди рд╢реВрдиреНрдп-рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред рд╡рд░реНрддрдорд╛рди рдкрд╛рдардХредрдкрдврд╝реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╡рд╛рджреЗ рдХрд░реЗрдВ рдЬреЛ рдЗрд╕ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм n> 0 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд░реАрдб рдХреЛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдпрд╛ рдПрдВрдб-рдСрдл-рдлрд╛рдЗрд▓ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕реА рдХреЙрд▓ рд╕реЗ (рдЧреИрд░-рд╢реВрдиреНрдп) рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдмрд╛рдж рдХреА рдХреЙрд▓ рд╕реЗ рддреНрд░реБрдЯрд┐ (рдФрд░ n == 0) рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкрд╛рдардХ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдЕрдВрдд рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрд╛ рддреЛ рдЧрд▓рддреА == рдИрдУрдПрдл рдпрд╛ рдЧрд▓рддреА == рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдкрдврд╝реЗрдВ 0, EOF рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓рд░реНрд╕ рдХреЛ рд╣рдореЗрд╢рд╛ n> 0 рдмрд╛рдЗрдЯреНрд╕ рд▓реМрдЯрд╛рдП рдЬрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрдиреЗ рд╡рд╛рд▓реА I/O рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рдЕрдиреБрдордд EOF рд╡реНрдпрд╡рд╣рд╛рд░ рднреАред

рд░реАрдб рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╢реВрдиреНрдп рдмрд╛рдЗрдЯ рдЧрд┐рдирддреА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЬрдм рд▓реЗрди (рдкреА) == 0ред рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ 0 рдФрд░ рд╢реВрдиреНрдп рдХреА рд╡рд╛рдкрд╕реА рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ; рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдИрдУрдПрдл рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдпрд╣ рд╕рдм рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рд╡рд░реНрддрдорд╛рди рд░реАрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдиреБрдмрдВрдз рд╕реЗ, рдореБрдЭреЗ рдХреБрдЫ рдХрдорд┐рдпрд╛рдБ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдВрд╢рд┐рдХ рдкрдарди рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╡рд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рддрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЕрднреА рддрдХ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред

Io.EOF рдХрд╛ рдорд╛рдорд▓рд╛ рд╕рд░рд▓ рд╣реИ:

func DoSomething(r io.Reader) fails {
    // I'm using rerr so that I don't shadow the err returned from the function
    n, err := r.Read(b) handle (rerr) {
        if rerr != io.EOF {
            fail err
        }
        // Else do nothing?
    }
}

@thejerf , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдЖрдк рдиреЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕реБрдиреЛ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдЕрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд╛рдорд╛рдиреНрдп ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╢рдмреНрдж рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЧреЛ рдПрдХ рдСрдкрд░реЗрдЯрд░-рднрд╛рд░реА рднрд╛рд╖рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ ? рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЬрд╛рдирд╛ рдерд╛ рддреЛ рдореИрдВ рдЕрдкрдиреЗ рдкреИрд░реЛрдВ рдкрд░ рдореБрд╣рд░ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреА рдЬреАрдд рдХреА рдЧрд┐рдирддреА рдХрд░реВрдВрдЧрд╛ рдПрдХ рдЖрд╡реЗрд╢ред

рдХреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рдбрд┐рдлрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдПрдиреЛрдЯреЗрдЯ рдПрд░рд░ рдХреЛ рдХрднреА рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ? рдпрд╛ рд╡реЗ рдвреЗрд░ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ, рддреЛ рдХрд╣реЗрдВ, рд╕рд░реНрд╡рд░ рд╕реЗ рднреЗрдЬреЗрдВред рднреЗрдЬреЗрдВ, рдлрд┐рд░ CloseOnErr рдХреЛ рджреЛ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ annotateError рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдпрд╣ рдбрд┐рдлрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: https://play.golang.org/p/F0xgP4h5Vxf рдореБрдЭреЗ рдЙрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдбрд╛рдЙрдирдердВрдмреНрд╕ рдХреА рдЙрдореНрдореАрдж рдереА, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдирд┐рдпреЛрдЬрд┐рдд рдЙрддреНрддрд░ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рдХрд┐ рдпрд╣ _already_ рдХреИрд╕реЗ рдбрд┐рдлрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдХрд░реЗрдВрдЧреЗ рдмрд╕ рд╡рд░реНрддрдорд╛рди рдЧреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрдо рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЛрдИ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдХрд╛рд╢ред рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╣ рд╕реНрдирд┐рдкреЗрдЯ рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЫрд╛рдпрд╛рдВрдХрди рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо, рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред (рдпрд╣ рди рддреЛ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдЧрд╛, рди рд╣реА рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрджрддрд░ рдмрдирд╛ рджреЗрдЧрд╛ред)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкрд╣рд▓реВ рдЬреЛ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЧреЛ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдорд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ "рдЬреЛ рдХреБрдЫ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ" рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЬреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░реЗрдВ, рднрд▓реЗ рд╣реА рдЖрдк рд╕реАрдзреЗ return errors.New(...) рдЬреИрд╕реЗ рдорд╛рди рд▓реМрдЯрд╛рдПрдВ, рдЬреЛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ "рдирдП рдЪрд░" рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдирд╛рдорд┐рдд рдЪрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ defer рдЪрд▓рддрд╛ рд╣реИ рддрдм рддрдХ рдирд╛рдорд┐рдд рдЪрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╡рд░рдг рдХреЛ рдЕрднреА рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореИрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдм рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдбрдмреЗрд╕ рдкрд░ рднреА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ (рдпрд╛рдиреА, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ "рдЧреЛ рдмреЗрд╕реНрдЯ рдкреНрд░реИрдХреНрдЯрд┐рд╕" рднреА рдмрдирдирд╛ рд╣реИ, рдмрд╕ рдХреБрдЫ рдПрдХреНрд╕рдкреЛрдЬрд░ рдХрд░реЗрдВрдЧреЗ) рдЖрдк ' рдбреА рдЗрд╕реЗ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╕рдордЭ рд▓реЗрдВред рдХреНрдпреЛрдВрдХрд┐, рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдФрд░ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВред

рдпрд╣рд╛рдБ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

 r, !handleError := something()

рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 r, _xyzzy := something()
 if ok, R := handleError(_xyzzy); !ok { return R }

(рдЬрд╣рд╛рдВ _xyzzy рдПрдХ рддрд╛рдЬрд╛ рдЪрд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рджрд╛рдпрд░рд╛ рдХреЗрд╡рд▓ рдХреЛрдб рдХреА рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рддрдХ рдлреИрд▓рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ R рдПрдХрд╛рдзрд┐рдХ рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд╛рдн рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рдкреЗрдЯрдирд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЫреЛрдЯреЗ рд╣реИрдВред рд╕рд░рд▓ рдЕрдиреБрд╡рд╛рдж рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред

рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдирд┐рд╣рд┐рдд рд░рд┐рдЯрд░реНрди рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рдХреЛрдИ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд┐рд░реНрдл рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдпрд╣ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣реИ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func Read(filename string) error {
  herr := func(err error) (bool, error) {
      if err != nil { return true, fmt.Errorf("Read failed: %s", err) }
      return false, nil
  }

  f, !herr := OpenFile(filename)
  b, !herr := ReadBytes(f)
  !herr := ProcessBytes(b)
  return nil
}

рдпрд╛ рдЖрдк t.Fatal рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХрд╛ init рдХреЛрдб рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

func TestSomething(t *testing.T) {
  must := func(err error) bool { t.Fatalf("init code failed: %s", err); return true }
  !must := setupTest()
  !must := clearDatabase()
  ...
}

рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдХреЗрд╡рд▓ func(error) error рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ред рдпрд╣ рдмрд╣реБрдордд рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рд╡рд░реНрддрдорд╛рди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдЗрдирд▓рд╛рдЗрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

func Read(filename string) error {
    f, !func(err error) error {
        if err != nil { return true, fmt.Errorf("... %s", err) }
        return false, nil
    } := OpenFile(filename)
    /...

рдореИрдВ "рдРрд╕рд╛ рдордд рдХрд░реЛ" рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рдЧрд┐рдирддреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕реА рднреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА:

func failed(s string) func(error) error {
    return func(err error) {
       // returns a decorated error with the given string
   }
}

func Read(filename string) error {
  f, !failed("couldn't open file") := OpenFile(filename)
  b, !failed("couldn't read file") := ReadBytes(f)
  !failed("couldn't process file") := ProcessBytes(b)
  return nil
}

рдЬреЛ рдореБрдЭреЗ рдЙрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЙрд╕ рд╕рд╛рдорд╛рди рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред рдпрд╣ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдИрдПрдордПрдЪрдУ рдЖрдк рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЕрдкрд╡рд╛рдж-рдЖрдзрд╛рд░рд┐рдд рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдЕрдХреНрд╕рд░ рддреНрд░реБрдЯрд┐ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдмреИрдВрдЧ рддреНрд░реБрдЯрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдкрд░ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрд╛рдлреА рдХрдо рд░рдЦрддрд╛ рд╣реИ; рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЕрднреА рджрд┐рдЦрд╛рдпрд╛, рдпрджрд┐ рдкрдврд╝реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдкрдврд╝рдиреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдкрд░ if рдЖрдИрдПрдирдЬреА рд╣реИ рдФрд░ if рдЦрдВрдб рдХреЛ рд╡рд┐рдлрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рд╣рд░ рд╕рдордп nil рдкрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рднреА рдЗрд╕реЗ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕ рд╕рдордп рдХреА рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд░рд╛рд╢рд┐ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред (рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╣реЛ рд░рд╣реА рд╣реИ, рддреЛ рд╣рдо рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд░реНрджрд╛рд╢реНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди рдкрджреНрдзрддрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреИрд░-рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред) рдпрд╣ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдмреИрдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рднреА рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред

@thejerf рдЕрдЪреНрдЫрд╛ рд▓реЗрдХрд┐рди рдЦреБрд╢рд╣рд╛рд▓ рд░рд╛рд╕реНрддрд╛ рдмрд╣реБрдд рдмрджрд▓ рдЧрдпрд╛ рд╣реИред
рдХрдИ рд╕рдВрджреЗрд╢ рдкрд╣рд▓реЗ рдереЛрдбрд╝реЗ рд░реВрдмреА рдЬреИрд╕реЗ "рдпрд╛" рд╕рд┐рдВрдЯреЗрдХреНрд╕ - f := OpenFile(filename) or failed("couldn't open file") ред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд┐рдВрддрд╛ - рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛ рдХреЗ рд▓рд┐рдП рдпрд╛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ? рдЕрдЧрд░ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП - рддреЛ рддреНрд░реБрдЯрд┐ рдЯрд╛рдЗрдк рдХрд░реЗрдВ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@thejerf рдЕрдЪреНрдЫрд╛ рд▓реЗрдХрд┐рди рдЦреБрд╢рд╣рд╛рд▓ рд░рд╛рд╕реНрддрд╛ рдмрд╣реБрдд рдмрджрд▓ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╢рд╛рдпрдж-рдЖрдо-рдкрде рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдкреЙрд▓рд╣рдВрдХрд┐рди рдХреЗ рдореВрд▓ рд╕реБрдЭрд╛рд╡ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

func Read(filename string) error {
  herr := func(err error) (bool, error) {
      if err != nil { return true, fmt.Errorf("Read failed: %s", err) }
      return false, nil
  }

  f, !herr := OpenFile(filename)
  b, !herr := ReadBytes(f)
  !herr := ProcessBytes(b)
  return nil
}

рд╢рд╛рдпрдж herr рд╕рд╛рде рднреА рдХрд╣реАрдВ рди рдХрд╣реАрдВ, рдФрд░ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХреЛрдб рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдЦреЛрдЬ рд╣реИ рдХрд┐ рдПрдХ рд╕реБрдЭрд╛рд╡ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдХреНрдпрд╛ рд╕рдХреНрд╖рдо рдФрд░ рд╡рд╣рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЗрдирд▓рд╛рдЗрди рдХрд░рдирд╛ рд╢рд╛рдпрдж рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЧреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЙрди рд╕рднреА рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ; рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдХреЛрдб рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдорд╣рддреНрд╡ рджреЗрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдЧреЛ рдХреЛрдб рд╕реНрдкрд╖реНрдЯрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдЕрднреА рднреА рдХреБрдЫ рд╣рдж рддрдХ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред

рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ "рдЦреБрд╢ рдкрде" рдХреЗ рд▓рд┐рдП

func Read(filename string) error {
  f, !failed("couldn't open file") := OpenFile(filename)
  b, !failed("couldn't read file") := ReadBytes(f)
  !failed("couldn't process file") := ProcessBytes(b)
  return nil
}

рдЯреЗрдврд╝рд╛-рдореЗрдврд╝рд╛ рд╣реИ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрдЦреА рдкрде рдХреЗ рд╕рд╛рде рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ

func Read(filename string) error {
  f, err := OpenFile(filename)
  if err != nil {
    return fmt.Errorf("Read failed: %s", err)
  }

  b, err := ReadBytes(f)
  if err != nil {
    return fmt.Errorf("Read failed: %s", err)
  }

  err = ProcessBytes(b)
  if err != nil {
    return fmt.Errorf("Read failed: %s", err)
  }

  return nil
}

рддреЛ рдореИрдВ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рджреВрд╕рд░рд╛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрдврд╝рдиреЗ рдХреЗ рдЕрднреНрдпрд╕реНрдд рд╣реИрдВ рдФрд░ рдЖрдкрдХреА рдЖрдВрдЦреЗрдВ рдЦреБрд╢ рдкрде рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реИрдВред рдореИрдВ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рднреА рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдЕрднреНрдпрд╕реНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рдЕрднреНрдпрд╕реНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ, рди рдХрд┐ рдЕрдм рдЖрдк рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдиреНрдпреВрд▓рд╛рдЗрди рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХрд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдХреА рдХреЗрд╡рд▓ "рд▓рд╛рдЗрдиреЗрдВ" рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ "рдкреИрд░рд╛рдЧреНрд░рд╛рдл" рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛

рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЛред

рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗрдВ, рдЕрдЧрд░ рдпрд╣ рдареАрдХ рд╣реИред

рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рдпрд╣ рдареАрдХ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдпреЗ рдХреИрд╕реЗ рдЦреЗрд▓реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрдЬрд╛рдп, "рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ" рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдбрд╛рдЙрдирд╡реЛрдЯ рд╣реИрдВ, рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ .

рдореБрдЭреЗ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЫрд┐рдкрд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:

f := OpenFile(filename) or return failed("couldn't open file")
....
func failed(msg string, err error) error { ... } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ or рдПрдХ рд╢реВрдиреНрдп рд╕рд╢рд░реНрдд рдЕрдЧреНрд░реЗрд╖рдг рдСрдкрд░реЗрдЯрд░ рд╣реИ,
рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред
?> . рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C# рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ

f := OpenFile(filename) ?> return failed("couldn't open file")

@thejerf "рдЦреБрд╢ рдкрде" рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рдлрд▓ (...) рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛

"рд╢рд┐рдлреНрдЯ" рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рджрд░реНрдЬ @rodcorsi рд╡рд░реНрдг рдЦрд░рд╛рдм IMHO рд╣реИрдВ - (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХрд╛рдзрд┐рдХ рдХреАрдмреЛрд░реНрдб рд▓реЗрдЖрдЙрдЯ рд╣реИрдВ)

рдХреГрдкрдпрд╛ рдЗрд╕ рдорд╛рд░реНрдЧ рдХреЛ рдЕрдм рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рди рдмрдирд╛рдПрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рдХреЛрдб рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ (3 рдпрд╛ рдЕрдзрд┐рдХ рдХреЗ рдмрдЬрд╛рдп) рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЗрддрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рджреЛрд╕реНрддреЛрдВ, рдЧрдгрд┐рдд рдмрд╣реБрдд рд╣реА рдЖрд╕рд╛рди рд╣реИред рдпрд╛ рддреЛ "рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝рдиреЗ" рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЕрдкрдирд╛рдПрдВ рдпрд╛ рдЪреАрдЬреЛрдВ рдХреЛ рд╡реИрд╕реЗ рд╣реА рд░рдЦреЗрдВ рдЬреИрд╕реЗ рд╡реЗ рдЕрднреА рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЕрдЧрд░ рдлрд┐рд░" рдФрд░ рдХреЛрдб рд╢реЛрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ рдФрд░ рдлреНрд▓реБрдПрдВрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреИрд╕реЗ рдУрдУ рдкреИрдЯрд░реНрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВред

рдЖрдкрдХреЗ рд╕рднреА рд╣реИрдВрдб-рдбрд╛рдЙрди рдФрд░ рд╢рд╛рдпрдж рдХреБрдЫ рд╣реИрдВрдб-рдЕрдк рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж ;-) (рд╕рд┐рд░реНрдл рдордЬрд╛рдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)

@ рдХрд╛рдордпрд╛рд░рдПрдо рдЖрдИрдПрдордУ, "рд╕рд░реНрд╡реЛрддреНрддрдо рдЬреНрдЮрд╛рдд рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рди рдХрд░реЗрдВ" рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрддреНрдкрд╛рджрдХ рдХрдерди рдирд╣реАрдВ рд╣реИред рдпрд╣ рдирд╡рд╛рдЪрд╛рд░ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдкрддреНрд░ рддрд░реНрдХ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

@KernelDeimos рдореИрдВ
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реА # рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдКрдкрд░ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рдХ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рдж рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрдХрдбрд╝ рдмреНрд▓реЙрдХ рдкрд░ рдХреВрджрддрд╛ рд╣реИ рдпрджрд┐ рдЧрд▓рддреА рдорд╛рди рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ:

try (var err error){ 
    f, err := OpenFile(filename)
    b, err := ReadBytes(f)
    err = ProcessBytes(b)
    return nil
} catch (err error){ //Required
   return err
} finally{ // Optional
    // Do something else like close the file or connection to DB. Not necessary in this example since we  return earlier.
}

@KamyarM
рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореБрдЭреЗ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ (рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп) рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдиреЗ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рджреА? рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рддреАрд╕рд░рд╛ рддрд░реАрдХрд╛ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд░реВрдВ ("рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ")?

@urandom
рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЧреЛ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдХреИрдЪ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХрд╛ рдкреНрд░рдХрд╛рд░ рдвреВрдВрдврдирд╛ред рдЖрдЗрдП рдХрд╣реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрде рддреНрд░реБрдЯрд┐ рдЕрдкрд╡рд╛рдж рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдУрдкрдирдлрд╛рдЗрд▓() рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рдЧрд▓рддреА! = GoLang рдореЗрдВ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдпрд╣ рд╣реИ:

try (var err error){ 
    f, err := OpenFile(filename)
} catch (err error){ //Required
   return err
}
try (var err error){ 
    b, err := ReadBytes(f)
catch (err error){ //Required
   return err
}
try (var err error){ 
    err = ProcessBytes(b)
catch (err error){ //Required
   return err
}
return nil

рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдк рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рд░реЗрдЦрд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИ рддреЛ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рд╡реИрд╕реЗ рд╣реА рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк рдЕрднреА-рдлрд┐рд░-рдФрд░-рдФрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рдХреЙрд▓рд░ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЛрдб рд╕рд┐рд░реНрдл рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@KamyarM рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдк рдЕрднреА рдХрд╣рд╛рдБ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдХреЛрд╢рд┐рд╢ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд▓реЛрдЧ рд╣реИрдВ ... рдкрдХрдбрд╝реЛ, рдореИрдВ рдЗрд╕реЗ рд╕рдмреВрдд рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ ... рдкрдХрдбрд╝ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рджреЛрд╖ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ Go2 рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣рдордиреЗ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЗрд╕реЗ рд▓реЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ ... рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдмреБрд░рд╛ рд╣реИ, рдкрдХрдбрд╝реЛ ... рдкрдХрдбрд╝реЛ, рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ 1 рдпрд╛ 2 рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдореМрд▓рд┐рдХ рд╕рдорд╕реНрдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рддрд░реНрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ "рдХреЙрд▓рд░ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ"ред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рддрд░реНрдХ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ if err != nil { return nil } рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try...catch рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди throw рдХреБрдЫ рднреА рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдПрдХ рдФрд░ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рдпрджрд┐ catch {} рдореЗрдВ рддрд░реНрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП break рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХрднреА-рдХрднреА рдЖрдк рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред (рдЙрджрд╛: "рдЗрди рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд░реЗрдВ, рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЬрд╛рд░реА рд░рдЦреЗрдВ")

@KernelDeimos рдореИрдВ рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВред рдореИрдВрдиреЗ рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕реНрдерд┐рддрд┐ рджреЗрдЦреА рд╣реИред рдЖрдкрдХреЛ рдХреЛрдб рддреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрджрд┐ GoLang рдореЗрдВ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рдЪреИрдирд▓реЛрдВ рдХреА рддрд░рд╣ рдХреБрдЫ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдЪреНрдЫрд╛ рдерд╛ред рддреЛ рдЖрдк рдЙрд╕ рдЪреИрдирд▓ рдХреЛ рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрдХрдбрд╝ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкрдХрдбрд╝ рдЙрдиреНрд╣реЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ # 19642, # 21498 рдХреЗ рд╕рд╛рде "рдпрд╛ рд╡рд╛рдкрд╕реА" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ..рдХреИрдЪ (рд╕реНрдердЧрд┐рдд/рдЖрддрдВрдХ/рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ; рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдлреЗрдВрдХрдирд╛ рдХрдИ рдЧреЛрдЯреЛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдХреА рддрд░рд╣ рд╣реИ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рдЕрдВрджрд░ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЧрдпрд╛ рд╣реИ; рдХреЛрд╢рд┐рд╢ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рднреВрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ .. рд╕реНрдЯреИрдХ рдореЗрдВ рдЙрдЪреНрдЪ рдкрдХрдбрд╝реЗрдВ (рдпрд╛ рдпрджрд┐ рд╕реНрдХреЛрдк рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рддреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдЬрдЯрд┐рд▓ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдХрд░реЗрдВ .. рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкрдХрдбрд╝реЗрдВ)

@egorse
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдИ-рдХреИрдЪ рд╕рд┐рдВрдЯреИрдХреНрд╕ @KamyarM рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рд╣реИ, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрдп рдирд╣реАрдВред рдЬрдмрдХрд┐ рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ "рдпрд╛ рд╡рд╛рдкрд╕реА" рдкреНрд░рдХрд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдПрдХ рдХрд╛рдиреВрдиреА рд╕реБрдЭрд╛рд╡ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, @KamyarM , try рдореЗрдВ рдПрдХ рдЪрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рднрд╛рдЧ рдХреНрдпреЛрдВ рд╣реИ? рдЖрдк рдПрдХ err рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рд╣реА рдЕрдиреНрдп err рдЪрд░ рджреНрд╡рд╛рд░рд╛ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреНрдпрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдЪрд░ рдкрд░ рдирдЬрд░ рд░рдЦрдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ error рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕реЗ рд╢рд╛рдпрдж рдЫрд╛рдпрд╛рдВрдХрди рдирд┐рдпрдореЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ catch рдмреНрд▓реЙрдХ рдореЗрдВ рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВред

@egorse рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @DeedleFake рдиреЗ рдЬреЛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ try рдмреНрд▓реЙрдХ рдХреА рдЙрд╕ рд╡рд╕реНрддреБ рдкрд░ рдирдЬрд░ рд╣реЛрддреА рд╣реИред рд╕рд╛рде рд╣реА рдпрд╣ рдЕрдкрдиреЗ рджрд╛рдпрд░реЗ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реА # рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрдерди рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд╣реИред рд╕реА # рдореЗрдВ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рдкрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рджрд╛рдпрд░рд╛ "рдЙрдкрдпреЛрдЧ" рдмреНрд▓реЙрдХ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрддрд╛ рд╣реИред
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

рдХреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред рд╕реА # рдФрд░ рдЬрд╛рд╡рд╛ рдореЗрдВ рдкрдХрдбрд╝ рднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред рд╕реА # рдореЗрдВ рдпрджрд┐ рдЖрдк рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ рддреЛ рдХреЙрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреЛрдИ рднреА рд╡рд┐рдзрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреА рд╣реИ рдпрд╛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИ (рдпрд╛ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрдкрд╡рд╛рдж рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреА рд╣реИ)ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдореЗрдВ рд╡рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИ рдЙрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдмреНрд▓реЙрдХ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЗрди рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╡рд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рднреА рдХрд┐ рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдкрдврд╝рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

рддреНрд░реБрдЯрд┐_ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░ рдПрдХ _рд░рд┐рдЯрд░реНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ _рдирд╛рдорд╛рдВрдХрд┐рдд рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░_ рд╣реЛ, рдЬреИрд╕рд╛ рдХрд┐:

func process(someInput string) (someOutput string, err error) {
    err ?= otherAction()
    return
}

рдЕрдЧрд░ err nil рддреЛ рд╡рд╛рдкрд╕ рдЖрдПрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдореЗрдВ try рдЪреАрдиреА рдЬреЛрдбрд╝рдиреЗ рдХреА рдпрд╣ рдЪрд░реНрдЪрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд░реЛрд╢рди рд╣реЛрдЧреАред

FWIW, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдкрд░ рдПрдХ рдкреБрд░рд╛рдирд╛ рд╡рд┐рдЪрд╛рд░ (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдпрд╣ рдмрдХрд╡рд╛рд╕ рд╣реИ):

рдХреИрд░реЗрдЯ рдкреНрд░рддреАрдХ ^ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдСрдкрд░реЗрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╡реГрджреНрдзрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо рд╣реИ, рдЪрд╛рд╣реЗ рдорд╛рди рдХрд╛ рдирд╛рдо рд╣реЛ рдпрд╛ рдирд╣реАрдВред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди (рд╢реВрдиреНрдп, 0, рдЧрд▓рдд, "") рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдорд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рд╢реВрдиреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред

рд░реЗрдЬрд╝ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╡рд╛рдкрд╕ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЛ рдЫреБрдкрд╛рдП рдмрд┐рдирд╛ рдХрд┐ рдпрд╣ рдШрдЯрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

func Alpha() (string, error) {

    b, ^ := beta()
    g, ^ := gamma()
    return b + g, nil
}

рдпрд╣ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

func Alpha() (ret1 string, ret2 error) {

    b, ret2 := beta()
    if ret2 != nil {
        return
    }

    g, ret2 := gamma()
    if ret2 != nil {
        return
    }

    return b + g, nil
}

рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рдХреГрдд рд╣реИ рдпрджрд┐:

  • рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
  • рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрдердХ рдФрд░ рдХреБрд╢рд▓ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИ

рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

@gboyle рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ IMO рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП error ред рдЗрд╕рдХреЗ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИрдВ:

1 - рдЕрдиреНрдп рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреА рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
2 - рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рд░реНрдердХ рд╢реВрдиреНрдп рдорд╛рди рд╣реИрдВред

@object88 рдЬреИрд╕рд╛ рдХрд┐ context рдкреИрдХреЗрдЬ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╣рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрд░ рдЯреАрдо рд╕реЗ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреИрд╕реЗ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд error рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ (рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ error ) рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рд╕рдВрджреЗрд╢? рдХреЙрд▓ рд╕реНрдЯреИрдХ? рдЖрджрд┐ рдЖрджрд┐) рдХреЗ рд╕рд╛рдеред

AFAIK рдЧреЛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИрдВред go рдФрд░ defer рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреНрдп рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ (рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдмреЙрдЯ - рдФрд░ рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП - рдФрд░ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░)ред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

(рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ):

func (g *Generator) GenerateDevices(w io.Writer) error {
    var err error
    catch err {
        _, err = io.WriteString(w, "package cc\n\nconst (") // if err != nil { goto Caught }
        for _, bd := range g.zwClasses.BasicDevices {
            _, err = w.Write([]byte{'\t'}) // if err != nil { goto Caught }
            _, err = io.WriteString(w, toGoName(bd.Name)) // if err != nil { goto Caught }
            _, err = io.WriteString(w, " BasicDeviceType = ") // if err != nil { goto Caught }
            _, err = io.WriteString(w, bd.Key) // if err != nil { goto Caught }
            _, err = w.Write([]byte{'\n'}) // if err != nil { goto Caught }
        }
        _, err = io.WriteString(w, ")\n\nvar BasicDeviceTypeNames = map[BasicDeviceType]string{\n") // if err != nil { goto Caught }
       // ...snip
    }
    // Caught:
    return err
}

рдЬрдм err рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ "рдХреИрдЪ" рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЕрдВрдд рддрдХ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рд╕рдорд╛рди рдХреЙрд▓реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдХреИрдЪ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рднрд▓реЗ рд╣реА рдХреЙрд▓ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рдереЗ, рдЖрдк рдмрд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВред

@lukescott рдиреЗ рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ @robpike https://blog.golang.org/errors-are-values рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рд╣реИ

@davecheney рдкрдХрдбрд╝ рд╡рд┐рдЪрд╛рд░ (рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд┐рдирд╛) рдЙрд╕ рднрд╛рд╡рдирд╛ рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИред рдЬрдм рдорд╛рди рд╢реВрдиреНрдп рдирд╣реАрдВ рд░рд╣ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╕ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ (рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░)ред рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@lukescott рдЖрдк рдЖрдЬ рд░реЛрдм рдХреА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рднрд╛рд╖рд╛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдкрд╡рд╛рджреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИ:

  • рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ (рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ),
  • рдЕрдкрд╡рд╛рдж рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП "рдЕрдкрд╡рд╛рдж"),

рдХрдИ рднрд╛рд╖рд╛рдПрдВ рджреЛрдиреЛрдВ рдХреЛ рдЕрдкрд╡рд╛рдж рдорд╛рдирддреА рд╣реИрдВред

рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмреАрдЪ, рдореИрдВ рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЪрдпрди рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдЖрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╛рдЪрд╛рд▓рддрд╛ рдЕрдЪреНрдЫреА рд╣реИ рдФрд░ рд╕рд╛рджрдЧреА рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИ, IMO рдпрд╣ рдПрдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ _happy path_ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд╕реНрддрд░ рддрдХ рднреА рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ @thejerf рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, ! рдмрдЬрд╛рдп, рдПрдХ or рдСрдкрд░реЗрдЯрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рд╢рд┐рдлреНрдЯ рдмрд╛рдИрдВ рдУрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдЕрдВрддрд┐рдо рд▓реМрдЯрд╛ рддрд░реНрдХ рд╣реИ, рдФрд░ рджрд╛рдИрдВ рдУрд░ рдПрдХ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рддрд░реНрдХ рдЧреИрд░-рд╢реВрдиреНрдп (рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╢реВрдиреНрдп) рд╣реИ, рддреЛ рдЙрд╕ рддрд░реНрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдареАрдХ рд╣реИ рдЕрдЧрд░ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдмреВрд▓рд┐рдпрди рдХреЛ рдЙрдирдХреЗ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ (рдХреБрдЫ рдареАрдХ рд╣реИ/рдареАрдХ рдирд╣реАрдВ рд╣реИ)ред

рдкрдврд╝реЗрдВ рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧреА:

func Read(filename string) error {
  f := OpenFile(filename) or return errors.Contextf("opening file %s", filename)
  b := ReadBytes(f) or return errors.Contextf("reading file %s", filename)
  ProcessBytes(b) or return errors.Context("processing data")
  return nil
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреИрдХреЗрдЬ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

func Noop() func(error) error {
   return func(err error) {
       return err   
   }
}


func Context(msg string) func(error) error {
    return func(err error) {
        return fmt.Errorf("%s: %v", msg, err)
    }
}
...

рдпрд╣ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдардиреАрдп рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдкрд░рд┐рдЪрд┐рддрддрд╛ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рджреЗрд╢реА рднреА рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред

@urandom рдЗрд╕ рдХрдерди рдореЗрдВ f := OpenFile(filename) or return errors.Contextf("opening file %s", filename) рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдХреИрд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдпрд╣ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреА рдХрдореА рд╣реИ рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдмрд┐рд▓реНрдХреБрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ?

@dc0d
рдареАрдХ рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рднреА, рдореВрд▓ рддреНрд░реБрдЯрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдВрджреЗрд╢ рд╕рд┐рд░реНрдл рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдкреНрд░рд╛рдкреНрдд, or return рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рдлреА рдмрдбрд╝реА рднреАрдбрд╝ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

@urandom IMO рдпрд╣ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдЫреБрдкрд╛рддрд╛ рд╣реИред

рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ рдпрд╣рд╛рдБ, рдореИрдВ рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдо рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

"рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рдкрд░рд┐рдгрд╛рдо рддреНрд░реБрдЯрд┐ рдкреИрд░рд╛рдореАрдЯрд░"

рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд╣рд┐рдд рд╣реЛрддрд╛ рд╣реИ
рдпрджрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:

func f () (рдЗрдВрдЯ) {}
рдЬреЛ рдЗрд╕рдХреЗ рд╕рдорд╛рди рд╣реИ: func f() (int, error) {}
рд╣рдорд╛рд░реЗ рдирд┐рд╣рд┐рдд рдкрд░рд┐рдгрд╛рдо рддреНрд░реБрдЯрд┐ рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ред

рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдмрдмрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

1) рдмрдмрд▓ рдЕрдк

рдПрдХреНрд╕: = рдПрдл ()

рдпрджрд┐ f рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рддреБрд░рдВрдд рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛
(рдпрд╛ рдПрдХ рдирдпрд╛ рддреНрд░реБрдЯрд┐ рд╕реНрдЯреИрдХ рдмрдирд╛рдПрдВ?)
рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдореБрдЦреНрдп рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд░реБрдХ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

рдПрдХреНрд╕, рдЧрд▓рддреА: = рдПрдл ()
рдЕрдЧрд░ рдЧрд▓рддреА!= рд╢реВрдиреНрдп {
рд╡рд╛рдкрд╕реА ..., рддреНрд░реБрдЯрд┐
}

2) рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ

рдПрдХреНрд╕, _: = рдПрдл ()

рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реВрдЪреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рд░рд┐рдХреНрдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред

3) рдХреИрдЪ

рдПрдХреНрд╕, рдЧрд▓рддреА: = рдПрдл ()

рддреНрд░реБрдЯрд┐ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдХреЛрдб рд╕рдореНрдореЗрд▓рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдиреНрдпреВрдирддрдо рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
рдпрд╛ рдПрдХ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ dc0d рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреИрд╕реЗ?

@urandom рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рд╡рд╛рд▓ "рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╣реИ?", рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдкреВрдЫрд╛ рдерд╛ред рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд░рдЦреА рдЧрдИ рд╣реИ: f := OpenFile(filename) or return errors.Contextf("opening file %s", filename) ред рдореВрд▓ рддреНрд░реБрдЯрд┐ OpenFile() рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ - рдЬреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреА рдХрдореА рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рди рдХреЗрд╡рд▓ "рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ"ред

@dc0d
рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рдпрд╣ рд▓рдЧрднрдЧ рдЙрддрдирд╛ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ http.Handlers рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛, рдЬрд╣рд╛рдВ рдмрд╛рдж рдореЗрдВ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ mux рдкрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЪрд╛рдирдХ рдЖрдкрдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реЗрдЦрдХ рдорд┐рд▓рддрд╛ рд╣реИред рдФрд░ рд▓реЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрднреНрдпрд╕реНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЛрдЧ рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ go рдХрдерди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рд▓реА рдореБрдарднреЗрдбрд╝ рдкрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдирдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИред

@urandom рдЕрдм рдпрд╣ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ ( http.Handler рдЙрджрд╛рд╣рд░рдг рд╕рд╣рд┐рдд)ред

рдФрд░ рд╣рдо рдЪреАрдЬреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдХрд┐рд╕реА рдЦрд╛рд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдпрд╛ рдЙрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рдмреЛрд▓рддрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╛рджрдЧреА рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рд╛рде рд╣реА рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рд╡реЗрдХ рдмрддрд╛рддрд╛ рд╣реВрдВред

@dc0d

рдЬреЛ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреА рдХрдореА рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдирд╛

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдлреЗрдВрдХреЗрдВрдЧреЗ рдмрд▓реНрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдореБрджреНрджрд╛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдирд╛ред рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдХреБрдЫ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ рдФрд░ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПред

@creker рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИрдВ (рдореЗрд░реА рдХреБрдЫ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА)ред рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд╛рди рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдлреЗрдВрдХрдирд╛ рдпрд╛ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝рдиреЗ рдЬреИрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЛ рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ/рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рд╣реИред

@ dc0d рдореИрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХреЙрд▓рд░ рдХреЛ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдирд╛ред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд or return errors.Contextf("opening file %s", filename) рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рдлреЗрдВрдХрддрд╛ рд╣реИред

@creker рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрд╕реВрдЪрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@ dc0d рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЕрд╕рд╣рдпреЛрдЧреА рдЫреВрдЯ рдЕрднреА рдХрд╛рдо рдореЗрдВ рд╣реИред

@ рдХреНрд░реЗрдХрд░
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func retryReadErrHandler(filename string, count int) func(error) error {
     return func(err error) error {
          if os.IsTimeout(err) {
               count++
               return Read(filename, count)
          }
          if os.IsPermission(err) {
               log.Fatal("Permission")
          }

          return fmt.Errorf("opening file %s: %v", filename, err)
      }
}

func Read(filename string, count int) error {
  if count > 3 {
    return errors.New("max retries")
  }

  f := OpenFile(filename) or return retryReadErrHandler(filename, count)

  ...
}

@dc0d
рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╢рд╛рдпрдж рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ

@urandom рдЬреЛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдирд┐рд╣рд┐рдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЬрд╛рджреБрдИ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдмрд╣реБрдд рд╣реА рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд if err != nil рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛

@urandom , рдореИрдВ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рднреНрд░рдорд┐рдд рд╣реВрдВред retryReadErrHandler рдПрдХ func рдХреНрдпреЛрдВ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ?

@ рд╡рд╕реНрддреБ88
or return рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкреАрдЫреЗ рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИред рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рдмрд╛рдИрдВ рдУрд░ рд╕реЗ рдЧреИрд░-рд╢реВрдиреНрдп рдЕрдВрддрд┐рдо рд▓реМрдЯрд╛рдП рдЧрдП рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ http.Handler рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рддрд░реНрдХ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╡рд╛рдкрд╕реА (рдпрд╛ рдЕрдиреБрд░реЛрдз рдФрд░ рдЗрд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдПред рдФрд░ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред

рдпрд╛ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ:
```рдЬрд╛рдУ
func рдиреЛрдбреНрд╕рд╣реИрдВрдбрд▓рд░ (рд░реЗрдкреЛ рд░реЗрдкреЛ) http.Handler {
рд╡рд╛рдкрд╕реА http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
рдбреЗрдЯрд╛, _:= json.Marshal(repo.GetNodes())
w.рд▓рд┐рдЦреЗрдВ (рдбреЗрдЯрд╛)
})
}

@urandom , рдЖрдк LHS рдХреЛ рдЖрдЬ рдХреА рддрд░рд╣ рд╣реА рдЫреЛрдбрд╝рдХрд░ or ... return рд╕реЗ returnif (cond) рдмрджрд▓рдХрд░ рдХреБрдЫ рдЬрд╛рджреВ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ:

func Read(filename string) error {
   f, err := OpenFile(filename) returnif(err != nil) errors.Contextf(err, "opening file %s", filename)
   b, err := ReadBytes(f) returnif(err != nil) errors.Contextf(err, "reading file %s", filename)
   err = ProcessBytes(b) returnif(err != nil) errors.Context(err, "processing data")
   return nil
}

рдпрд╣ рдмрд╛рдИрдВ рдУрд░ рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреА рд╡реНрдпрд╛рдкрдХрддрд╛ рдФрд░ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдЯреНрд░рд┐рдЧрд░рд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рдореИрдВ рдХреЗрд╡рд▓-рд╕рд░рдХрд╛рд░реА рдкрд░рд┐рд╡рд░реНрддрди рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢рдХреНрддрд┐ рд╣реИ, рдЖрдЗрдП рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдХреИрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдПрдВред @ рдмрд┐рд▓реАрд╣ , рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд▓реЗрдХрд┐рди returnif(cond) ... if cond { return ...} рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл рдмрд╛рдж рд╡рд╛рд▓рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ? рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИред

x, err := foo()
if err != nil { return fmt.Errorf(..., err) }

рдпрд╛ рдФрд░ рднреА

if x, err := foo(); err != nil { return fmt.Errorf(..., err) }

рдпрд╛

x, err := foo(); if err != nil { return fmt.Errorf(..., err) }

рдХреЛрдИ рдирдпрд╛ рдореИрдЬрд┐рдХ рдХреАрд╡рд░реНрдб рдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВред

(рдпрджрд┐ рд╣рдо := рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдХреБрдЫ рд▓рдЪреАрд▓рд╛рдкрди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП #377 рдХреЛ рднреА рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред)

@ Randall77 рдореИрдВ рднреА рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЭреБрдХрд╛ рд╣реБрдЖ рд╣реВрдБред

@ Randall77 рдЙрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдПрдЧрд╛?

рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред Gofmt рдпрдерд╛рд╕рдВрднрд╡ рдирд┐рдпрддрд╛рддреНрдордХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@as , рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ "рдпрджрд┐ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдмреЙрдбреА рдореЗрдВ рдПрдХ return рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ, рддреЛ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдлреЙрд░реНрдореЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ред"

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ if рд╕реНрдерд┐рддрд┐ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рдмреВрд▓рд┐рдпрди рдЪрд░ рдпрд╛ рджреЛ рдЪрд░ рдпрд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рдмрд┐рд▓реАрд╣
рдореБрдЭреЗ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ or рдореЗрдВ рдЙрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдЬрд╛рджреВ рд╕реЗ рдХреБрдЫ рднреА рднреНрд░рдорд┐рдд рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @as рдХреЗ рд╡рд┐рдкрд░реАрдд, рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ http рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдХреБрдЫ рднреА рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

@ рд░реИрдВрдбрд▓77
рдЖрдк рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рд╡рд╣ рдХреЛрдб рд╢реИрд▓реА рд╕реБрдЭрд╛рд╡ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдФрд░ рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЬрд╛рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЗрд▓ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдЪрд╛рдирдХ рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕реНрд╡рд░реВрдкрдг рдХреА 2 рд╢реИрд▓рд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрди рдЬреИрд╕реЗ рдПрдХ рд▓рд╛рдЗрдирд░ рдХреЛ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИред if != ; { } рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рднреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдкреИрдЯрд░реНрди рд▓рдЧрднрдЧ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

рдЗрди рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП || рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рд╡рд╛рдкрд╕реА рд╣реЛ рд░рд╣реА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрдм рдореИрдВ || рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╡рд╛рдкрд╕реА рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рднреА рдмреНрд░реЗрдХ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рдореБрдЭреЗ рдЭрдХрдЭреЛрд░ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдЧреЛ рдХреА "рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореВрд▓реНрдп рд╣реИрдВ" рднрд╛рд╡рдирд╛ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ if err := expression; err != nil { return err } рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ, рдореБрдЦреНрдпрддрдГ рдХреНрдпреЛрдВрдХрд┐ рд▓рдЧрднрдЧ рд╣рд░ рдХреЙрд▓ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдЧрдбрд╝рдмрдбрд╝ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧрд▓рддреА рдХрд╣рд╛рдВ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИ (рдпрд╛ рдЫрд╛рдпрд╛рдВрдХрд┐рдд)ред рдпрд╣ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реБрдЖ рд╣реИред

рдЪреВрдВрдХрд┐ рдЧреЛ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ "рдЕрд╕рд╛рдзрд╛рд░рдг" рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрддрдВрдХ/рд╕реНрдердЧрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдФрд░/рдпрд╛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХреАрд╡рд░реНрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдерд╛:

func WriteFooBar(w io.Writer) (err error) {
    _, try err = io.WriteString(w, "foo")
    _, try err = w.Write([]byte{','})
    _, try err = io.WriteString(w, "bar")
    return
}

рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк LHS рдкрд░ try рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде err рдЙрдкрд╕рд░реНрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реИ рддреЛ рддреБрд░рдВрдд рд╡рд╛рдкрд╕реА рд╣реЛрддреА рд╣реИред рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдХреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд░рд┐рдЯрд░реНрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рди рд╣реЛред рдпрд╣ "рдЯреНрд░рд╛рдИ рдмреНрд░реЗрдХ рдПрдХреНрдЬреАрдХреНрдпреВрд╢рди" рдХреА рд▓реЛрдЧреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдмрд╕ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд░рд┐рдЯрд░реНрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ (рд╕рдордп рдХреА рдЬрд╛рдВрдЪ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ) рдпрд╛ рд╣рдо рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖ рдлреЙрд░рд╡рд░реНрдб-рдУрдирд▓реА рд▓реЗрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func WriteFooBar(w io.Writer) (err error) {
    _, try err = io.WriteString(w, "foo")
    _, try err = w.Write([]byte{','})
    _, try err = io.WriteString(w, "bar")
    return
catch:
    return &CustomError{"some detail", err}
}

рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрд╛рдВрдЪрдиреЗ рдФрд░ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддрд╛ рд╣реИ:

func WriteFooBar(w io.Writer) (err error) {
    _, try err = io.WriteString(w, "foo")
    _, try err = w.Write([]byte{','})
    _, err = io.WriteString(w, "bar")
        if err == io.EOF {
            err = nil
        } else {
            goto catch
        }
    return
catch:
    return &CustomError{"some detail", err}
}

рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдкрд╛рд╕ try рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдмрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:

func WriteFooBar(w io.Writer) (err error) {
    _, try(handle1) err = io.WriteString(w, "foo")
    _, try(handle2) err = w.Write([]byte{','})
    _, try(handle3) err = io.WriteString(w, "bar")
    return
handle1:
    return &CustomError1{"...", err}
handle2:
    return &CustomError2{"...", err}
handle3:
    return &CustomError3{"...", err}
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЪреВрд╕рдирд╛ (рдлреВ/рдмрд╛рд░, рдПрдХреЗ) рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдореМрдЬреВрджрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде/рдЦрд┐рд▓рд╛рдл рдЬрд╛рдиреЗ рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЧреЛ 1 рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд╕рд╛рде рдореИрдВ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдХ рдирдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреИрд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЧреЛ рдореЗрдВред рдПрдХ рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдорддрд▓рдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдореМрдЬреВрджрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ рдЙрдирдХреЗ рдЦрд┐рд▓рд╛рдлред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдВрдЬреАрд░ рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП? рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ рдпрд╛ рдЕрдЧрд░ рдпрд╣ рдХрд╛рдо рднреА рдХрд░реЗрдЧрд╛, рддреЛ рдмрд╕ рдПрдХ рдЬрдВрдЧрд▓реА рд╡рд┐рдЪрд╛рд░ рд╣реИред
рд╕рдВрд░рдЪрдирд╛ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдм рдЖрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрддреНрд╕реБрдХ рд╕реНрдерд┐рддрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рдФрд░ рд╕рд░рд▓ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

@thejerf рдХрд╛ рдирдореВрдирд╛ рдХреЛрдб @lukescott рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

func NewClient(...) (*Client, error) {
    listener, try err := net.Listen("tcp4", listenAddr)
    defer func() {
        if err != nil {
            listener.Close()
        }
    }()

    conn, try err := ConnectionManager{}.connect(server, tlsConfig)
    defer func() {
        if err != nil {
            conn.Close()
        }
    }()

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    try err = toServer.Send(&client.serverConfig)

    try err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})

    session, try err := communicationProtocol.FinalProtocol(conn)
    client.session = session

    return client, nil

catch:
    return nil, err
}

рдпрд╣ 59 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдШрдЯрдХрд░ 47 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╡рд╣реА рд▓рдВрдмрд╛рдИ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ:

func NewClient(...) (*Client, error) {
    var openedListener, openedConn bool
    listener, try err := net.Listen("tcp4", listenAddr)
    openedListener = true

    conn, try err := ConnectionManager{}.connect(server, tlsConfig)
    openedConn = true

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    try err = toServer.Send(&client.serverConfig)

    try err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})

    session, try err := communicationProtocol.FinalProtocol(conn)
    client.session = session

    return client, nil

catch:
    if openedConn {
        conn.Close()
    }
    if openedListener {
        listener.Close()
    }
    return nil, err
}

deferifnotnil рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╢рд╛рдпрдж рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рд╡рд╣ рддрд░рд╣ рдкреВрд░реА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдЧрд░ рд╡рд╣ рдЪреАрдЬ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рд╕реБрдЭрд╛рд╡ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЕрдм try(label) name рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдлреИрдВрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рддреЛ рдмрд╕ if err != nil { ... } рдХреА рдореМрдЬреВрджрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╕реЗрдЯ рдХрд░рдирд╛, рддреЛ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func WriteFooBar(w io.Writer) (err error) {
    msg := "thing1 went wrong"
    _, try err = io.WriteString(w, "foo")
    msg = "thing2 went wrong"
    _, try err = w.Write([]byte{','})
    msg = "thing3 went wrong"
    _, try err = io.WriteString(w, "bar")
    return nil

catch:
    return &CustomError{msg, err}
}

рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рд░реВрдмреА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрдирдХреЗ rescue рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред

рдПрдХ рдЪреАрдЬ рдЬреЛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ nil рдПрдХ рдЭреВрдард╛ рдореВрд▓реНрдп рдмрдирд╛рдирд╛ рдФрд░ рдЕрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛, рддрд╛рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВ:

err := doSomething()
if err { return err }

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдЯрд╛рдЗрдк рдХреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрднреА рднреА != nil рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реИред

рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдЪ/рдЭреВрдареА рдмрдирд╛рдирд╛ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдмрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рджреЗрдЧрд╛:

verbose := flag.Bool("v", false, "verbose logging")
flag.Parse()
if verbose { ... } // should be *verbose!

@carlmjohnson , рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣реИрдкреНрдкреА-рдкрд╛рде рдХреЛрдб рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╣реИрдВ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдХреБрдЫ рднреА рдЧрд▓рдд рд╣реЛ, рдпрд╛ рдирд╣реАрдВ:

func (f *foo) WriteFooBar(w io.Writer) (err error) {
    msg := fmt.Sprintf("While writing %s, thing1 went wrong", f.foo)
    _, try err = io.WriteString(w, f.foo)
    msg = fmt.Sprintf("While writing %s, thing2 went wrong", f.separator)
    _, try err = w.Write(f.separator)
    msg = fmt.Sprintf("While writing %s, thing3 went wrong", f.bar)
    _, try err = io.WriteString(w, f.bar)
    return nil

catch:
    return &CustomError{msg, err}
}

@ рдСрдмреНрдЬреЗрдХреНрдЯ 88 , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕рдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдмрд╣реБрдд рдЖрд╢рд╛рд╡рд╛рджреА?) рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рддреЛ рдпрд╣ рдХреБрд╢рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

func (f *foo) WriteFooBar(w io.Writer) (err error) {
    var format string, args []interface{}

    msg = "While writing %s, thing1 went wrong", 
    args = []interface{f.foo}
    _, try err = io.WriteString(w, f.foo)

    format = "While writing %s, thing2 went wrong"
    args = []interface{f.separator}
    _, try err = w.Write(f.separator)

    format = "While writing %s, thing3 went wrong"
    args = []interface{f.bar}
    _, try err = io.WriteString(w, f.bar)
    return nil

catch:
    msg := fmt.Sprintf(format, args...)
    return &CustomError{msg, err}
}

рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реЛрдЧрд╛?

func Foo() error {
catch:
    try _ = doThing()
    return nil
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ doThing() рддрдХ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдиреНрдпрдерд╛ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред

@carlmjohnson

рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЕрдм рдХреЛрд╢рд┐рд╢ (рд▓реЗрдмрд▓) рдирд╛рдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реВрдВред

рд╣рд╛рдБ, рдореИрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдерд╛ред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдмрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдореВрд▓реНрдп рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ред

рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реЛрдЧрд╛?

рдореИрдВ рд╣рд╛рдВ рдХрд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрд╢рд┐рд╢ рдХреЗрд╡рд▓ рдЖрдЧреЗ рдХреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдЖрдк рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ:

func Foo() error {
tryAgain:
    if err := doThing(); err != nil {
        goto tryAgain
    }
    return nil
}

рдпрд╛ рдЗрд╕ рддрд░рд╣:

func Foo() error {
    for doThing() != nil {}
    return nil
}

@Azareal

рдПрдХ рдЪреАрдЬ рдЬреЛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ рд╢реВрдиреНрдп рдХреЛ рдПрдХ рдЭреВрдард╛ рдореВрд▓реНрдп рдмрдирд╛рдирд╛ рдФрд░ рдЕрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛, рддрд╛рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВ: err := doSomething() if err { return err }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдореЗрдВ рдореВрд▓реНрдп рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рднреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╢реВрдиреНрдп рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

interface Truthy {
  True() bool
}

рдлрд┐рд░ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рддрдм рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ:

err := doSomething()
if err { return err }

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

err := doSomething()
if err == true { return err } // err is not true

рдореИрдВ рдЧреЛрд▓рд╛рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдпрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рд╢рд░реНрдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

func someFunc() error {

    errorHandler := delegator(arg1 Arg1, err error) error if err != nil {
        // ...
        return err // or modifiedErr
    }

    ret, err := doSomething()
    delegate errorHandler(ret, err)

    ret, err := doAnotherThing()
    delegate errorHandler(ret, err)

    return nil
}

рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕рд╛рдорд╛рди рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди

  • рдЗрд╕рдХрд╛ return рдЕрд░реНрде рд╣реИ return from its caller context ред (рд╡рд╛рдкрд╕реА рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреЙрд▓рд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)
  • рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ if рд╕реЗ рдкрд╣рд▓реЗ { рд▓реЗрддрд╛ рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ if err != nil ред
  • рдЗрд╕реЗ рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ delegate рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд▓рд┐рдП delegate рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред

рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рди рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдореБрдЭреЗ рдЕрднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИред

рдЪреЗрдХ рдЬреЛрдбрд╝рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

result, err := openFile(f);
if err != nil {
        log.Println(..., err)
    return 0, err 
}

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

result, err := openFile(f);
check err

```рдЬрд╛рдУ
рдкрд░рд┐рдгрд╛рдо, рддреНрд░реБрдЯрд┐: = рдУрдкрдирдлрд╛рдЗрд▓ (рдПрдл);
рдЬрд╛рдБрдЪ рддреНрд░реБрдЯрд┐ {
рд▓реЙрдЧред рдкреНрд░рд┐рдВрдЯреНрд▓рди (..., рддреНрд░реБрдЯрд┐)
}

```Go
reslt, _ := check openFile(f)
// If err is not nil direct return, does not execute the next step.

```рдЬрд╛рдУ
рдкрд░рд┐рдгрд╛рдо, рддреНрд░реБрдЯрд┐: = рдУрдкрдирдлрд╛рдЗрд▓ (рдПрдл) рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ {
рд▓реЙрдЧред рдкреНрд░рд┐рдВрдЯреНрд▓рди (..., рддреНрд░реБрдЯрд┐)
}

It also attempts simplifying the error handling (#26712):
```Go
result, err := openFile(f);
check !err {
    // err is an interface with value nil or holds a nil pointer
    // it is unusable
    result.C...()
}

рдпрд╣ (рдХреБрдЫ рдХрдард┐рди рдорд╛рдиреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ) рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди (#21161) рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрди рдЬрд╛рдПрдЧрд╛:

result, err := openFile(f);
check err {
   // handle error and return
    log.Println(..., err)
}

рдмреЗрд╢рдХ, рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ try рдФрд░ рдХреЗ рдмрдЬрд╛рдп рдЕрдиреНрдп рдЦреЛрдЬрд╢рдмреНрджреЛрдВ check , рдЕрдЧрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред

reslt, _ := try openFile(f)
// If err is not nil direct return, does not execute the next step.

```рдЬрд╛рдУ
рдкрд░рд┐рдгрд╛рдо, рддреНрд░реБрдЯрд┐: = рдУрдкрдирдлрд╛рдЗрд▓ (рдПрдл);
рдЧрд▓рддреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ {
// рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ рдФрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ
рд▓реЙрдЧред рдкреНрд░рд┐рдВрдЯреНрд▓рди (..., рддреНрд░реБрдЯрд┐)
}

Reference:

A plain idea, with support for error decoration, but requiring a more drastic language change (obviously not for go1.10) is the introduction of a new check keyword.

It would have two forms: check A and check A, B.

Both A and B need to be error. The second form would only be used when error-decorating; people that do not need or wish to decorate their errors will use the simpler form.

1st form (check A)
check A evaluates A. If nil, it does nothing. If not nil, check acts like a return {<zero>}*, A.

Examples

If a function just returns an error, it can be used inline with check, so
```Go
err := UpdateDB()    // signature: func UpdateDb() error
if err != nil {
    return err
}

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

check UpdateDB()

рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рд╣рдо рдЕрднреА рдХрд░рддреЗ рд╣реИрдВред

a, b, err := Foo()    // signature: func Foo() (string, string, error)
if err != nil {
    return "", "", err
}

// use a and b

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

a, b, err := Foo()
check err

// use a and b

рджреВрд╕рд░рд╛ рдлреЙрд░реНрдо (рдЪреЗрдХ рдП, рдмреА)
рдЪреЗрдХ рдП, рдмреА рдП рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдпрд╣ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪреЗрдХ рд░рд┐рдЯрд░реНрди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ {}*, рдмреАред

рдпрд╣ рддреНрд░реБрдЯрд┐-рд╕рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рдЕрднреА рднреА рдП рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд╣рд┐рдд рд░рд┐рдЯрд░реНрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг

a, err := Bar()    // signature: func Bar() (string, error)
if err != nil {
    return "", &BarError{"Bar", err}
}

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

a, err := Foo()
check err, &BarError{"Bar", err}

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реИ

рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдЪреЗрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдкрд╕реА рдорд╛рди рдлреЙрд░реНрдо рдореЗрдВ рдирд╣реАрдВ рд╣реИ {рдЯрд╛рдЗрдк} *, рддреНрд░реБрдЯрд┐
рдЯреВ-рдПрдХреНрд╕рдкреАрдЖрд░ рдлреЙрд░реНрдо рдЪреЗрдХ рдП, рдмреА рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рд╣реИред рдпрджрд┐ рдП рд╢реВрдиреНрдп рд╣реИ рддреЛ рдмреА рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдкрд░ рдиреЛрдЯреНрд╕
рд╕рдЬрд╛рд╡рдЯреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХреНрд▓рдВрдХрд┐рдпрд░ рдЪреЗрдХ рдП, рдмреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рддрднреА рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

if err != nil { return nil, nil, err } рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ (рдЬреЛ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реИ) рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдЧрд▓рддреА рдЙрддрдиреА рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ рдЬрд┐рддрдиреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдиреАрдЪреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдиреЛрдЯ рджреЗрдЦреЗрдВ)ред

рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рдиреЛрдЯреНрд╕
рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ (рдЪреЗрдХ .., рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╡рд╛рдкрд╕реА рдХреЗ рд╕рдорд╛рди) рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рдЫреБрдкрд╛рдП рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдирд┐рд╣рд┐рдд рд░рд┐рдЯрд░реНрди рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ||рддрдерд╛рдкрдХрдбрд╝рдКрдкрд░, рдпрд╛ рдП, рдмреА = рдлреВ ()? рдПрдХ рдЕрдиреНрдп рд╕реВрддреНрд░ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд, рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд╢реЛрдзрди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ; рдкреВрд░реНрд╡ рдХреЗ рд╕рд╛рде ||рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдорд╢реАрдирд░реА, рдмрд╛рдж рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рдЬреЛ рд╣рд░ рдЬрдЧрд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмреАрдЪ рдореЗрдВ рдФрд░ рдХреЛрдб рдХреА рдПрдХ рд╕рд╛рджреЗ-рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╕рдВрднрд╡рддрдГ рдХрдИ рдмрд╛рд░ред

рдПрдХ рдЪреЗрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ рд╡рд░реНрддрдорд╛рди рдмреНрд▓реЙрдХ рдореЗрдВ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдмрдпрд╛рдиреЛрдВ рдХреА рд╕рдорд╛рди рдкреНрд░рдореБрдЦрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд╛рдкрд╕реА)ред

рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рдПрдХ again рдХрдерди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬреЛ рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдореИрдХреНрд░реЛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рджреНрд╡рд╛рд░рд╛ рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рдХрдерди рдХрдерди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЧреЛрдЯреЛ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ :-])ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

func(foo int) (int, error) {
    err := f(foo)
again check:
    if err != nil {
        return 0, errors.Wrap(err)
    }
    err = g(foo)
    check
    x, err := h()
    check
    return x, nil
}

рдмрд┐рд▓реНрдХреБрд▓ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:

func(foo int) (int, error) {
    err := f(foo)
    if err != nil {
        return 0, errors.Wrap(err)
    }
    err = g(foo)
    if err != nil {
        return 0, errors.Wrap(err)
    }
    x, err := h()
    if err != nil {
        return 0, errors.Wrap(err)
    }
    return x, nil
}

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдХреНрд░реЛ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рднреНрд░рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ ред

рдЧреЛрдЯреЛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рддрд░рд╣, рд▓реЗрдмрд▓ рдХрд╛ рджрд╛рдпрд░рд╛ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ред рдореБрдЭреЗ рдХреИрдЪ рд▓реЗрдмрд▓ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЧреЛ рд╕реНрдХреЛрдк рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рдерд╛ (рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирдП рдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдмрд▓ goto рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ)ред again рд╡рд┐рдЪрд╛рд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдмрд▓ рдирдП рд╕реНрдХреЛрдк рдкреЗрд╢ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдлрд┐рд░ рд╕реЗ рдореЗрдЧрд╛-рдЙрджрд╛рд╣рд░рдг рд╣реИ:

func NewClient(...) (*Client, error) {
    var (
        err      error
        listener net.Listener
        conn     net.Conn
    )
    catch {
        if conn != nil {
            conn.Close()
        }
        if listener != nil {
            listener.Close()
        }
        return nil, err
    }

    listener, try err = net.Listen("tcp4", listenAddr)

    conn, try err = ConnectionManager{}.connect(server, tlsConfig)

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    try err = toServer.Send(&client.serverConfig)

    try err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})

    session, try err := communicationProtocol.FinalProtocol(conn)
    client.session = session

    return client, nil
}

рдпрд╣рд╛рдВ рд░реЛрдЧ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХрд░реАрдм рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ (рдореБрдЭреЗ рдпрд╣ рдЙрддрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ):

func NewClient(...) (*Client, error) {
    var (
        err      error
        listener net.Listener
        conn     net.Conn
    )
again:
    if err != nil {
        if conn != nil {
            conn.Close()
        }
        if listener != nil {
            listener.Close()
        }
        return nil, err
    }

    listener, err = net.Listen("tcp4", listenAddr)
    check

    conn, err = ConnectionManager{}.connect(server, tlsConfig)
    check

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    err = toServer.Send(&client.serverConfig)
    check

    err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
    check

    session, err := communicationProtocol.FinalProtocol(conn)
    check
    client.session = session

    return client, nil
}

@carlmjohnson рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдХрд╛рдлреА рдирд╣реАрдВ рд╣реИред "рдЪреЗрдХ" рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ - рдЗрд╕реЗ "рдлрд┐рд░ рд╕реЗ" рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рдж рдбрд╛рд▓рдХрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдКрдкрд░ рджрд┐рдП рдЧрдП рдлрд┐рд░ рд╕реЗ рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рдХрдерди рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдПрдХ рд╕реНрдердЧрд┐рдд рдХрдерди рдореЗрдВ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд╣ рдХреЛрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдХреЗ рд╕реНрд░реЛрдд рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрдердиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рдЕрдВрджрд░ "рдХреЛрд╢рд┐рд╢" рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ AFAICS рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП GetRuntimeEnvironment рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдХреНрдпреЛрдВрдХрд┐ рдХреИрдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд "рдЧрд▓рддреА" рдПрдХ рдЕрд▓рдЧ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИ рдЙрд╕ рд╕реЗ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдШреЛрд╖рд┐рдд

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ check рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдПрдХрдорд╛рддреНрд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА return (рдпрд╛ рдХрдо рд╕реЗ рдХрдо _some_ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ" рдЕрд░реНрде)ред рд╣рдо _рд╢рд╛рдпрдж become (рдЯреАрд╕реАрдУ рдХреЗ рд▓рд┐рдП) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдХрдо рд╕реЗ рдХрдо become рдореЗрдВ "рд╣рдо рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдп рдмрди рд░рд╣реЗ рд╣реИрдВ" рдХрд╛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рд╣реИ ... рд▓реЗрдХрд┐рди "рдЪреЗрдХ" рд╢рдмреНрдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдпрд╣ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдХрд╛рд╕ рд╣реЛрдЧрд╛ред

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБ рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ check рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ "рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБ" рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ рдХрд┐ check рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдореИрдВ рдПрдХ рд╕реБрдЭрд╛рд╡ рднреА рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдБ?
рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛:

func Open(filename string) os.File onerror (string, error) {
       f, e := os.Open(filename)
       if e != nil { 
              fail "some reason", e // instead of return keyword to go on the onerror 
       }
      return f
}

f := Open(somefile) onerror reason, e {
      log.Prinln(reason)
      // try to recover from error and reasign 'f' on success
      nf = os.Create(somefile) onerror err {
             panic(err)
      }
      return nf // return here must return whatever Open returns
}

рддреНрд░реБрдЯрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдХреЛрдИ рднреА рд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рдмреЗрд╡рдХреВрдлреА рднрд░рд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

f := Open(name) =: e

рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рди рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рд▓реМрдЯрд╛рдПрдВ, рдФрд░ рдПрдХ рдХреЛрд╢рд┐рд╢ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдмреНрд▓реЙрдХ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

try {
    f := Open("file1") // can fail here
    defer f.Close()
    f1 := Open("file2") // can fail here
    defer f1.Close()
    // do something with the files
} onerror err {
     log.Println(err)
}

@chackers рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЙрдкрдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд╡реЗ рдХреЗрд╡рд▓ рдореВрд▓реНрдп рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЗрд╕реА рддрд░рд╣ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рде рд╣реА, рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ (рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛рдПрдВ) рдПрдХ рдЦрд░рд╛рдм рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╣реИ рдЬреЛ рдмреБрд░реА рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреБрдЫ "рд╕рднреА рдХреЛ рдкрдХрдбрд╝реЗрдВ" рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md
рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред

рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░: |err| рдЕрд░реНрде рд╣реИ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╣реИ! = рд╢реВрдиреНрдп {}

// common util func
func parseInt(s string) (i int64, err error){
    return strconv.ParseInt(s, 10, 64)
}

// expression check err 1 : check and use err variable
func parseAndSum(a string ,b string) (int64,error) {
    sum := parseInt(a) + parseInt(b)  |err| return 0,err
    return sum,nil
} 

// expression check err 2 : unuse variable 
func parseAndSum(a string , b string) (int64,error) {
    a,err := parseInt(a) |_| return 0, fmt.Errorf("parseInt error: %s", a)
    b,err := parseInt(b) |_| { println(b); return 0,fmt.Errorf("parseInt error: %s", b);}
    return a+b,nil
} 

// block check err 
func parseAndSum(a string , b string) (  int64,  error) {
    {
      a := parseInt(a)  
      b := parseInt(b)  
      return a+b,nil
    }|err| return 0,err
} 

@ chen56 рдФрд░ рд╕рднреА рднрд╛рд╡реА рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░: https://go.googlesource.com/proposal/+/master/design/go2draft.md рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╡рд┐рдХреА рдлреАрдбрдмреИрдХ рдкреЗрдЬ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЪреАрдЬреЗрдВ рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЪрд▓рдиреА рдЪрд╛рд╣рд┐рдПред

рдЧреЛ 2 рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдореЗрдЧрд╛ рдЙрджрд╛рд╣рд░рдг:

func NewClient(...) (*Client, error) {
    var (
        listener net.Listener
        conn     net.Conn
    )
    handle err {
        if conn != nil {
            conn.Close()
        }
        if listener != nil {
            listener.Close()
        }
        return nil, err
    }

    listener = check net.Listen("tcp4", listenAddr)

    conn = check ConnectionManager{}.connect(server, tlsConfig)

    if forwardPort == 0 {
        env, err := environment.GetRuntimeEnvironment()
        if err != nil {
            log.Printf("not forwarding because: %v", err)
        } else {
            forwardPort, err = env.PortToForward()
            if err != nil {
                log.Printf("env couldn't provide forward port: %v", err)
            }
        }
    }
    var forwardOut *forwarding.ForwardOut
    if forwardPort != 0 {
        u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
        forwardOut = forwarding.NewOut(u)
    }

    client := &Client{...}

    toServer := communicationProtocol.Wrap(conn)
    check toServer.Send(&client.serverConfig)

    check toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})

    session := check communicationProtocol.FinalProtocol(conn)
    client.session = session

    return client, nil
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрддрдирд╛ рд╣реА рд╕рд╛рдл рд╣реИ рдЬрд┐рддрдирд╛ рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред handle рдмреНрд▓реЙрдХ рдореЗрдВ again рд▓реЗрдмрд▓ рдпрд╛ рд░реВрдмреА рдХреЗ rescue рдХреАрд╡рд░реНрдб рдХреЗ рдЕрдЪреНрдЫреЗ рдЧреБрдг рд╣реИрдВред рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рд╢реНрди рдмрдЪрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рдпрд╛ рдПрдХ рдХреАрд╡рд░реНрдб (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреАрд╡рд░реНрдб) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдП рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред

рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рд╣реИрдВрдбрд▓ рдмреНрд▓реЙрдХ рд╣реИред рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрдордЬреЛрд░реА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рднреА рдкрд░реАрдХреНрд╖рдг рд╣рд╛рд░реНрдиреЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдЕрдирджреЗрдЦреА рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐ рдкрде рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдЪрд░реНрдЪрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣ рднреА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ,

@sdwarwick рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling.md рдкрд░ рд╡рд░реНрдгрд┐рдд рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИред рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback рдкрд░ рд╡рд┐рдХреА рдкреЗрдЬ рдкрд░ рд░рд╛рдЗрдЯрдЕрдк рдХрд╛ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╡рд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рд╣реИрдВрдбрд▓ рдмреНрд▓реЙрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рдореБрджреНрджрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖред рд╣рдо рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рдмрдбрд╝реА рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рдФрд░ рд╣рд╛рд▓рд┐рдпрд╛ рдбрд┐рдЬрд╛рдЗрди рдорд╕реМрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рд╕рднреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЕрдЧрд░ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдмреЛрд▓рдирд╛ рд╣реИ:

r, err := os.Open(src)
    if err != nil {
        return err
    }

рдХрд┐ рдореИрдВ рд▓рдЧрднрдЧ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

r, err := os.Open(src) try ("blah-blah: %v", err)

"рдХреЛрд╢рд┐рд╢" рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдХреЛрдИ рд╕реБрдиреНрджрд░ рдФрд░ рдЙрдкрдпреБрдХреНрдд рд╢рдмреНрдж рд▓рд┐рдЦрд┐рдПред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде, рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА рдФрд░ рдмрд╛рдХреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реЛрдВрдЧреЗред рдЕрдЧрд░ рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рддреНрд░реБрдЯрд┐ рдФрд░ рдХреБрдЫ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рднреА рдХреНрд▓рд╛рд╕рд┐рдХ рдЕрдзрд┐рдХ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдФрд░ рднреА рдЬрд▓реНрдж рд╣реА (рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛):

r, err := os.Open(src) try

)
рдкреАрдПрд╕ рдореЗрд░реА рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ))

рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг:

func CopyFile(src, dst string) string, error {
    r := check os.Open(src) // return nil, error
    defer r.Close()

    // if error: run 1 defer and retun error message
    w := check os.Create(dst) // return nil, error
    defer w.Close()

    // if error: run 2, 1 defer and retun error message
    if check io.Copy(w, r) // return nil, error

}

func StartCopyFile() error {
  res := check CopyFile("1.txt", "2.txt")

  return nil
}

func main() {
  err := StartCopyFile()
  if err!= nil{
    fmt.printLn(err)
  }
}

рдирдорд╕реНрддреЗ,

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЬреЛ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рд╣реА рд╢реЗрд▓ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╢реЗрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕реА рдорд╛рдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рдЖрджреЗрд╢/рдХреЙрд▓ рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп $? рдЦреЛрд▓ рдореЗрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдЪрд░ рдирд╛рдо рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╡реАрдирддрдо рдХреЙрд▓ рдХреЗ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЪреЗрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗрдВ рдЪреБрди рд▓рд┐рдпрд╛ рд╣реИ ? рдирд╡реАрдирддрдо рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░реЗ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗрдВ рдЪреБрди рд▓рд┐рдпрд╛ рд╣реИ ! рдЕрдЧрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╢реБрд▓рд┐рдкрд┐ рдХреЗ рд░реВрдк рдореЗрдВ? != рд╢реВрдиреНрдп {}ред рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛рд╡? рдЦреЛрд▓ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рднреА рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдард╛ рд░рд╣рд╛ рд╣реИред ? рдЙрдард╛рдП рдЧрдП рдкреНрд░рд╢реНрди рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХреЗрдд рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╡реАрдирддрдо рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕реА рджрд╛рдпрд░реЗ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдерд╛ред
! if рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? != nil, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рд╣реЛрдЧрд╛ред ! рдЕрд░реНрде: рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рдХрд░реЗрдВред ? рдирд╡реАрдирддрдо рддреНрд░реБрдЯрд┐ рдорд╛рди рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдХрд╛ рдореВрд▓реНрдп? рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред

val, err := someFunc(param)
! { return &SpecialError("someFunc", param, ?) }

рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ ! рд╕реАрдзреЗ рдХреЙрд▓ рдХреЗ рдкреАрдЫреЗ рд▓рд╛рдЗрди рдФрд░ рд╕рд╛рде рд╣реА рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ред
рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА:

val, _ := someFunc(param)
! return &SpecialError("someFunc", param, ?)

рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА

val, _ := someFunc(param) ! return &SpecialError("someFunc", param, ?)

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐ рд╕реЗ рдЙрдмрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

val, _ := someFunc(param)
! {
val, _ := someFunc(paramAlternative)
  !{ return &SpecialError("someFunc alternative try failed too", paramAlternative, ?) }}

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ! рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдИ рдкреБрди: рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХреЗ рд▓рд┐рдПред

val, _ := someFunc(param)
for i :=0; ! && i <5; i++ {
  // Sleep or make a change or both
  val, _ := someFunc(param)
} ! { return &SpecialError("someFunc", param, ? }

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐! рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдирдХрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдЕрд╕рд┐рдВрдЪрд┐рдд рдореЗрдВ рднреНрд░рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐! рдЕрдкрдиреЗ рдЖрдк рдлреИрд▓рддрд╛ рд╣реИ ? != nil рдЬрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдКрдкрд░реА рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдКрдкрд░реА рдХреЛ рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд! рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕рдЪ рд╣реИ, рдЬрдм рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИред

рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рд╡рд┐рд╡рд░рдг рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ, рдпрд╣ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рджреЗрдЦрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдЫреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЬреНрдЮрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреИрд╕реЗ рдЯреНрд░рд╛рдИ рдПрдВрдб рдХреИрдЪ рдмреНрд▓реЙрдХ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдЧреЛ рдХреЗ рд╡рд░реНрддрдорд╛рди рджрд░реНрд╢рди рдХреЛ рд░рдЦрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡реЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдмрдирд╛рддрд╛ рд╣реИред

@tobimensch рдХреГрдкрдпрд╛ рдПрдХ рд╕рд╛рд░ рдХреЗ рд▓рд┐рдП рдирдП рд╕реБрдЭрд╛рд╡ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ рдЧреЛ 2 рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдлреАрдбрдмреИрдХ рд╡рд┐рдХреА рдореЗрдВ рд▓рд┐рдВрдХ рдХрд░реЗрдВред рдЗрд╕ рдмрдВрдж рдореБрджреНрджреЗ рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЕрдирджреЗрдЦреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЧреЛ 2 рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрдврд╝рдирд╛ рдЪрд╛рд╣реЗрдВред

рдФрд░ рдЖрдкрдХреЛ Go 2 рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рджреВ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддреА рд╣реИред рдореИрдВ || рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ error intedface рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

michaelsafyan picture michaelsafyan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Miserlou picture Miserlou  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

natefinch picture natefinch  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bbodenmiller picture bbodenmiller  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lkarlslund picture lkarlslund  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ