Go: рдкреНрд░рд╕реНрддрд╛рд╡: рдПрдХ рдмрд┐рд▓реНрдЯ-рдЗрди рдЧреЛ рдПрд░рд░ рдЪреЗрдХ рдлрдВрдХреНрд╢рди, "рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ"

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдЬреВрди 2019  ┬╖  808рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: golang/go

рдкреНрд░рд╕реНрддрд╛рд╡: рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЧреЛ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╕рдорд╛рд░реЛрд╣, try

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

рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХреГрдкрдпрд╛ рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝реЗрдВ рдФрд░ 6 рдЬреВрди рддрдХ рдЪрд░реНрдЪрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджреЗрдЦреЗрдВ, 10 рдЬреВрди рддрдХ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ , рдФрд░ _рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рд░рд╣рдиреЗ рдХреА рд╕рд▓рд╛рд╣_ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдпрд╛ рд╕реБрдЭрд╛рд╡ рдХрд╛ рдЙрддреНрддрд░ рдкрд╣рд▓реЗ рд╣реА рджрд┐рдпрд╛ рдпрд╛ рджрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реЛред рдзрдиреНрдпрд╡рд╛рджред

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

[рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкрд╛рда рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред]

try рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓реЗрддрд╛ рд╣реИред рд╡реНрдпрдВрдЬрдХ рдХреЛ n+1 рдорд╛рдиреЛрдВ (рдЬрд╣рд╛рдБ n рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдБ рдЕрдВрддрд┐рдо рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП error ред рдпрджрд┐ (рдЕрдВрддрд┐рдо) рддреНрд░реБрдЯрд┐ рддрд░реНрдХ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдпрд╣ рдкрд╣рд▓реЗ n рдорд╛рди (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рджреЗрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХреЛрдб

f, err := os.Open(filename)
if err != nil {
    return тАж, err  // zero values for other results, if any
}

рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

f := try(os.Open(filename))

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

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХреЗ рдЧреЛрдлрд░рдХреЙрди рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдореВрд▓ рдорд╕реМрджрд╛ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рд░ рдореЗрдВ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╡реГрджреНрдзрд┐ рдпрд╛ рд░реИрдкрд┐рдВрдЧ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ рддреЛ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ: рдХреЛрд╢рд┐рд╢ рдХрд┐рдП рдЧрдП рдФрд░ рд╕рд╣реА if рдХрдерди рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдХреЗ рд░рд╣реЗрдВ, рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, defer рдХрдерди рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ "рдШреЛрд╖рд┐рдд" рдХрд░реЗрдВ:

defer func() {
    if err != nil { // no error may have occurred - check for it
        err = тАж // wrap/augment error
    }
}()

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

defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)

(рдЬрд╣рд╛рдВ fmt.HandleErrorf рд╕рдЬрд╛рддрд╛ рд╣реИ *err ) рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

рдХреНрд░реЗрдбрд┐рдЯ

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдм рддрдХ рд╣рдореЗрдВ рдорд┐рд▓реЗ рдлреАрдбрдмреИрдХ рд╕реЗ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЙрдзрд╛рд░ рд▓реЗрддрд╛ рд╣реИ:

рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝

https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md

tryhard try . рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓

https://github.com/griesemer/tryhard

Go2 LanguageChange Proposal error-handling

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

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ,

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

рднрд╛рд░реА рд╕рдореБрджрд╛рдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдпрд╣рд╛рдВ рд╡реНрдпрд╛рдкрдХ рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

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

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

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

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

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

рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдореАрдХреНрд╖рд╛ рд╕рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд░реЙрдмрд░реНрдЯ рдЧреНрд░рд┐рд╕реЗрдорд░ред

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

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ: рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЖрдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ред

рдореИрдВ рдмрд╛рдЗрдХрд╢реЗрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ (рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ), рд▓реЗрдХрд┐рди рд░рд╕реНрдЯ рд╡рд╣рд╛рдВ рдЧрдпрд╛ рдФрд░ рдЕрдВрддрддрдГ рдмрдврд╝реА рд╣реБрдИ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп ? рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдмрд╕ рдЧрдпрд╛ред

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

check io.Copy(w, check newReader(foo))

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:

io.Copy(w, newReader(foo)?)?

рд▓реЗрдХрд┐рди рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрдЧрд╛:

try(io.Copy(w, try(newReader(foo))))

рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреМрди рд╕рд╛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

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

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдирд╛:

рдХрд░рддрд╛ рд╣реИ

func f() (n int, err error) {
  n = 7
  try(errors.New("x"))
  // ...
}

рд╡рд╛рдкрд╕реА (0, "рдПрдХреНрд╕") рдпрд╛ (7, "рдПрдХреНрд╕")? рдореИрдВ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдорд╛рдиреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдХрд╛ рдирд╛рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдХреЛрдИ рд╕рдЬрд╛рд╡рдЯ рдпрд╛ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ)? рдореИрдВ рдирд╣реАрдВ рдорд╛рдиреВрдВрдЧрд╛ред

рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг 7, errors.New("x") рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╢реАрдШреНрд░ рд╣реА рд╕рдмрдорд┐рдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреВрд░реНрдг рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (https://golang.org/cl/180557)ред

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

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

рдореБрдЭреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ ? рджрд┐рдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА try() рджреЗрддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдареАрдХ рд╣реИ, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдШрдмрд░рд╛рд╣рдЯ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдпрд╣ рдХреЛрдИ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИред

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

@dominikh рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ panic рдФрд░ recover рджреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рд╣реИрдВ рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг/рд╕реБрдЭрд╛рд╡:

if the last argument supplied to try, of type error, is not nil, the enclosing functionтАЩs error result variable (...) is set to that non-nil error value before the enclosing function returns

рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп is set to that non-nil error value and the enclosing function returns рдХрд╣ рд╕рдХрддрд╛ рд╣реИ? (рдПрд╕/рдкрд╣рд▓реЗ/рдФрд░)

рдкрд╣рд▓реА рдмрд╛рд░ рдкрдврд╝рдиреЗ рдкрд░, before the enclosing function returns рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ _eventually_ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рддреНрд░реБрдЯрд┐ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ - рд╕рдВрднрд╡рддрдГ рдмрд╛рдж рдХреА рдкрдВрдХреНрддрд┐ рдореЗрдВред рд╕рд╣реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИред рдпрд╣ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдЪреАрдиреА рд╣реИ, рдФрд░ рдХреБрдЫ рдореБрдЦрд░ рд╡рд┐рд░реЛрдзрд┐рдпреЛрдВ рдиреЗ рдЧреЛрд▓рдВрдЧ рдХреЛ if err != nil ... рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдврд╝рд╛рдпрд╛ рдФрд░ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд▓рд┐рдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпреЗ рджреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рдХреЗрд╡рд▓ рдЧрд╛рдпрдм рдЪреАрдЬреЗрдВ рд╣реИрдВ:

https://github.com/purpleidea/mgmt/blob/a235b760dc3047a0d66bb0b9d63c25bc746ed274/util/errwrap/errwrap.go#L26

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

try(foobar())

рдЕрдЧрд░ foobar рд╡рд╛рдкрд╕ (error, error)

рдореИрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗрддрд╛ рд╣реВрдВ рдФрд░ рдЕрдм рдореИрдВ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрддрд╛ред рдореИрдВ рдШреБрдЯрдиреЗ рдХреЗ рдмрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рдпрджрд┐ рдореБрджреНрджрд╛ _after_ рдкреВрд░реНрдг рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрдкрд▓рдмреНрдз рдерд╛) рджрд╛рдпрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрддрд╛ред

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

@webermaster рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо error рдкрд░рд┐рдгрд╛рдо try рдХреЛ рдкрд╛рд░рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред

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

рдпрд╣ рд▓рдВрдмрд╡рдд рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рдЕрдЧрд░ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдирд╛ рдерд╛ , рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрдЧрд╛ред

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

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

рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдВрдЧреЗ try(foo()) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рд╣рдо рджреГрд╢реНрдп рдХреНрдпреВ рд╕реЗ рджреВрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╡рд╛рд╣ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

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

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

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

  1. рд╕рдорд╛рд░реЛрд╣ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ err рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред
    рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдВ? рдореБрдЭреЗ рдЖрд╕реНрдердЧрд┐рдд рдФрд░ рдЕрдирд╛рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдпрд╛рдж рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
func sample() (string, error) {
  var err error
  defer fmt.HandleErrorf(&err, "whatever")
  s := try(f())
  return s, nil
}
  1. рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ рдЬреИрд╕реЗ рд╣рдордиреЗ рдЕрддреАрдд рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╣рд╛рдпрдХ wrapf рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ if err != nil рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реЛред
func sample() (string, error) {
  s, err := f()
  try(wrapf(err, "whatever"))
  return s, nil
}
func wrapf(err error, format string, ...v interface{}) error {
  if err != nil {
    // err = wrapped error
  }
  return err
}

рдЕрдЧрд░ рдХреЛрдИ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрд╕рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реВрдВред

func sample() (string, error) {
  var err error
  defer fmt.HandleErrorf(&err, "whatever")
  s := try(f())
  return s, nil
}

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

func sample() (string, error) {
  s, err := f()
  try(wrapf(err, "whatever"))
  return s, nil
}
func wrapf(err error, format string, ...v interface{}) error {
  if err != nil {
    // err = wrapped error
  }
  return err
}

рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдкрд░ рднреА рд░реИрдк рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред
рдпрд╣ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛), рдФрд░ рдЖрдИрдПрдордУ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ:

func sample() (string, error) {
  s, err := f()
  if err != nil {
      return "", wrap(err)
  }
  return s, nil
}

рдХреЛрдИ рднреА рдЖрдкрдХреЛ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

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

try(foobar())

рдЕрдЧрд░ foobar рд╡рд╛рдкрд╕ (error, error)

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

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@cespare : рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП go fix рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ $#$1 try #$ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдХреЛрдб рдЖрдХрд╛рд░ рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ try рд╕рд┐рд░реНрдл рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рд╣реИ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдПрдХ рдРрд╕реЗ рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрдЧрд╛ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рд╡рд╣ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрд┐рд╕ рдкрд░ try рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

@lestrrat : рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ try рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдИрдбреАрдИ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@ рдЧреБрдбрд╡рд╛рдЗрди : рдЬреИрд╕рд╛ рдХрд┐ @ Randall77 рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рд╣реИ, рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рд╕реБрдЭрд╛рд╡ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рд╕реЛрдЪрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ) рдХреБрдЫ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдЪрд░ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬреЛ error рдкрд░рд┐рдгрд╛рдо рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдореМрдЬреВрдж рд╣реИ)ред рдЗрд╕рд╕реЗ рдЙрд╕ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ defer рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд▓реЗрдХрд┐рди рд╡рд╣ рдФрд░ рднреА рдЬрд╛рджреВ рд╣реЛрдЧрд╛; рдпрд╣ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд▓рдЧрддрд╛ред рд░рд┐рдЯрд░реНрди рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рд╡рд╣ рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯреЗрдб рдПрдкреАрдЖрдИ рдореЗрдВ go doc рдФрд░ рджреЛрд╕реНрддреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ (рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рднреА рджреЗрдЦреЗрдВ)ред

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

рд╕реАрдПрд▓ 180637 рджреЗрдЦреЗрдВред

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

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБ рдмрдирд╛рдирд╛ рдЬреЛ return рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдмрд╣реБрдд рдХрдо рдкрдардиреАрдп рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╛рддрдЪреАрдд рдореЗрдВ рд╕реБрдирд╛ рдерд╛ рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХреА рд╕реБрдВрджрд░рддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ:

func CopyFile(src, dst string) error {
    r, err := os.Open(src)
    if err != nil {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }
    defer r.Close()

    w, err := os.Create(dst)
    if err != nil {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    if _, err := io.Copy(w, r); err != nil {
        w.Close()
        os.Remove(dst)
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    if err := w.Close(); err != nil {
        os.Remove(dst)
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }
}

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

func CopyFile(src, dst string) error {
    defer func() {
        err = fmt.Errorf("copy %s %s: %v", src, dst, err)
    }()
    r, err := try(os.Open(src))
    defer r.Close()

    w, err := try(os.Create(dst))

    defer w.Close()
    defer os.Remove(dst)
    try(io.Copy(w, r))
    try(w.Close())

    return nil
}

рдЖрдк рдЗрд╕реЗ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рдХрдо рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рд╕рднреА рд╕реНрдкреЙрдЯ рдХреЛ рдЦреЛрдЬрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдерд╛ред рд╡реЗ рд╕рднреА рдЗрдВрдбреЗрдВрдЯ рдХрд┐рдП рдЧрдП рдереЗ рдФрд░ return рд╕реЗ рд╢реБрд░реВ рд╣реБрдП рдереЗ, рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдкреЗрд╕ рдерд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рднреА рд╕рд╢рд░реНрдд рд░рд┐рдЯрд░реНрди _must_ рд╕рд╢рд░реНрдд рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ gofmt рдорд╛рдирдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдбреЗрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред return рднреА, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╣ рдХрд╣реЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдПрдХ рднрдпрд╛рд╡рд╣ рддреНрд░реБрдЯрд┐ рд╣реБрдИред рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╣реА return рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди _ever_ рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП nil ред рдЕрдВрддрд┐рдо рджреЛ try рдХреЙрд▓ рджреЗрдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рджреЛ рдереЛрдбрд╝реЗ рдХрдард┐рди рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╡реЗ рдХрд╣реАрдВ рдиреЗрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╣реЛрдВ, рддреЛ рдФрд░ рднреА рдХрдард┐рди рд╣реЛрдВрдЧреЗ, рдЬреИрд╕реЗ proc := try(os.FindProcess(try(strconv.Atoi(os.Args[1])))) ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рд▓реМрдЯрдирд╛ рдПрдХ "рдкрд╡рд┐рддреНрд░" рдЪреАрдЬ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рднреА рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдХреЛ return рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ 5 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

https://news.ycombinator.com/item?id=20101417

рдореИрдВрдиреЗ рдПрдПрд╕рдЯреА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЧреЛ рдореЗрдВ рдХреЛрд╢рд┐рд╢() рд▓рд╛рдЧреВ рдХреА рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдерд╛: https://github.com/lunixbochs/og

рддреНрд░реБрдЯрд┐-рдЬрд╛рдВрдЪ-рднрд╛рд░реА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ: https://github.com/lunixbochs/poxd/blob/master/tls.go#L13

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

@griesemer
рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ defer рдХреЗ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ (рдиреАрдЪреЗ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛) рдмрд╣реБрдд рдЖрдо AFAICT рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ рддреЛ рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЛрдЧ рдЗрд╕ рд╕реЛрдЪ рдХреЛ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

var err error
defer fmt.HandleErrorf(err);

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

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

@deanveloper рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ (рдФрд░ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ) рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ return рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ - рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рд╣реИ, рд╣реИ рдирд╛? if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдФрд░ returns рдХреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рднреА рд╕рдорд╛рди рд╣реИрдВред рдпрджрд┐ рдЖрдк return рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ try рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред

рд╣рдо return рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ (рдФрд░ panic 's) рдХреЛ рддреБрд░рдВрдд рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЧреЛ (рдФрд░ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ) рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рджреВрд░ рдХреА рдХреМрдбрд╝реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо try рдХреЛ рднреА рдЗрд╕рдХреА рдЖрджрдд рдкрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдмрджрд▓рддреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рди рд▓реЗрдВрдЧреЗ, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рд╣рдо return рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЪреНрдЫрд╛ рдЖрдИрдбреАрдИ рд╕рдорд░реНрдерди рднреА рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рджреЛ рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ:

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

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдПрдХ рдЪрд┐рдордЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)

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

рдпрд╣ try() рдХреЗ рдХрдИ рд▓рд╛рднреЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦреЗрдЧрд╛:

  • рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИ
  • рдпрд╣ рдореМрдЬреВрджрд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ WRT рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ
  • рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдореМрдЬреВрджрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реИ
  • рдпрд╣ рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ errors.Wrap(err, "context message")
  • рдпрд╣ рдПрдХ рдХреНрд▓реАрди рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдореЗрдВ рдкрд░рд┐рдгрдд рд╣реЛрддрд╛ рд╣реИ: a, b, err := myFunc() рд▓рд╛рдЗрди рдкрд░ рдХреЛрдИ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИ
  • defer fmt.HandleError(&err, "msg") рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • check рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд▓рдкреЗрдЯрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@ s4n-gt рдЗрд╕ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЗрд╕рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдереАред

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

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

func main() {
  if err := newmain(); err != nil {
    println(err.Error())
    os.Exit(1)
  }
}

рдПрдХ рдЖрдЦрд┐рд░реА рдЖрд▓реЛрдЪрдирд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ "рдлрд╝рдВрдХреНрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд┐рдВрдЧ рдлреНрд▓реЛ" рдкреНрд░рддрд┐рд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд▓реЛрдЪрдирд╛ рд╣реИред

"рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ" рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ " panic рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ!"ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ panic рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдареАрдХ рд╣реИ рдЬреЛ $#$2 try #$ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

  1. panic рд╢реБрд░реБрдЖрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬреЛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕рд╣рдЬ рд╣реИ, рдпрд╣ рд╕реНрдЯреИрдХ рдХреЛ рдЦреЛрд▓рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдХрд┐рд╕реА рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ panic рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рд╢реБрд░реБрдЖрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ recover рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╢реБрд░реБрдЖрддреА рдЖрдорддреМрд░ рдкрд░ рдкреИрдирд┐рдХ рд░рд┐рдХрд╡рд░реА рдореИрдХреЗрдирд┐рдЬреНрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рд╡реЗ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдХреЗрд╡рд▓ рдШрдмрд░рд╛рд╣рдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХрдо рдЕрдиреБрдХреВрд▓ рд╣реЛрддреЗ рд╣реИрдВред

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

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

рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмреЗрд╣рдж рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдпрд╣ рд╕рд╣рдЬ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

try рдлрд╝рдВрдХреНрд╢рди рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

  2. try рдореЗрд░реА рдирдЬрд░ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╣реИред _рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ_ рдЬрдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЗрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░реЗрдЧрд╛ред _ESPECIALLY_ рдЬрд╛рд╡рд╛ рдЬреИрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд╣рд╛рдВ try рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдХрд╛рд░рдг)ред

  3. рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА proc := try(os.FindProcess(try(strconv.Atoi(os.Args[1])))) рдореЗрдВ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, try рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рддрд░реНрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд╕реНрдкреЙрдЯ рдХрд░рдирд╛ рдФрд░ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрд░реА рдЖрдВрдЦреЗрдВ try рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреА рд╣реИрдВ, рддрдм рднреА рдЬрдм рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░реА рдЖрдВрдЦреЗрдВ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦ рд▓реЗрдВрдЧреА, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд os.FindProcess рдпрд╛ strconv.Atoi рдХреЙрд▓ рдкрд░ рдЬрд╛рдПрдВред try рдПрдХ рд╕рд╢рд░реНрдд рд╡рд╛рдкрд╕реА рд╣реИред рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдФрд░ рд░рд┐рдЯрд░реНрди рджреЛрдиреЛрдВ рдЧреЛ рдореЗрдВ рдкреЗрдбрд╕реНрдЯрд▓ рдкрд░ рд░реБрдХреЗ рд╣реБрдП рд╣реИрдВред рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЗрдВрдбреЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рд░рд┐рдЯрд░реНрди return рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрди рджреЛрдиреЛрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдПрдХ рдЖрд╕рд╛рди-рд╕реЗ-рдорд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдорд┐рд▓рд╛рдХрд░ рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред


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

@buchanae рджрд┐рд▓рдЪрд╕реНрдкред рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдкреИрдХреЗрдЬ рд╕реЗ fmt-style рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреАрдбрд╝реЗ рдХреА рдПрдХ рдХреИрди рдЦреЛрд▓рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдкреИрдХреЗрдЬ рд╕реЗ fmt-style рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреАрдбрд╝реЗ рдХреА рдПрдХ рдХреИрди рдЦреЛрд▓рддрд╛ рд╣реИред

рдЕрдЪреНрдЫреА рдмрд╛рддред рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:

a, b, err := myFunc()
check(err, "calling myFunc")

@buchanae рд╣рдордиреЗ try рд╕реЗ рдЕрдзрд┐рдХ рд╕реАрдзреЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ - рдХреГрдкрдпрд╛ рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ рдЕрдиреБрднрд╛рдЧред check рдХрд╛ рдЖрдкрдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрдЭрд╛рд╡ рдХреЗрд╡рд▓ fmt.Errorf рдЬреИрд╕реЗ рдПрдкреАрдЖрдИ ( check рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭреВрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓реЛрдЧ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдореВрд▓ рдХреЛ рдЙрд╕рдХреА рддреНрд░реБрдЯрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

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

a, b, c, ... err := try(someFunctionCall())
if err != nil {
   return ..., err
}

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

рдореИрдВ рдЗрд╕ рд▓рд╛рдЗрди рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛:

defer fmt.HandleErrorf(&err, тАЬfoobarтАЭ)

рдпрд╣ рдЗрдирдмрд╛рдЙрдВрдб рддреНрд░реБрдЯрд┐ рдХреЛ рдлрд░реНрд╢ рдкрд░ рдЧрд┐рд░рд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЗрд╕ рддрд░рд╣ рдХреБрдЫ рдФрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ?

defer fmt.HandleErrorf(&err, тАЬfoobar: %vтАЭ, err)

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

рдореИрдВ @buchanae рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рджреЛ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдкреБрди: рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВред

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

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

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

рдореМрдЬреВрджрд╛ рдХреЛрдб:

func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
        err := dbfile.RunMigrations(db, dbMigrations)
        if err != nil {
                return nil, err
        }
        t := &Thing{
                thingy: thingy,
        }
        t.scanner, err = newScanner(thingy, db, client)
        if err != nil {
                return nil, err
        }
        t.initOtherThing()
        return t, nil
}

try рдХреЗ рд╕рд╛рде:

func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
        try(dbfile.RunMigrations(db, dbMigrations))
        t := &Thing{
                thingy:  thingy,
                scanner: try(newScanner(thingy, db, client)),
        }
        t.initOtherThing()
        return t, nil
}

рдкрдардиреАрдпрддрд╛ рдХрд╛ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ newScanner рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рддрдм try рд╡рд╛рд▓реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдкреНрд░рддрд┐ рдЕрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрдВрдЧреЗред

@josarian main рдПрдХ error рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╡рд╣реА рд╣реИ рдЬреЛ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ main рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

"рдлреЛрдмрд╛рд░" рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмреБрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдореБрдЭреЗ рд╢рд╛рдпрдж рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

defer fmt.HandleErrorf(&err, тАЬfoobar: %vтАЭ, err)

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдмрдЧ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореМрдЬреВрдж рд╣реИ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдВрдд рдХреЗ рдкрд╛рд╕:

defer fmt.HandleErrorf(&err, "copy %s %s: %v", src, dst, err)

@adg рд╣рд╛рдВ, try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдиреЗ рджрд┐рдпрд╛: рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдпрдерд╛рд╡рдд рд╣реИрдВред

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

try рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд▓реЛрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд╡рд╣реА рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдХрд╛рдлреА рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдореЗрд░рд╛ check рдЙрджрд╛рд╣рд░рдг рдЙрд╕реА рд▓рд╛рдЗрди рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

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

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

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

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ @adg рдиреЗ рджрд┐рдпрд╛, рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдлрд▓рддрд╛рдПрдВ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИред рдпрджрд┐ newScanner рдФрд░ RunMigrations рд╕реНрд╡рдпрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдЧрд▓рдд рд╣реБрдЖ, рддреЛ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣реЗ рд╣реИрдВред

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

рдореИрдВ рдЪрд┐рдВрддрд╛ рдХреЛ @deanveloper рдФрд░ рдЕрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдХрдард┐рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддреГрддреАрдп-рдкрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╢реИрд▓рд┐рдпрд╛рдБ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред
рдпрджрд┐ рдХрдо рджреЛрд╣рд░рд╛рд╡ if err := ... { return err } рдкреНрд░рд╛рдердорд┐рдХ рдмрд┐рдВрджреБ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ "рд╕рд╢рд░реНрдд рд╡рд╛рдкрд╕реА" рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧреА, рдЬреИрд╕реЗ https://github.com/golang/go/issues/27794 рдкреНрд░рд╕реНрддрд╛рд╡рд┐рддред

        return nil, err if f, err := os.Open(...)
        return nil, err if _, err := os.Write(...)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ? try рд╕реЗ рдмреЗрд╣рддрд░ рдлрд┐рдЯ рд╣реЛрдЧрд╛, рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ defer рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП try/catch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдХреЗ рджреНрд╡рд╛рд░ рднреА рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕/рдкрдХрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдХреЗ рджреНрд╡рд╛рд░ рднреА рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде _more_ рдареАрдХ рд╣реВрдВред

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

рдЬреИрд╕рд╛ рдХрд┐ @griesemer рдХрд╣рддреЗ рд╣реИрдВ:

рдлрд┐рд░, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдЕрдм рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдП, рдмреА, рд╕реА, ... рдЧрд▓рддреА: = рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ ())
рдЕрдЧрд░ рдЧрд▓рддреА!= рд╢реВрдиреНрдп {
рд╡рд╛рдкрд╕реА ..., рддреНрд░реБрдЯрд┐
}
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВред рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рд╣рд░ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЬрд╣рд╛рдВ defer рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рддрдм рднреА рдХреЛрдИ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

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

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

рдпрд╣ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ -

func (p *pgStore) DoWork() error {
    tx, err := p.handle.Begin()
    if err != nil {
        return err
    }
    var res int64
    err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
    if err != nil {
        tx.Rollback()
        return fmt.Errorf("insert table: %w", err)
    }

    _, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
    if err != nil {
        tx.Rollback()
        return fmt.Errorf("insert table2: %w", err)
    }
    return tx.Commit()
}

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░:

рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╡реГрджреНрдзрд┐ рдпрд╛ рд░реИрдкрд┐рдВрдЧ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ: рдХреЛрд╢рд┐рд╢ рдХреА рдЧрдИ рдФрд░ рд╕рд╣реА рдЕрдЧрд░ рдХрдерди рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдХреЗ рд░рд╣реЗрдВ, рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рд╕реНрдердЧрд┐рдд рдХрдерди рдХреЗ рд╕рд╛рде "рдШреЛрд╖рд┐рдд" рдХрд░реЗрдВ:

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

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

try() рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдЪреЗрдХ/рд╣реИрдВрдбрд▓ рд╕реЗ check рдХреА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  1. рдпрд╣ рдЧреЛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИред рд▓реЛрдЧ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд╛рдж рдореЗрдВ рд╢реВрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд┐рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЧреЛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЬрд╛рдБрдЪ/рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрд░рд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдиреЗ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛; рдпрд╣рд╛рдВ _рдЖрд╡рд░реНрддреА рдереАрдо_ рджреЗрдЦреЗрдВ:
    https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes

    f, #      := os.Open(...) // return on error
    f, #panic := os.Open(...) // panic on error
    f, #hname := os.Open(...) // invoke named handler on error
    // # is any available symbol or unambiguous pair
    
  2. рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИ, рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХреНрд░рдо рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддреА рд╣реИ, рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рддреА рд╣реИред рдорд╛рдорд▓реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЙрд▓ рдЕрдиреБрдХреНрд░рдо рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ:
    try(step4(try(step1()), try(step3(try(step2())))))
    рдЕрдм рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рднрд╛рд╖рд╛ рдордирд╛ рдХрд░рддреА рд╣реИ:
    f(t ? a : b) рдФрд░ f(a++)

  3. рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ред рдЬрд╛рдВрдЪ/рд╕рдВрднрд╛рд▓ рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рддрд░реНрдХ рд╕рдВрджрд░реНрднреАрдХрд░рдг рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдерд╛ред

  4. рдпрд╣ error рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдФрд░ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЕрдЧрд░ рд╣рдореЗрдВ рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ/рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ: if errno := f(); errno != 0 { ... }

  5. рдпрд╣ рдХрдИ рд░рд╛рд╕реНрддреЗ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдЬреЛ рд╕реНрдЯреЛрд░реЗрдЬ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЧрд▓рдд рдЗрдирдкреБрдЯ рдпрд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рдХреЛрдб рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ return err рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд░рддрд╛ рд╣реИ:

    • рд▓реЙрдЧред рдШрд╛рддрдХ ()
    • рдкреИрдирд┐рдХ () рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрднреА рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
    • рдПрдХ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдХрд░реЗрдВ рдФрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

@gopherbot Go2, LanguageChange рдЬреЛрдбрд╝реЗрдВ

рдХреИрд╕реЗ рдХреЗрд╡рд▓ ? rust рдХреА рддрд░рд╣ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ

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

func doSomething() (int, %error) {
  f := try(foo())
  ...
}
  • рд╣рдо try() рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ doSomething рдореЗрдВ %error рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
  • рд╣рдо рдХреЛрд╢рд┐рд╢ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдлреВ () рдореЗрдВ рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред

рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдирдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ/рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдХрдард┐рди рд╣реИред

рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ foo() рдореЗрдВ% рддреНрд░реБрдЯрд┐ рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

1 рдФрд░ рдирд┐рдпрдо рдЬреЛрдбрд╝реЗрдВ

  • % рддреНрд░реБрдЯрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд╛рдкрд╕реА рдорд╛рди рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ try рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рдХрджрд░:

handler := func(err error) error {
        return fmt.Errorf("foo failed: %v", err)  // wrap error
}

f := try(os.Open(filename), handler)  

рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдЗрд╕ рддрд░рд╣:

f := try(os.Open(filename), func(err error) error {
        return fmt.Errorf("foo failed: %v", err)  // wrap error
})  

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

рджреВрд╕рд░реЗ, рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрд╛рдЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 'рдХреЛрд╢рд┐рд╢' рдирд╛рдо рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдкрд╕реА рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рддреЛ рдПрдХ рд▓рдВрдмрд╛ рдирд╛рдо, рдЬреИрд╕реЗ attempt рдореБрдЭреЗ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред

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

рд╣реИрдХрд░ рд╕рдорд╛рдЪрд╛рд░ рдореЗрдВ рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИ: try рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ) рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ return рдпрд╛ defer рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛:

func CopyFile(src, dst string) (err error) {
        r := try os.Open(src)
        defer r.Close()

        w := try os.Create(dst)
        defer func() {
                w.Close()
                if err != nil {
                        os.Remove(dst) // only if a тАЬtryтАЭ fails
                }
        }()

        try io.Copy(w, r)
        try w.Close()
        return nil
}

@sheerun рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рд╡рд╛рдж рдпрд╣ рд╣реИ рдХрд┐ panic рднреА рдПрдХ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдкрд░рд┐рд╡рд░реНрддрдирдХрд╛рд░реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИред

  1. рдКрдкрд░ рджрд┐рдП рдЧрдП @deanveloper рдХреЗ рд╕рд╛рде-рд╕рд╛рде рджреВрд╕рд░реЛрдВ рдХреА рд╕рдорд╛рди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдмрд╣реБрдд рдбрд░ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдирдпрд╛, рдХреБрдЫ рд╣рдж рддрдХ рд╕реВрдХреНрд╖реНрдо рдЬреЛрдбрд╝рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ-рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХреАрд╡рд░реНрдб рдЬреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ рдмрд╣реЗред panic(...) рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рдЕрдкрд╡рд╛рдж рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ) рдХрд┐ return рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдПрдХ рддрд┐рд╣рд╛рдИ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдФрдЪрд┐рддреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдЧреИрд░-рд▓рд┐рдкрдЯреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдирдирд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде рд░реИрдкрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдСрдкреНрдЯ-рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдпрд╣ рдЕрдЪреНрдЫреЗ рдЕрднреНрдпрд╛рд╕ рдХреЗ рдареАрдХ рдкреАрдЫреЗ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рддреНрд░реБрдЯрд┐ рд╕рд╛рдЗрдЯ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХ рдХрдард┐рди рдирд╣реАрдВ рдмрдирд╛ рджреЗрдЧрд╛ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде tryf рдЬреИрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡реГрджреНрдзрд┐ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

func tryf(t1 T1, t1 T2, тАж tn Tn, te error, fn func(error) error) (T1, T2, тАж Tn)

рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ

x1, x2, тАж xn = tryf(f(), func(err error) { return fmt.Errorf("foobar: %q", err) })

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ

t1, тАж tn, te := f()
if te != nil {
    if fn != nil {
        te = fn(te)
    }
    err = te
    return
}

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

рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ try рдкрд╛рд░рдВрдкрд░рд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджреЗрдЧрд╛, рдФрд░ рдпрд╣ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдкрде рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ред

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

a, b, err := doWork()
if err != nil {
  updateCounters()
  writeLogs()
  return err
}

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

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

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

@politician рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдерд╛ред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдирд╛рдЯрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЗрд╕реЗ рд▓реЗрдХрд░ рднреНрд░рдорд┐рдд рд╣реВрдВред

рдмреНрд▓реЙрдЧ рд╕реЗ: рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдорд╛рди рд╣реИрдВ , рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рди рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд░реЛрдк рдкрд╛рдЗрдХ рдиреЗ рдХреНрдпрд╛ рдХрд╣рд╛, "рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреНрд░рдорд╛рджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореВрд▓реНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреНрд░рдорд╛рджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред"

рд╣рдореЗрдВ error рдХреЛ exception $ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдЪрд╛рд╣рд┐рдП, рдпрд╣ рди рдХреЗрд╡рд▓ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд▓реНрдХрд┐ рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рдЬрдЯрд┐рд▓рддрд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред

"рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред" тАФ рд░реЛрдм рдкрд╛рдЗрдХ

рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ, рд╣рдо рдЗрд╕ рд╕реНрд▓рд╛рдЗрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

image

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

r, err := os.Open(src)
if err != nil {
    return err
}
defer func() {
    // maybe check whether a previous error occured?
    return r.Close()
}()

рдХреНрдпрд╛ defer try(r.Close()) рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдХрд┐рд╕реА рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрдиреАрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдХрдо рд╕реЗ рдХрдо, рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ CopyFile() рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛрдЧреА, рддрд╛рдХрд┐ r.Close() рдФрд░ w.Close() рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

@seehuhn рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдердЧрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

func doWork() (err error) {
  r, err := os.Open(src)
  if err != nil {
    return err
  }
  defer func() {
    err = r.Close()  // overwrite the return value
  }()
}

рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдХреБрдВрдЬреА рдирд╛рдорд┐рдд рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╣реИред

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

defer try(w.Close())

рддреНрд░реБрдЯрд┐ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ() рд╕реЗ рдХреЗрд╡рд▓ рддрднреА рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬрдм рддреНрд░реБрдЯрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдереАред
рдпрд╣ рдкреИрдЯрд░реНрди рдЗрддрдиреА рдмрд╛рд░ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ...

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

рдкрд╣рд▓реА рдЪреАрдЬ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ fmt.HandleErrorf рдХреЛ tryf рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдерд╛, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд░рддрд╛ рд╣реИред

func tryf(t1 T1, t1 T2, тАж tn Tn, te error, ts string) (T1, T2, тАж Tn)

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╕реЗ):

func (c *Config) Build() error {
    pkgPath, err := c.load()
    if err != nil {
        return nil, errors.WithMessage(err, "load config dir")
    }
    b := bytes.NewBuffer(nil)
    if err = templates.ExecuteTemplate(b, "main", c); err != nil {
        return nil, errors.WithMessage(err, "execute main template")
    }
    buf, err := format.Source(b.Bytes())
    if err != nil {
        return nil, errors.WithMessage(err, "format main template")
    }
    target := fmt.Sprintf("%s.go", filename(pkgPath))
    if err := ioutil.WriteFile(target, buf, 0644); err != nil {
        return nil, errors.WithMessagef(err, "write file %s", target)
    }
    // ...
}

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func (c *Config) Build() error {
    pkgPath := tryf(c.load(), "load config dir")
    b := bytes.NewBuffer(nil)
    tryf(emplates.ExecuteTemplate(b, "main", c), "execute main template")
    buf := tryf(format.Source(b.Bytes()), "format main template")
    target := fmt.Sprintf("%s.go", filename(pkgPath))
    tryf(ioutil.WriteFile(target, buf, 0644), fmt.Sprintf("write file %s", target))
    // ...
}

рдпрд╛, рдЕрдЧрд░ рдореИрдВ @agnivade рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддрд╛ рд╣реВрдВ:

func (p *pgStore) DoWork() (err error) {
    tx := tryf(p.handle.Begin(), "begin transaction")
        defer func() {
        if err != nil {
            tx.Rollback()
        }
    }()
    var res int64
    tryf(tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res), "insert table")
    _, = tryf(tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res), "insert table2")
    return tryf(tx.Commit(), "commit transaction")
}

рд╣рд╛рд▓рд╛рдВрдХрд┐, @josarian рдиреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдореБрджреНрджрд╛ рдЙрдард╛рдпрд╛ рдЬреЛ рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╕рдВрдХреЛрдЪ рдХрд░рддрд╛ рд╣реИ:

рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдкреИрдХреЗрдЬ рд╕реЗ fmt-style рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреАрдбрд╝реЗ рдХреА рдПрдХ рдХреИрди рдЦреЛрд▓рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдФрд░ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд╛рдн рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

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

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

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореИрдВ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рджреВрд╕рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдореБрдЭреЗ t.Fatal(err) рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдореИрдВ рдПрдХ рд╕рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ return fmt.Sprintf("oh no: %v", err) ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдХрд░реВрдВ рдФрд░ рдЬрд╛рд░реА рд░рдЦреВрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ SafeWriter рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реЛ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХреБрдЫ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЕрдВрдд рдореЗрдВ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛ рд╣реЛред рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА try рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдпрджрд┐ try рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА if err != nil рдмреНрд▓реЙрдХ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛, рддреЛ рдпрд╣ рддрд░реНрдХ рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдЙрдирдореЗрдВ рд╕реЗ _some_ рдХреЛ рдЦрддреНрдо рдХрд░ рджреЗрдЧрд╛? рдЬрд╝рд░реВрд░ред рдХреНрдпрд╛ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЖрдХрд░реНрд╖рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ? рдореЗрд╣ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВред рдореЗрд░реЗ рд▓рд┐рдП, if err != nil рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝, рдпрд╛ defer рдХреА рддрд░рд╣, рдЧреЛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдмреЛрдЬрд╝ рдФрд░ рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдЧреЛ рдХреЗ рд▓рд┐рдП рдирдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рд▓реЛрдЧ рдЧреЛ рдХреЗ рд▓рд┐рдП рдирдП рд╣реИрдВ, рд╡реЗ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╛рдЯрдХреАрдп рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред

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

@peterbourgon рдФрд░ @deanveloper рдХреЛ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдкрд╕рдВрджреАрджрд╛ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдкреНрд░рд╡рд╛рд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдкреИрдирд┐рдХ () рдХреЛ рдорд╛рдирдХ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рддрдВрддреНрд░ рдХреА рддрд░рд╣ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдкрд╛рдпрдерди рдореЗрдВ рд╣реИред

рджрд╣рд╢рдд рдкрд░ рдмрд╣рд╕ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдШрдмрд░рд╛рд╣рдЯ () рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИред рдЖрдк fmt.Println(panic("oops")) рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрд╣ рдЗрд╕рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдЬрдмрд░рджрд╕реНрдд рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ try() рд╕реЗ рдмрд╣реБрдд рдХрдо рддреБрд▓рдиреАрдп рдмрдирд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдирд┐рд░реНрдорд╛рдг рд╣реЛрдирд╛ рд╣реИ, рддреЛ рдореИрдВ _far_ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рд╕рдмрд╕реЗ рдмрд╛рдИрдВ рдУрд░ рдХреА рд╡рд╕реНрддреБ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛред

рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ:

func printSum(a, b string) error {
        fmt.Println(
                "result:",
                try(strconv.Atoi(a)) + try(strconv.Atoi(b)),
        )
        return nil
}

рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдо рд╕реНрдкрд╖реНрдЯ рдФрд░ рдмрд╣реБрдд рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд░реЙрдм рдкрд╛рдЗрдХ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЗрд░рд╛рджреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рднреА рд╣реИ рдХрд┐ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЬрдмрдХрд┐ рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ "рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ", рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ - рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдмрдЧ рдХрд░рдирд╛, рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдирд╛ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реА рдХрдВрдкрдиреА рдХреЛ рдЧреЛ 2 рдХреЛ рдХрднреА рдирд╣реАрдВ рдЕрдкрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рдХреЗрд╡рд▓ рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ рдЬреЛ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ, рддреЛ рдЗрд╕рд╕реЗ рдПрдХ-рд▓рд╛ рдЕрдЬрдЧрд░ 2/3 рд╡рд┐рднрд╛рдЬрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, try рдХрд╛ рдирд╛рдордХрд░рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рдЕрдВрддрддрдГ catch рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдФрд░ рд╣рдо рдЬрд╛рд╡рд╛ рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рдм рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ _рджреГрдврд╝рддрд╛ рд╕реЗ_рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ try рдирд╛рдо рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдЙрдЪреНрдЪ рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдкрд░ рдПрдХ _attempt_ рд╣реИ (рдореЗрд░реЗ рдкрд╛рд╕ _try_ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рд╛рдВрд╕реНрдХреГрддрд┐рдХ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдореВрд▓ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реНрдкреАрдХрд░ рдирд╣реАрдВ рд╣реВрдВ), рдЬрдмрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп try рдХрд╛ рдЙрдкрдпреЛрдЧ рджреБрд░реНрд▓рдн рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреА рдЙрдореНрдореАрдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред (рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛) рдФрд░ рдЖрд╢рд╛рд╡рд╛рджреА рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ try рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ _catches_ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ @HiImJC рдХрд╛ pass рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рд╣реИред

рдирд╛рдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ return рдЬреИрд╕рд╛ рдХрдерди рдЕрдм рднрд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рдЧреЛ рдлреНрд▓реЛ рд╕реНрдЯрд╛рдЗрд▓ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХреЛ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ред

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

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

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

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

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

рдПрдХ рдмреИрдВрдбрдПрдб рд╣реЛрдЧрд╛ рдпрджрд┐ try рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдВ рдЬреЛ "рдЕрд▓рд┐рдЦрд┐рдд" рдирд╣реАрдВ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЧрдВрднреАрд░ рдХрдорд┐рдпрд╛рдВ рднреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдРрд╕рд╛ рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА defer рд╕реНрд╡рдпрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдпрд╣ рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ try рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд╛рдВрдЫрдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ (рдЕрд░реНрдерд╛рдд, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ try рд▓рд╛рдкрд░рд╡рд╛рд╣реА рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдЙрд╕ рд╕рд╛рдЗрдЯ рд╕реЗ рд▓реМрдЯрд╛рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд/рд╢реНрд╡реЗрддрд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП try рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд░рдЦрдиреЗ рдХреЗ (рдЫреЛрдбрд╝реЗ рдЧрдП) рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкреБрдирд░реБрддреНрдкрд╛рджрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рдиреА рднрд░рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВ, рдпрд╛ рддреЛ рдореВрд▓реНрдп ( io.EOF рдЖрджрд┐) рдпрд╛ рдкреНрд░рдХрд╛рд░ ( *os.PathError , *exec.ExitError )ред рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╡рд╣рд╛рдВ рдлреЗрдВрдХрдирд╛ред

рддреНрд░реБрдЯрд┐ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдореЗрдВ рджреЗрд░реА рд╕реЗ @josarian рдиреЗ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

defer func() { fmt.HandleErrorf(&err, "oops: %v", err) }()

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

defer fmt.HandleErrorf(&err, "oops: %*v", &err)

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

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

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

type wraperr struct{ err *error }
func (w wraperr) String() string { return (*w.err).Error() }

...

defer handleErrorf(&err, "oops: %v", wraperr{&err})

рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХреБрдЫ рдмрд╛рддреЗрдВред рд╣рдо рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдиреЗ рдЪрд┐рдВрддрд┐рдд рдХреНрдпреЛрдВ рд╣реИрдВ? рдореИрдВ рдЗрд╕реЗ рдЙрд╕реА рддрд░реНрдЬ рдкрд░ рдорд╛рдирддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ ред

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

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

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдШрд░ рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдкреИрдЯрд░реНрди рдХрд╛ рд╕рдВрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдПрдХ рд▓реЗрдЦ рд╣реИ, рдЬрд┐рд╕реЗ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА рдереА - https://bet365techblog.com/better-error-handling-in-go

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ check / handle рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдкреНрд░рдЧрддрд┐ рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рдерд╛ред

рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ/рд╣реИрдВрдбрд▓ рдПрдХ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдерд╛ред рдЗрд╕рдХреЗ handle рдмреНрд▓реЙрдХ рдиреЗ рдЙрд╕реА рдлрдВрдХреНрд╢рди рд╕реНрдХреЛрдк рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ рдХреЛрдИ рднреА defer рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдУрд╡рд░рд╣реЗрдб рдХреЗ рдПрдХ рд░рд╛рд╢рд┐ рдХреЗ рд╕рд╛рде рдирдП рд╕рдВрджрд░реНрдн рд╣реИрдВред рдпрд╣ рдЧреЛ рдХреЗ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдЕрдзрд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ "рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ" рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ handle { return err } рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

рдпрджрд┐ рдбрд┐рдлрд░-рдЖрдзрд╛рд░рд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдП рдерд┐рдВрдЧ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢рд╛рдпрдж рддреНрд░реБрдЯрд┐ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

        f := try(os.Create(filename))
        defer errors.Deferred(&err, f.Close)

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

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

  1. https://ziglang.org/documentation/master/#try

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рджреВрд░ рдХреА рдХреМрдбрд╝реА рд╣реИред gofmt'ed рдХреЛрдб рдореЗрдВ, рд░рд┐рдЯрд░реНрди рд╣рдореЗрд╢рд╛ /^\t*return / рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ - рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рдЖрдВрдЦреЛрдВ рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЫреЛрдЯрд╛ рдкреИрдЯрд░реНрди рд╣реИред рджреВрд╕рд░реА рдУрд░, try , рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЧрд╣рд░рд╛ рдШреЛрдВрд╕рд▓рд╛ред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рдХреЛрдИ рднреА рд░рд╛рд╢рд┐ рд╣рдореЗрдВ рдЯреВрд▓ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рддреБрд░рдВрдд рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдмрдирд╛рддреА рд╣реИред

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

рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рдорд░реНрдерди рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@kungfusheep рдореБрдЭреЗ рд╡рд╣ рд▓реЗрдЦ рдкрд╕рдВрдж рд╣реИред рдЕрдХреЗрд▓реЗ рдбрд┐рдлрд░ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА try рдХреЗ рдмрд┐рдирд╛ рдкрдардиреАрдпрддрд╛ рдХреЛ рдХрд╛рдлреА рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИред

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

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

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

рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рдореИрдХреНрд░реЛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

@dominikh try рд╣рдореЗрд╢рд╛ /try\(/ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХреА рдмрд╛рдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред рдпрд╣ рдЙрддрдирд╛ рд╣реА рдЦреЛрдЬрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдЬрд┐рддрдирд╛ рдореИрдВрдиреЗ рдХрднреА рд╕реБрдирд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдПрдХ рдЦреЛрдЬ рд╕реБрд╡рд┐рдзрд╛ рд╣реИред

@qrpnxz рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреА рдЖрдВрдЦреЛрдВ рд╕реЗ рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд░реЗрдЧреЗрдХреНрд╕рдкреА рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдерд╛, рдЬрд┐рд╕рдореЗрдВ /^\t* рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд░рд┐рдЯрд░реНрди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ (рдЕрдЧреНрд░рдгреА рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдХреЗ) рдЦрдбрд╝реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ "рд╕реНрдердЧрд┐рдд" рдирд╛рдордХ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

func Format(err error, message string, args ...interface{}) error {
    if err == nil {
        return nil
    }
    return fmt.Errorf(...)
}

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func foo(s string) (int, error) {
    n, err := strconv.Atoi(s)
    try(deferred.Format(err, "bad string %q", s))
    return n, nil
}

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд fmt.HandleError рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрд╕реНрдердЧрд┐рдд рдкреИрдХреЗрдЬ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореЗрд░реА рддреНрд░реБрдЯрд┐рдпрд╛рдВред рдбрд┐рдлрд░ рд╣реЗрд▓реНрдкрд░ func рдХреЛ deferred.Exec рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╢рд░реНрдд рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦрдХрд░, рдЖрдкрдХреЛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ

func CopyFile(src, dst string) (err error) {
    defer deferred.Annotate(&err, "copy %s %s", src, dst)

    r := try(os.Open(src))
    defer deferred.Exec(&err, r.Close)

    w := try(os.Create(dst))
    defer deferred.Exec(&err, r.Close)

    defer deferred.Cond(&err, func(){ os.Remove(dst) })
    try(io.Copy(w, r))

    return nil
}

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг:

func (p *pgStore) DoWork() (err error) {
    tx := try(p.handle.Begin())

    defer deferred.Cond(&err, func(){ tx.Rollback() })

    var res int64 
    err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
    try(deferred.Format(err, "insert table")

    _, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
    try(deferred.Format(err, "insert table2"))

    return tx.Commit()
}

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ if err != nil рд╣реЛрдиреЗ рд╕реЗ рд▓реЗрдХрд░ рд╣рд░ рдЬрдЧрд╣ try рд╣реЛрдиреЗ рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ if err != nil рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рднрд╛рд╖рд╛ рдХреА рд░реЗрдЦрд╛ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдареАрдХ рдиреАрдЪреЗ рдмреИрдарддрд╛ рд╣реИ:

file := try(os.OpenFile("thing")) // less readable than, 

file, err := os.OpenFile("thing")
if err != nil {

}

рдФрд░ рдЕрдЧрд░ рдЧреЛ рдХреЛ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рджреБрдИ рд╣реЛрдирд╛ рдерд╛, рддреЛ рдХреНрдпреЛрдВ рди рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдирд╛ рд▓рд┐рдпрд╛ рдЬрд╛рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЧреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд try рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

func getString() (string, error) { ... }

func caller() {
  defer func() {
    if err != nil { ... } // whether `err` must be defined or not is not shown in this example. 
  }

  // would call try internally, because a user is not 
  // assigning an error value. Also, it can add a compile error
  // for "defined and not used err value" if the user does not 
  // handle the error. 
  str := getString()
}

рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рджреВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкрдардиреАрдпрддрд╛ рдХреА рдХреАрдордд рдкрд░ рдЕрддрд┐рд░реЗрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, VSCode рдореЗрдВ iferr рдирд╛рдордХ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдВрдЯрд░ рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрдерди рддрдХ рдлреИрд▓ рдЬрд╛рддрд╛ рд╣реИ ... рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рдореБрдЭреЗ рдХрднреА рднреА рдердХрд╛рдК рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ .

@ рдЬреЛрд╢реЗрд░рд┐рдпрди

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ "рдПрдХ рдорд╛рдореВрд▓реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░рд┐рд╡рд░реНрддрди" рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рдо func main() рддреНрд░реБрдЯрд┐ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рд╕рд╛рде рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХрд╛ рдкреБрдирд░реНрд▓реЗрдЦрди рдкреВрд░реНрдг рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ "рдкрд╛рд░рдВрдкрд░рд┐рдХ" рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдк рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░-рдлрд░реНрдорд╡реЗрдпрд░ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл WebAssembly рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реБрдкрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ os.Exit(1) рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, os.Exit рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА-рдХреЙрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рджрд╛рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдГрд╢реБрд▓реНрдХ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ main рдХрд╛ рдЖрдХрд╛рд░ рднрд╛рд╖рд╛ рдХреА рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред


рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рдЬрд┐рд╕рдХрд╛ рдЙрддреНрддрд░ рд╢рд╛рдпрдж "рдирд╣реАрдВ" рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: try рд╡рд┐рд╡рд┐рдз рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рдПрдХ variadic (ish) рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдореЗрдВ рдЗрд╕рдХрд╛ variadic-nes рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ:

var e []error
try(e...)

рдПрдХ рддрд░рдл рдЫреЛрдбрд╝рдХрд░ рдЖрдк рдХрднреА рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ "рдирд╣реАрдВ" рд╣реИ (рдЕрдиреНрдпрдерд╛ рдЕрдиреБрд╡рд░реНрддреА рд╣реИ "рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реНрд▓рд╛рдЗрд╕ рдХреА рд▓рдВрдмрд╛рдИ 0 рд╣реИ)ред рдмрд╕ рдЗрд╕реЗ рдКрдкрд░ рд▓рд╛рдирд╛ рддрд╛рдХрд┐ рдЕрдВрддрддрдГ рдХрд▓реНрдкрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗред

  • рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдпрд╣ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдмрд┐рд▓реНрдЯрд┐рди рд╕реНрдкрд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реНрдкрд╖реНрдЯ рдФрд░ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ "рдЬрд╛рджреБрдИ" рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред try рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрди рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдкрдардиреАрдпрддрд╛ рдХреА рдХреАрдордд рдкрд░ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдЧрд╛ред
  • рдпрджрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж try рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдлрд┐рд░ рдпрд╣ if рдЬреИрд╕реЗ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рдВрдЧрдд рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдиреЗрд╕реНрдЯреЗрдб рдХреЛрд╖реНрдардХреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
  • рджреЛрдмрд╛рд░рд╛, рдпрджрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ defer рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реБрджреНрдз рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣реБрдб рдХреЗ рддрд╣рдд рдПрдХ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:

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

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

func doit(abc string) error {
    a := fmt.Sprintf("value of something: %s\n", try(getValue(abc)))
    log.Println(a)
    return nil
}

рдпрд╣ рдХреЛрдб рдЙрд╕ рд╕реНрдкреНрд░рд┐рдВрдЯрдл рдХреЗ рдмреАрдЪ рдореЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рддрдереНрдп рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

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

рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ - рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 90% рд╢рд┐рдХрд╛рдпрддреЗрдВ рд╣реИрдВ "рдореИрдВ рдПрдХ рдмрдпрд╛рди рдпрд╛ рд▓реВрдк рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛"ред рдпрд╣ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ if рдХрдердиреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

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

func main() {
    f := try(os.Open("foo.txt"))
    defer f.Close()
}

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ ( func TestFoo(t* testing.T) ) рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ :(

рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреЛ рд╕рдорд╕реНрдпрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрдк рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдЖрдк рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реЛрдВред рд╢рд╛рдпрдж рдпрд╣ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬреЛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ

рдорд╛рди рд▓реЗрдВ рдХрд┐ foo() рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

func foo() (int, error) {}

рдЖрдк рддрдм рдХрд░ рд╕рдХрддреЗ рдереЗ

n := try(foo()) {
    case FirstError:
        // do something based on FirstError
    case OtherError:
        // do something based on OtherError
    default:
        // default behavior for any other error
}

рдЬреЛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ

n, err := foo()
if errors.Is(err, FirstError) {
    // do something based on FirstError
if errors.Is(err, OtherError) {
    // do something based on OtherError
} else {
    // default behavior for any other error
}

рдореЗрд░реЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдЖрдзрд╛рд░ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреЛ рдХреЛрдб рд╣реИ if err != nil { return err } , рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ (рд╕рдВрднрд╡рддрдГ) fmt.Errorf рд░реИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рдорд╛рд╕реНрдХ рдХрд░рдХреЗ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рднреА рдЦрд░рд╛рдм рд╣реИред

рдПрдХ рдирдпрд╛ рдХреАрд╡рд░реНрдб рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЬреЛ рдПрдХ рддрд░рд╣ рдХрд╛ рдЬрд╛рджреВ рд╣реИ рдЬреЛ if err != nil { return err } рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрддрд░рдирд╛рдХ рд╕рдбрд╝рдХ рд╣реИред
рдЕрдм рд╕рднреА рдХреЛрдб рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдореЗрдВ рд▓рдкреЗрдЯреЗ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рдареАрдХ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрдардиреАрдпрддрд╛ рдмреЗрдХрд╛рд░ рд╣реИ) рдЬреЛ рдХреЗрд╡рд▓ рдЗрди-рдкреИрдХреЗрдЬ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐:

func foo() error {
  /// stuff
  try(bar())
  // more stuff
}

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

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

*рдиреЛрдЯ: рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдЬреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЙрд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреЛрдб рдХреЛ рдХрдо рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ try() рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИред

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


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

рдЪреВрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрдн рдПрдХ рдЖрд╡рд░реНрддреА рд╡рд┐рд╖рдп рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ ...

рдкрд░рд┐рдХрд▓реНрдкрдирд╛: рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЛ рдлрд╝рдВрдХреНрд╢рди (T, error) рдХреЗ рд╡рд┐рдкрд░реАрдд (T1, T2, T3, error) рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░, try рдХреЛ try(T1, T2, T3, error) (T1, T2, T3) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдордиреЗ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ
try(func (args) (T1, T2, T3, error))(T1, T2, T3) ? (рдпрд╣ рдПрдХ рд╕рдиреНрдирд┐рдХрдЯрди рд╣реИ)

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ try рдХреЙрд▓ рдХреА рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдВрд░рдЪрдирд╛ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬреЛ рдХрдИ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдВрддрд┐рдо рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред

рдлрд┐рд░, make рдХреА рддрд░рд╣, рдпрд╣ рдХреЙрд▓ рдХреЗ 2-рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреНрд╡рд╛рд░ рдЦреЛрд▓рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ, %v рд╡рд╛рд▓рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ

рдпрд╣ рдЕрднреА рднреА (T, error) рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрдВрдЬреАрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдХрдИ рд░рд┐рдЯрд░реНрди рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдИрдПрдордУ рдХреА рдЖрдорддреМрд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

@ cpuguy83 рдпрджрд┐ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдХреЛрдИ рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

if err != nil { return err } рд╕рдорд╛рди рд░реВрдк рд╕реЗ "рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗ" рдХреЗ рд░реВрдк рдореЗрдВ try рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░рддреЗ рд╕рдордп рдЕрдзрд┐рдХ рдХрд╖реНрдЯрдкреНрд░рдж рдХреЛ рдЫреЛрдбрд╝рдХрд░ред

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

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ "рдЧреЙрдердЪрд╛рд╕" рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╖рдп рд╣реИред

рдкрдардиреАрдпрддрд╛ рдПрдХ рдореБрджреНрджрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЛ рдПрдлрдПрдордЯреА рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ () рддрд╛рдХрд┐ рдпрд╣ рдмрд╛рд╣рд░ рдЦрдбрд╝рд╛ рд╣реЛ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

f := try(
    os.Open("file.txt")
)

@MrTravisB

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

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

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

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

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

@boomlinde рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд░реА рдмрд╛рддред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрдбрд╝реЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдПрдХрд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореМрд▓рд┐рдХ рдкреНрд░рд╢реНрди рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдмрддрд╛рдпрд╛ рд╣реИред

рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрддрдиреА рдмрд╛рд░ рдЗрддрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛ рд╕рдХреЗред

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

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

defer fmt.HandleErrorf(&err, тАЬfoobarтАЭ)

n := try(foo())

x : try(foo2())

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ foo() рдмрдирд╛рдо foo2() рд╕реЗ рд▓реМрдЯрд╛рдИ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЪрд╛рд╣рддрд╛ рд╣реВрдВ?

@MrTravisB

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ foo() рдмрдирд╛рдо foo2() рд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдлрд┐рд░ рдЖрдк рдХреБрдЫ рдФрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рдмрд╛рдд @boomlinde рдмрдирд╛ рд░рд╣реА рдереАред

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

@qrpnxz

f := try(os.Open("/foo"))
data := try(ioutil.ReadAll(f))
try(send(data))

(рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ ReadFile рд╣реИ рдФрд░ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХрд╣реАрдВ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд┐рдВрджреБ рдирд╣реАрдВ)

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

рдЬрдВрдЧ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдСрдкрд░реЗрдЯрд░ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╣реИ ( ? рдХреЙрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛) рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдХреЛ рдЦреЛрджрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдмреЛрдЭ рдирд╣реАрдВ рдбрд╛рд▓рддрд╛ рд╣реИред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг

panic рдПрдХ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдПрдХ рдмрдпрд╛рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреА рддреБрд▓рдирд╛ try рд╕реЗ рдХрд░реЗрдВ, рдЬреЛ рдПрдХ рд╡реНрдпрдВрдЬрдХ рд╣реИ рдФрд░ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

recover рдХрд╛ рдПрдХ рдореВрд▓реНрдп рд╣реИ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди defer рдХрдерди рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреЗ defer s рдЖрдо рддреМрд░ рдкрд░ рдХрд╛рд░реНрдп рдЕрдХреНрд╖рд░ рд╣реЛрддреЗ рд╣реИрдВ, recover рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП recover рднреА рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рджреЛрдмрд╛рд░рд╛, рдЗрд╕рдХреА рддреБрд▓рдирд╛ try рд╕реЗ рдХрд░реЗрдВ рдЬреЛ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ try рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдмрдпрд╛рдиреЛрдВ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рдмрддрд╛рдпрд╛ред


рдПрдХ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡

рдЬреИрд╕реЗ рдмрдпрд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

if err != nil {
    return nil, 0, err
}

рдЬрдм рдмреНрд▓реЙрдХ рдореЗрдВ рдХреЗрд╡рд▓ return рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдиреНрдпреВрд▓рд╛рдЗрдиреНрд╕ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЙрд╕реЗ gofmt рджреНрд╡рд╛рд░рд╛ рдПрдХ рд▓рд╛рдЗрди рдкрд░ рдлреЙрд░реНрдореЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

if err != nil { return nil, 0, err }

рджрд▓реАрд▓

  • рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  • рд╕реНрд╡рд░реВрдкрдг рдирд┐рдпрдо рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ
  • рдирд┐рдпрдо рдХреЛ рдСрдкреНрдЯ-рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ gofmt рдирдИ рд▓рд╛рдЗрдиреЗрдВ рд░рдЦрддрд╛ рд╣реИ рдпрджрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ (рдЬреИрд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдЕрдХреНрд╖рд░)ред рдСрдкреНрдЯ рдЗрди рднреА рд▓реЗрдЦрдХ рдХреЛ рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • рдпрджрд┐ рдпрд╣ рдСрдкреНрдЯ рдЗрди рдирд╣реАрдВ рд╣реИ, рддреЛ gofmt рдкрд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирдИ рд╢реИрд▓реА рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рдпрд╣ рдХреЗрд╡рд▓ return рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЧреЛрд▓реНрдл рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рджреБрд░реБрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
  • рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреНрдпреЛрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдХрдИ рдиреЗрд╕реНрдЯреЗрдб try рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕реЗ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ
  • рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд╛рди рдХреЛ 66% рддрдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ
  • рдХреЛрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЖрдзрд╛рд░рд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ
  • рдХреЛрдб рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдо рдЬрдЧрд╣ рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рджреЛрд╣рд░рд╛рд╡ рдХреЛрдб рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ try рд▓реЗрдЦрдХ рдХреА рдУрд░ рдЕрдзрд┐рдХ рдЭреБрдХрддрд╛ рд╣реИ
  • рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдореМрдЬреВрджрд╛ try рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдЬреЛ рдПрдХ рд╢реИрд▓реА рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреА рд╣реИ рдЬреИрд╕реЗ
f, err := os.Open(file)
try(maybeWrap(err))
  • "рдЕрдкрдиреА рд▓рд╛рдЗрди рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ" рд╢реИрд▓реА рдХрд┐рд╕реА рднреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИ рдХрд┐ err рдореВрд▓реНрдп рдХреНрдпрд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдлреЙрд░реНрдо рдХрд╛ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдмреНрд▓реЙрдХ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреНрдпрд╛ рд╣реИрдВ
  • рдпрд╣ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ defer рдЖрдзрд╛рд░рд┐рдд рд░реИрдкрд┐рдВрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рджреЛрдиреЛрдВ рд░реИрдкрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реНрд╡ рдХреЛ godoc рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ
  • рдкрд╛рд░рдВрдкрд░рд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  • рднрд╡рд┐рд╖реНрдп рдореЗрдВ try рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рдирд╣реАрдВ рд╣реИред try рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
  • testing рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдпрд╛ main рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдирдХрд╛рд░рд╛рддреНрдордХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдирд╣реАрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдПрдХрд▓ рдкрдВрдХреНрддрд┐рдмрджреНрдз рд╡рд┐рд╡рд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрднрд┐рдХрдерди рдЖрдзрд╛рд░рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛
value, err := something()
if err != nil { t.Fatal(err) }
  • рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд╛рддрдЪреАрдд рдирд╣реАрдВред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛
n, err := src.Read(buf)
if err == io.EOF { return nil }
else if err != nil { return err }

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


рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП

https://github.com/golang/go/issues/32437#issuecomment -498941435 рд╕реЗ

рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде

func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
        try(dbfile.RunMigrations(db, dbMigrations))
        t := &Thing{
                thingy:  thingy,
                scanner: try(newScanner(thingy, db, client)),
        }
        t.initOtherThing()
        return t, nil
}

рдЗрд╕ рдХреЗ рд╕рд╛рде

func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
        err := dbfile.RunMigrations(db, dbMigrations))
        if err != nil { return nil, fmt.Errorf("running migrations: %v", err) }

        t := &Thing{thingy: thingy}
        t.scanner, err = newScanner(thingy, db, client)
        if err != nil { return nil, fmt.Errorf("creating scanner: %v", err) }

        t.initOtherThing()
        return t, nil
}

рдпрд╣ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реБрдП рдЕрдВрддрд░рд┐рдХреНрд╖ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╣реИред

https://github.com/golang/go/issues/32437#issuecomment -499007288 . рд╕реЗ

рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде

func (c *Config) Build() error {
    pkgPath := try(c.load())
    b := bytes.NewBuffer(nil)
    try(emplates.ExecuteTemplate(b, "main", c))
    buf := try(format.Source(b.Bytes()))
    target := fmt.Sprintf("%s.go", filename(pkgPath))
    try(ioutil.WriteFile(target, buf, 0644))
    // ...
}

рдЗрд╕ рдХреЗ рд╕рд╛рде

func (c *Config) Build() error {
    pkgPath, err := c.load()
    if err != nil { return nil, errors.WithMessage(err, "load config dir") }

    b := bytes.NewBuffer(nil)
    err = templates.ExecuteTemplate(b, "main", c)
    if err != nil { return nil, errors.WithMessage(err, "execute main template") }

    buf, err := format.Source(b.Bytes())
    if err != nil { return nil, errors.WithMessage(err, "format main template") }

    target := fmt.Sprintf("%s.go", filename(pkgPath))
    err = ioutil.WriteFile(target, buf, 0644)
    if err != nil { return nil, errors.WithMessagef(err, "write file %s", target) }
    // ...
}

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

@cpuguy83
рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ try рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдкрдврд╝рд╛ "рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ, рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗрдВ, рдбреЗрдЯрд╛ рднреЗрдЬреЗрдВ"ред рдирд┐рдпрдорд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдореИрдВ рдкрдврд╝реВрдВрдЧрд╛ "рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдереА, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдпрд╣ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗрдВ, рдЕрдм рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рд╣реБрдЖ ..." рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк err != nil рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреИрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ try рдмрд╕ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рддреБрд░рдВрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкрддрд╛ рдЪрд▓ рдЬрд╛рддрд╛ рд╣реИ: рдЕрдЧрд░ рдЧрд▓рддреА рд╣реЛрддреА рд╣реИ рддреЛ рд░рд┐рдЯрд░реНрди! = рд╢реВрдиреНрдпред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╢рд╛рдЦрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИред рдпрд╣ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

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

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

@zeebo рд╣рд╛рдБ, рдореИрдВ рдЙрд╕рдореЗрдВ рд╣реВрдБред
@kungfusheep рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд▓рд╛рдЗрди рдПрд░рд░ рдЪреЗрдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЧрдпрд╛ред рдлрд┐рд░ рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рд╕реЗрд╡ рдХрд┐рдпрд╛, gofmt рдиреЗ рдЗрд╕реЗ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬреЛ рджреБрдЦрдж рдерд╛ред Stdlib рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ gofmt рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛ред

@qrpnxz

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

рдпрд╣ if err != nil { return err } рд╕реЗ рдирд┐рд╖реНрдкрдХреНрд╖ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХрдо рд╣реИред


рдПрдХ рдЕрдВрддрд┐рдо рдмрд╛рдд:

рдпрджрд┐ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЛрдИ рднреА рдЪреАрдЬ рдЖрдкрдХреЛ рд░реЛрдХ рдирд╣реАрдВ рд░рд╣реА рд╣реИ

рдХреНрдпрд╛ рд╣рдо рдХреГрдкрдпрд╛ рдРрд╕реА рднрд╛рд╖рд╛ рд╕реЗ рдкрд░рд╣реЗрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдмреЗрд╢рдХ рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝рд╛ред рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрд▓ рд░рд╛рдд рдЗрд╕реЗ рдкрдврд╝рд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдЬ рд╕реБрдмрд╣ рдЯрд┐рдкреНрдкрдгреА рдХреА рдФрд░ рдЬреЛ рдореЗрд░рд╛ рдЗрд░рд╛рджрд╛ рдерд╛ рдЙрд╕рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХреАред
рдпрд╣ рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреВрд▓ рд╕реНрд╡рд░ рд╣реИред

@cpuguy83
рдореЗрд░рд╛ рдмреБрд░рд╛ рд╕реАрдкреАрдпреВ рдЖрджрдореАред рдореЗрд░рд╛ рдорддрд▓рдм рдЙрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдерд╛ред

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

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рд╖реНрдкрдХреНрд╖ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдзреНрдпрд╛рди рд╕реЗ рдХрд╣рд╛ред

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

https://github.com/golang/go/issues/32437#issuecomment -498908380

рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдХреЛрд╢рд┐рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред

рдЪрдордХ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдбрд┐рдЬрд╛рдЗрди рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрдВрджрд░ рддрд░реАрдХрд╛ рд╣реИред

рдЬрд╝рд░реВрд░, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдореИрдВ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рд╡рд╣ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ try(try(try(to()).parse().this)).easily()) рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╣рдиреЗ рдЬреИрд╕рд╛ рд╣реИ

рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд╣реЗрдЧрд╛ {}ред

рд╡реИрд╕реЗ рднреА, рд╕рд░рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧреЛ рдмрд╣реБрдд рд╕рдЦреНрдд рд╣реИ: gofmt рд╕рднреА рдХреЛрдб рдХреЛ рдПрдХ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рд╕реБрдЦреА рдкрде рдмрд╛рдПрдБ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдорд╣рдВрдЧрд╛ рдпрд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред try рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдЗрд╕рд╕реЗ 180 рдбрд┐рдЧреНрд░реА рдореЛрдбрд╝ рд╣реИред рд╕рд░рд▓рддрд╛! = рд╕рдВрдХреНрд╖рд┐рдкреНрддред

рдХрдо рд╕реЗ рдХрдо try рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ _objectively_ if err != nil { return err } рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХрдо рд╣реИред

рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд╕реНрддреБрдирд┐рд╖реНрда рдЕрдВрддрд░ рд╣реИ: try(Foo()) рдПрдХ рд╡реНрдпрдВрдЬрдХ рд╣реИред рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдВрддрд░ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рд╣реИ ( try(strconv.Atoi(x))+try(strconv.Atoi(y)) рдЖрд▓реЛрдЪрдирд╛)ред рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдВрддрд░ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдЙрд▓реНрдЯрд╛ рд╣реИред рдЕрднреА рднреА рдирд┐рд╖реНрдкрдХреНрд╖ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИ - рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдВрддрд░ рдХреЛ рдЧрд▓реАрдЪрд╛ рдХреЗ рдиреАрдЪреЗ рдмрд╣ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рджрд╛рд╡рд╛ рдХрд░рдирд╛ рдХрд┐ рдпрд╣ "рдмрд╕ рдХрдо рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП" рдкреНрд░рд╕реНрддрд╛рд╡ рдиреНрдпрд╛рдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@ elagergren-spideroak рдпрд╣ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ try рдПрдХ рд╕рд╛рдВрд╕ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рд╣реИ рдФрд░ рдлрд┐рд░ рдХрд╣реЗрдВ рдХрд┐ рдпрд╣ рдЕрдЧрд▓реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ред

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

this := try(to()).parse().this
that := try(this.easily())

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗред

try рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЦреБрд╢реА рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИред рджреБрдЦреА рдкрде рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд╛рдкрд╕реА рд╣реА рдХрд░рддрд╛ рд╣реИред рд╡рд╣рд╛рдБ рджреЗрдЦрдирд╛ try рд╣реИ рдЬреЛ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдорд╣рдВрдЧрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рд╡рд┐рд╡рд░рдг рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ try 180 рдХрд░ рд░рд╣рд╛ рд╣реИ

@josarian https://github.com/golang/go/issues/32437#issuecomment -498941854 рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдпрд╛рдВрдХрди рддреНрд░реБрдЯрд┐ рд╣реИред

defer fmt.HandleErrorf(&err, "foobar: %v", err)

err HandleErrorf рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ err рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ err nil рд╣реИ (рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо err рдХреЗ рдЕрд╕рдВрд╢реЛрдзрд┐рдд рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ err рдХреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рддреНрд░реБрдЯрд┐ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

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

@ianlancetaylor , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @josharian рд╕рд╣реА рд╣реИ: err рдХрд╛ "рдЕрдирдореЙрдбрд┐рдлрд╛рдЗрдб" рдорд╛рди рдЙрд╕ рд╕рдордп рдХрд╛ рдореВрд▓реНрдп рд╣реИ рдЬрдм defer рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ (рд╕рдВрднрд╡рддрдГ рдЗрдЪреНрдЫрд┐рдд) рдореВрд▓реНрдп err рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ try рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рддред

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

this := try(to()).parse().this
that := try(this.easily())

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

parser, err := to()
if err != nil {
    return err
}
this := parser.parse().this
that, err := this.easily()
if err != nil {
    return err
}

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

@bcmills @josharian рдЖрд╣, рдмрд┐рд▓реНрдХреБрд▓, рдзрдиреНрдпрд╡рд╛рджред рддреЛ рдпрд╣ рд╣реЛрдирд╛ рд╣реА рд╣реЛрдЧрд╛

defer func() { fmt.HandleErrorf(&err, тАЬfoobar: %vтАЭ, err) }()

рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реА рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ fmt.HandleErrorf рдХреЛ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

@ianlancetaylor рдЕрдЧрд░ fmt.HandleErrorf рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд▓рддреА рднреЗрдЬрддрд╛ рд╣реИ рддреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ %[1]v рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

@natefinch рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣рдордд рд╣реИрдВред

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

this := to()?.parse().this
that := this.easily()?

рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ( ! рдпрд╛ рдХреБрдЫ рдФрд░ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ...), рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдмреЗрд╢рдХ рдЬрдВрдЧ рдореЗрдВ рднреА try() рдмрд╣реБрдд рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди ... рдЕрдиреНрдп рдЬрдВрдЧ рд╢реИрд▓реАред

рдпрд╣ _objectively_ if err != nil { return err } рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХрдо рд╣реИред

рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд╕реНрддреБрдирд┐рд╖реНрда рдЕрдВрддрд░ рд╣реИ: try(Foo()) рдПрдХ рд╡реНрдпрдВрдЬрдХ рд╣реИред рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдВрддрд░ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рд╣реИ ( try(strconv.Atoi(x))+try(strconv.Atoi(y)) рдЖрд▓реЛрдЪрдирд╛)ред рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдВрддрд░ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдЙрд▓реНрдЯрд╛ рд╣реИред рдЕрднреА рднреА рдирд┐рд╖реНрдкрдХреНрд╖ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИ - рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдВрддрд░ рдХреЛ рдЧрд▓реАрдЪрд╛ рдХреЗ рдиреАрдЪреЗ рдмрд╣ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рджрд╛рд╡рд╛ рдХрд░рдирд╛ рдХрд┐ рдпрд╣ "рдмрд╕ рдХрдо рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП" рдкреНрд░рд╕реНрддрд╛рд╡ рдиреНрдпрд╛рдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

@MrTravisB

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

рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬреЛ рдЖрдкрдХреА рдмрд╛рдд рд╣реИ? рдмрд▓реНрдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рд╣рдордд рд╣реИрдВ рддреЛ рдЖрдкрдиреЗ рдореЗрд░реА рдмрд╛рдд рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╕рдордЭрд╛ред

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

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

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

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

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ foo() рдмрдирд╛рдо foo2() рд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдлрд┐рд░, рдЖрдк try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рддрдм рдЖрдкрдХреЛ try рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рддрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЛрддреЗред

@cpuguy83

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЬрдВрдЧ рд╢реИрд▓реА рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣реЛрдЧрд╛?

рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рддрд░реНрдХ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try{}catch{} рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ: upside_down_face:

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

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

  3. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try(try(try(to()).parse().this)).easily()) рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ред
  4. рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ 3 рд╕реНрдерд╛рди рд╣реИрдВ рдЬреЛ рддреНрд░реБрдЯрд┐-рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рди рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ? try() рдЗрд╕реЗ рдмрд╣реБрдд рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try() рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреА рдХрдард┐рдирд╛рдИ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд░реИрдкрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

    func before() error {
      x, err := foo()
      if err != nil {
        wrap(err, "error on foo")
      }
      y, err := bar(x)
      if err != nil {
        wrapf(err, "error on bar with x=%v", x)
      }
      fmt.Println(y)
      return nil
    }
    
    func after() (err error) {
      defer fmt.HandleErrorf(&err, "something failed but I don't know where: %v", err)
      x := try(foo())
      y := try(bar(x))
      fmt.Println(y)
      return nil
    }
    
  5. рдлрд┐рд░, рдЖрдк try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рддрдм рдЖрдкрдХреЛ try рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЛрддреЗ рд╣реИрдВред

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

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

@boomlinde рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо рд╕рд╣рдордд рд╣реИрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдорд╛рдореВрд▓реА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ "рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ" рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рддрд░реНрдХ рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ @ elagergren-spideroak рдиреЗ рдХрд╣рд╛, рд╡рд╣ рддрд░реНрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рднрд▓реЗ рд╣реА рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдЕрдиреНрдп рд▓реЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рддрд░реНрдХ рдХреЗ рддрд░реНрдХ рд╕реЗ рдЧреЛ рдХрд╛ рднреА рдПрдХ рддреНрд░рд┐рдЧреБрдЯ рдХрдерди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЯрд░реНрдирд░реА рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЙрдирдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рди рдХрд░реЗрдВред

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

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

func exists(filename string) bool {
  _, err := os.Stat(filename)
  return err == nil
}

if exists(...) { ... } рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдпрд╣ рдХреЛрдб рдЪреБрдкрдЪрд╛рдк рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ try рд╣реЛрддрд╛, рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рддрд╛ рдФрд░ рдмрд╕ (bool, error) рд▓реМрдЯрд╛ рджреЗрддрд╛ред

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

func catch(handler func(err error) error) {
  // .. impl ..
}

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

func wrapf(format string, ...values interface{}) func(err error) error {
  // user defined
  return func(err error) error {
    return fmt.Errorf(format + ": %v", ...append(values, err))
  }
}
func sample() {
  catch(wrapf("something failed in foo"))
  try(foo()) // "something failed in foo: <error>"
  x := try(foo2()) // "something failed in foo: <error>"
  // Subsequent calls for catch overwrite the handler
  catch(wrapf("something failed in bar with x=%v", x))
  try(bar(x)) // "something failed in bar with x=-1: <error>"
}

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

func foo(a, b string) (int64, error) {
  return try(strconv.Atoi(a)) + try(strconv.Atoi(b))
}
func withContext(a, b string) (int64, error) {
  catch(func (err error) error {
    return fmt.Errorf("can't parse a: %s, b: %s, err: %v", a, b, err)
  })
  return try(strconv.Atoi(a)) + try(strconv.Atoi(b))
}
func moreExplicitContext(a, b string) (int64, error) {
  catch(func (err error) error {
    return fmt.Errorf("can't parse a: %s, err: %v", a, err)
  })
  x := try(strconv.Atoi(a))
  catch(func (err error) error {
    return fmt.Errorf("can't parse b: %s, err: %v", b, err)
  })
  y := try(strconv.Atoi(b))
  return x + y
}
func withHelperWrapf(a, b string) (int64, error) {
  catch(wrapf("can't parse a: %s", a))
  x := try(strconv.Atoi(a))
  catch(wrapf("can't parse b: %s", b))
  y := try(strconv.Atoi(b))
  return x + y
}
func before(a, b string) (int64, error) {
  x, err := strconv.Atoi(a)
  if err != nil {
    return 0,  fmt.Errorf("can't parse a: %s, err: %v", a, err)
  }
  y, err := strconv.Atoi(b)
  if err != nil {
    return 0,  fmt.Errorf("can't parse b: %s, err: %v", b, err)
  }
  return x + y
}

рдФрд░ рдЕрднреА рднреА рдЕрд░рд╛рдЬрдХ рдордиреЛрджрд╢рд╛ рдкрд░ (рдЖрдкрдХреА рд╕рд╣рд╛рдиреБрднреВрддрд┐ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдпрджрд┐ рдЖрдкрдХреЛ catch рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдм... рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд┐рдо рд╡рд╛рдХреНрдп рд╕реЗ рдорддрд▓рдм рдирд╣реАрдВ рд░рдЦрддрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдмрд╣реБрдд рдЖрдХреНрд░рд╛рдордХ рдЖрдИрдПрдордУред
рдлрд┐рд░ рднреА, рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЧрдП рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп try{}catch(error err){} рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :stuck_out_tongue:

рдпрд╣ рднреА рджреЗрдЦреЗрдВ #27519 - #id/catch рддреНрд░реБрдЯрд┐ рдореЙрдбрд▓

рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдХреЛрд╢рд┐рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред

рдЪрдордХ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдбрд┐рдЬрд╛рдЗрди рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрдВрджрд░ рддрд░реАрдХрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЧреНрд▓рд┐рдм рдореЗрд░рд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдерд╛ред

рдореИрдВ рдЬреЛ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ try рдХрд╛ рдЗрд░рд╛рджрд╛ 100% рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рдкреНрд░рддрд┐рдорд╛рди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ try рджреНрд╡рд╛рд░рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдХреЙрд▓рд╕рд╛рдЗрдЯ-рдирд┐рд░реНрднрд░ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╣рдореЗрд╢рд╛ if err != nil { рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

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

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

check-handle рд╡рд┐рдЪрд╛рд░ рдиреЗ рдЖрдкрдХреЛ рдПрдХ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдерд╛ред

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

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

func handler(err *error, handle func(error) error) {
  // nil handle is treated as the identity
  if *err != nil && handle != nil {
    *err = handle(*err)
  }
}

рдЬрд┐рд╕реЗ рдЖрдк рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ

defer handler(&err, func(err error) error {
  if errors.Is(err, io.EOF) {
    return nil
  }
  return fmt.Errorf("oops: %w", err)
})

рдЖрдк handler рдХреЛ try рдХреА рддрд░рд╣ рдПрдХ рдЕрд░реНрдз-рдЬрд╛рджреБрдИ рдмрд┐рд▓рд┐рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

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

defer handler(func(err error) error {
  if errors.Is(err, io.EOF) {
    return nil
  }
  return fmt.Errorf("oops: %w", err)
})

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

рдЪреВрдВрдХрд┐ рдпрд╣ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рднреА рдХреЛрдИ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдИ рдЬрд╛ рд░рд╣реА рдереА, рддреЛ рдпрд╣ handle func рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдЗрд╕реЗ try рдХреЗ рдмрд┐рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рдмрдирд╛ рджреЗрддрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рдереЗ

defer handler(wrapErrWithPackageName)

рд╢реАрд░реНрд╖ рдкрд░ fmt.Errorf("mypkg: %w", err) рд╕рдм рдХреБрдЫред

рдпрд╣ рдЖрдкрдХреЛ рдмрд╣реБрдд рдкреБрд░рд╛рдиреЗ check / handle рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ (рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ) рд╕реНрдердЧрд┐рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ err рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП try рдХреА рддрд░рд╣ рдпрд╣ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реАрдзрд╛ рдореИрдХреНрд░реЛ рд╣реИ рдЬрд┐рд╕реЗ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдордиреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдореЗрд░рд╛ рдмреБрд░рд╛, рддреБрдо рд╕рд╣реА рд╣реЛред

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

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

рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде try() рдСрдЯреЛ-рд░реИрдк рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ xerrors errors #$ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ try() рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдирд╣реАрдВ? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рд╢рд╛рдпрдж рдЗрддрдирд╛ рд╣реА рдХрд╛рдлреА рд╣реЛрдЧрд╛

рдпрджрд┐ рд▓рдХреНрд╖реНрдп рд╣реИрдВ (рдкрдврд╝рдирд╛ https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md):

  • рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдЦрддреНрдо рдХрд░реЗрдВ
  • рдиреНрдпреВрдирддрдо рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди
  • "рд╕рдмрд╕реЗ рдЖрдо рдкрд░рд┐рджреГрд╢реНрдп" рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛
  • рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рдирд╛

рдореИрдВ рд╕реБрдЭрд╛рд╡ рд▓реЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдХреЛрдг рджреЗрдВ рдФрд░ рдХреЛрдб рдХреА рд╕рднреА рдЕрд░рдмреЛрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП "рдЫреЛрдЯреЗ рдХрджрдо" рдХреЛрдб рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рд╕реБрдЭрд╛рдП рдЧрдП рдХреЗ рдмрдЬрд╛рдп:

func printSum(a, b string) error {
        defer fmt.HandleErrorf(&err, "sum %s %s: %v", a,b, err) 
        x := try(strconv.Atoi(a))
        y := try(strconv.Atoi(b))
        fmt.Println("result:", x + y)
        return nil
}

рд╡реЗ рдХреИрди:

func printSum(a, b string) error {
        var err ErrHandler{HandleFunc : twoStringsErr("printSum",a,b)} 
        x, err.Error := strconv.Atoi(a)
        y,err.Error := strconv.Atoi(b)
        fmt.Println("result:", x + y)
        return nil
}

рд╣рдореЗрдВ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рд╣реЛрдЧрд╛?
twoStringsErr рдХреЛ рдкреНрд░рд┐рдВрдЯрд╕рдо, рдпрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЗрдирд▓рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 2 рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде) - рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╣реА рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ func рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рд╕рдордп
рдЙрд╕реА рддрд░рд╣, рдореИрдВ ErrHandler рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

type ioErrHandler ErrHandler
func (i ErrHandler) Handle() ...{

}

рдпрд╛

type parseErrHandler ErrHandler
func (p parseErrHandler) Handle() ...{

}

рдпрд╛

type str2IntErrHandler ErrHandler
func (s str2IntErrHandler) Handle() ...{

}

рдФрд░ рдЗрд╕реЗ рдореЗрд░реЗ рдореЗрд░реЗ рдХреЛрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

func printSum(a, b string) error {
        var pErr str2IntErrHandler 
        x, err.Error := strconv.Atoi(a)
        y,err.Error := strconv.Atoi(b)
        fmt.Println("result:", x + y)
        return nil
}

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

func (s str2IntErrHandler) Handle() bool{
   **return false**
}

рдЬреЛ рдХреЙрд▓рд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдХреЛ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрдЬрд╛рдп рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛

рдФрд░ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

func printSum(a, b string) error {
        var pErr str2IntErrHandler 
        var oErr overflowError 
        x, err.Error := strconv.Atoi(a)
        y,err.Error := strconv.Atoi(b)
        fmt.Println("result:", x + y)
        totalAsByte,oErr := sumBytes(x,y)
        sunAsByte,oErr := subtractBytes(x,y)
        return nil
}

рдЖрджрд┐ред

рдлрд┐рд░ рд╕реЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ

  • рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдЦрддреНрдо рдХрд░реЗрдВ - рдХрд┐рдпрд╛ рдЧрдпрд╛
  • рдиреНрдпреВрдирддрдо рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди - рд╣реЛ рдЧрдпрд╛
  • "рд╕рдмрд╕реЗ рдЖрдо рдкрд░рд┐рджреГрд╢реНрдп" рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ - рд╕реБрдЭрд╛рдП рдЧрдП IMO рд╕реЗ рдЕрдзрд┐рдХ
  • рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рдирд╛ - рд╕реЛрди
    рдкреНрд▓рд╕ - рд╕реЗ рдЖрд╕рд╛рди рдХреЛрдб рдорд╛рдЗрдЧреНрд░реЗрд╢рди
x, err := strconv.Atoi(a)

рдкреНрд░рддрд┐

x, err.Error := strconv.Atoi(a)

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ (рдЖрдИрдПрдордУ, рдлрд┐рд░ рд╕реЗ)

@guybrand рдЖрдк рдЗрд╕ рдЖрд╡рд░реНрддреА рд╡рд┐рд╖рдп (рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ) рдХреЗ рдирд╡реАрдирддрдо рдЕрдиреБрдпрд╛рдпреА рд╣реИрдВред

рджреЗрдЦреЗрдВ https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes

@guybrand рдпрд╣ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ @griesemer рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХреЗред

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

@рдЕрдЪреНрдЫреА рд╢рд░рд╛рдм

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

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

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

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

рдЕрдЧрд░ рдРрд╕рд╛ рдкрдврд╝рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдХрд╣рдирд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдпрд╣ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ try рдмреЗрдХрд╛рд░ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ KISS рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрддреБрд▓рди рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЕрд╕реНрдкрд╖реНрдЯ рдерд╛ред

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

0) рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдкрд░, @rasky , @adg , @eandre , @dpinela , рдФрд░ рдЕрдиреНрдп рдиреЗ try рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рд╕рд░рд▓реАрдХрд░рдг рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЦреБрд╢реА рд╡реНрдпрдХреНрдд рдХреАред

1) рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд┐рдВрддрд╛ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ try рдЕрдЪреНрдЫреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╢реИрд▓реА рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп "рддреНрд╡рд░рд┐рдд рдирд┐рдХрд╛рд╕" рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИред ( @agnivade , @peterbourgon , @politician , @a8m , @eandre , @prologic , @kungfusheep , @cpuguy , рдФрд░ рдЕрдиреНрдп рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдЪрд┐рдВрддрд╛ рд╡реНрдпрдХреНрдд рдХреА рд╣реИред)

2) рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдмрд┐рд▓реНрдЯ-рдЗрди рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ return рдЫреБрдкрд╛рддрд╛ рд╣реИред рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред ( @sheerun , @Redundancy , @dolmen , @komuw , @RobertGrantEllis , @elagergren-spideroak)ред try рдХреЛ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (@peterbourgon), рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдРрд╕реЗ рднрд╛рд╡реЛрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред @natefinch рдЪрд┐рдВрддрд┐рдд рд╣реИ рдХрд┐ try рдЗрд╕реЗ "рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбрдВрдк рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди" рдмрдирд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдРрд╕рд╛ рдЬрд┐рд╕реЗ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдЧреЛ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, try рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП IDE рд╕рдорд░реНрдерди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ (@dominikh); try рдХреЛ "рдЕрдкрдиреЗ рджрдо рдкрд░ рдЦрдбрд╝рд╛ рд╣реЛрдирд╛" рдЪрд╛рд╣рд┐рдПред

3) рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯ if рдмрдпрд╛рдиреЛрдВ рдХреА рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдЗрд╕рд╕реЗ рдЦреБрд╢ рд╣реИрдВ ( @bitfield , @marwan-at-work, @natefinch)ред рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ (@gbbr); рдФрд░ рд╕реНрдкрд╖реНрдЯ if рдХрдерди рдирд┐рд╣рд┐рдд return ( @DavexPro , @hmage , @prologic , @natefinch) рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВред
рдЙрд╕реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, @mattn рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ "рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрд╛рдзреНрдпрдХрд╛рд░реА" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИ try - рдХреЛрдб рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИред

4) try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдб рдбреАрдмрдЧ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рдПрдЧрд╛; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, try рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рд╡рд╛рдкрд╕ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХреЗ ( @deanveloper , @typeless , @networkimprov , рдЕрдиреНрдп)ред

5) рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди ( @buchanae , @adg) рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд┐рдВрддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдпрд╛ рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рд╣реИрдВ:

6) рдХреБрдЫ рдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ (@beoran) рдпрд╛ try ( @unexge , @a8m , @eandre , @gotwarlost) рдХреЛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдЪреНрдЫреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

7) @pierrec рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ gofmt try рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЙрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ gofmt рдХреЛ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдПрдХ рд▓рд╛рдЗрди (@zeebo) рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

8) @ рдорд╛рд░рд╡рд╛рди-рдПрдЯ-рд╡рд░реНрдХ рдХрд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ try рдмрд╕ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕реЗ try рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрджрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЧреЛ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд╣рд┐рдд рдмрдирд╛рдХрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ "рд╕реНрд╡рдпрдВ" рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓рдХреНрд╖реНрдп (рдЙрдЪрд┐рдд) рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рд░рд▓ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рдмрдирд╛рдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (@cpuguy)ред

9) рдЕрдВрдд рдореЗрдВ, рдХреБрдЫ рд▓реЛрдЧ try ( @beoran , @HiImJC , @dolmen) рдирд╛рдо рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ ? ( @twisted1919 , @leaxoy , рдЕрдиреНрдп) рдЬреИрд╕реЗ рдкреНрд░рддреАрдХ рдХреЛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред .

рдЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ (рддрджрдиреБрд╕рд╛рд░ рдХреНрд░рдорд╛рдВрдХрд┐рдд):

0) рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! :-)

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

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

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

4) рдбрд┐рдмрдЧрд┐рдВрдЧ рдмрд┐рдВрджреБ рдПрдХ рд╡реИрдз рдЪрд┐рдВрддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ return рдХреЗ рдмреАрдЪ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ try рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ if рдХрдерди рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

5) рдирд╛рдорд╛рдВрдХрд┐рдд рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп: рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рд╣реИ рддреЛ рд╣рдо рдПрдХ рдЕрдЪреНрдЫреЗ рд╕реНрдерд╛рди рдкрд░ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

6) рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВрдбрд▓рд░ рддрд░реНрдХ try : рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЗрд╕ рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдбрд┐рдЬрд╝рд╛рдЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВред

7) gofmt рдХрд╛ рдЙрдкрдпреЛрдЧ $ try рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рддрд╛рдХрд┐ рд╡реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рджреГрд╢реНрдпрдорд╛рди рд╣реЛрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рд╡реНрдпрдВрдЬрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ try рдХреЗ рдХреБрдЫ рд▓рд╛рднреЛрдВ рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

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

9) рдХреНрдпрд╛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рдордп рдирд╛рдо рдХреЛ рдмрд╛рдЗрдХ-рд╢реЗрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдЕрдиреНрдп рд╕рднреА рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдирд╛рдо рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдмреЗрд╣рддрд░ рд╕рдордп рд╣реЛрддрд╛ рд╣реИред

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

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

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

func try(t1 T1, t1 T2, тАж tn Tn, te error) (T1, T2, тАж Tn)

рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

func try(t1 T1, t2 T2, тАж tn Tn, te error) (T1, T2, тАж Tn)

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

рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдирдореВрдирд╛ рд╕реЗрдЯ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд░реНрдерд┐рдд рдПрдХ рддреНрд╡рд░рд┐рдд рдЯрд┐рдкреНрдкрдгреА:

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

рдЕрдЧрд░ рдпрд╣ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХреА рдЬрд╛ рд░рд╣реА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ" рдХреЗрд╡рд▓ ~ 60k рдПрд╕рдПрд▓рдУрд╕реА рдХреА рдХреБрд▓ рджрд░реНрдЬрдиреЛрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдУрдкрди рд╕реЛрд░реНрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдореЗрд░реЗ рдХреЛрдб рдХрд╛ ~ 1.4% рд╣реИред

рдЙрддреНрд╕реБрдХ рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдЖрдБрдХрдбрд╝реЗ рд╣реИрдВ?

рдЧреЛ рдЬреИрд╕реЗ рдмрд╣реБрдд рдмрдбрд╝реЗ рдХреЛрдбрдмреЗрд╕ рдкрд░, рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд▓рдЧрднрдЧ ~1.6M SLOC, рдпрд╣ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рдЧрднрдЧ ~0.5% рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ if err != nil рдЬреИрд╕реА рд▓рд╛рдЗрдиреЗрдВ рд╣реЛрддреА рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Go 2 рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рд╣реИ?

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

  1. @pierrec рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ gofmt рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рднрд╛рд╡реЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
    рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдПрдХ рдкрдВрдХреНрддрд┐ (@zeebo) рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдердиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gofmt рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдХреЛрдИ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
  1. gofmt рдХрд╛ рдЙрдкрдпреЛрдЧ $# try рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рддрд╛рдХрд┐ рд╡реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рджреГрд╢реНрдпрдорд╛рди рд╣реЛрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡реНрдпрдВрдЬрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ try рдХреЗ рдХреБрдЫ рд▓рд╛рднреЛрдВ рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

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

@griesemer рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдпрджрд┐ рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрддреНрддрд░ рджреЗрдВ

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

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

@griesemer рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░реВрдВрдЧрд╛: https://www.reddit.com/r/golang/comments/bwvyhe /proposal_a_builtin_go_error_check_function_try/eq22bqa?utm_source=share&utm_medium=web2x

@zeebo рдПрдХ рд▓рд╛рдЗрди рдкрд░ gofmt рдкреНрд░рд╛рд░реВрдк if err != nil { return ...., err } рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд╕рдВрднрд╡рддрдГ рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ if рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, рд╕рднреА "рд▓рдШреБ" if рдХрдерди рдирд╣реАрдВ?

рдЙрд╕реА рддрд░реНрдЬ рдкрд░, try рдХреЗ рдЕрджреГрд╢реНрдп рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛рдПрдВ рдереАрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпреЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

рд╡рд░реНрддрдорд╛рди рд╢реИрд▓реА:

a, b, c, ... err := BusinessLogic(...)
if err != nil {
   return ..., err
}

рдПрдХ-рдкрдВрдХреНрддрд┐ if :

a, b, c, ... err := BusinessLogic(...)
if err != nil { return ..., err }

try рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдкрд░ (!):

a, b, c, ... err := BusinessLogic(...)
try(err)

try рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ:

a, b, c := try(BusinessLogic(...))

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

@ рдорд╛рд░рд╡рд╛рди-рдПрдЯ-рд╡рд░реНрдХ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдХрд░рдг рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЫреБрдкрд╛рддреЗ рд╣реИрдВ?

@dpinela

@guybrand рдпрд╣ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ @griesemer рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХреЗред

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

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

рдЗрд╕рд▓рд┐рдП рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ try(func()) рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрд╢рд╛ рдХреЙрд▓ рдХреЛ jnz рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛ рдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рдкрд╕реА рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

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

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@griesemer

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдХрд░рдг рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЫреБрдкрд╛рддреЗ рд╣реИрдВ?

рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд: рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ gopls рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ:

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

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

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

// user begins to write this function: 
func openFile(path string) ([]byte, error) {
  file, err := os.Open(path)
  defer file.Close()
  bts, err := ioutil.ReadAll(file)
  return bts, nil
}

рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯреВрд▓ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдХрд░ (рдЗрд╕реА рддрд░рд╣ gofmt/goimports рдЖрдорддреМрд░ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдФрд░ gopls рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рдмрдврд╝рд╛рдПрдВрдЧреЗ:

// user has triggered the tool (by saving the file, or code action)
func openFile(path string) ([]byte, error) {
  file, err := os.Open(path)
  if err != nil {
    return nil, fmt.Errorf("openFile: %w", err)
  }
  defer file.Close()
  bts, err := ioutil.ReadAll(file)
  if err != nil {
    return nil, fmt.Errorf("openFile: %w", err)
  }
  return bts, nil
}

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

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

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

try(DoSomething()) рдореБрдЭреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ, рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдХреЛрдб рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред try(err) , OTOH, рдереЛрдбрд╝рд╛ рд╣рдЯрдХрд░ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рд╢рдмреНрджрд╛рд░реНрде рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ: рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ? рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ, рдХреЛрдИ рддреНрд░реБрдЯрд┐ _test_ рдпрд╛ _check_ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди _trying_ рдХреЛрдИ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП try(err) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдпрджрд┐ try(DoSomething()) рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди err := DoSomething(); try(err) рдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдлрд┐рд░ рднреА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try(err) рдкреГрд╖реНрда рдкрд░ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдЬреЛ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдЬреАрдм рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдареЛрд╕ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдореИрдВ рдпрд╣ рдЕрд╡рд▓реЛрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

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

if err != nil { t.Fatal(err) }

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

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

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


рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

func foo() (err error) {
    src := try(getReader())
    if src != nil {
        n, err := src.Read(nil)
        if err == io.EOF {
            return nil
        }
        try(err)
        println(n)
    }
    return nil
}

рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ desugar рд╣реЛрдЧрд╛

func foo() (err error) {
    tsrc, te := getReader()
    if err != nil {
        err = te
        return
    }
    src := tsrc

    if src != nil {
        n, err := src.Read(nil)
        if err == io.EOF {
            return nil
        }

        terr := err
        if terr != nil {
            err = terr
            return
        }

        println(n)
    }
    return nil
}

рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ err рдирдЧреНрди рд╡рд╛рдкрд╕реА рдХреЗ рджреМрд░рд╛рди рдЫрд╛рдпрд╛рдВрдХрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реВрдХреНрд╖реНрдо рд╡рд┐рдлрд▓рддрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреБрдЫ рдЪреАрдиреА рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИред

@ рдорд╛рд░рд╡рд╛рди-рдПрдЯ-рд╡рд░реНрдХ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ:

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

рддреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рджрд┐рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред рддреЛ рдорд╕рд▓рд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╣реИ, рдкрдврд╝рдиреЗ рдХрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреВрд╕рд░рд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ - рдореЗрд░реЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реА рд╡рд░реНрддрдорд╛рди рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рдЗрд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рд╕реНрдХреНрд░реАрди рдкрд░ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЦреБрд╢ рдкрде рдХреЛ рдХреИрд╕реЗ рдмрд┐рдЦреЗрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдПрдХ рдирдЬрд╝рд░ред рдкреНрд░рднрд╛рд╡ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ I/O-рднрд╛рд░реА рдХреЛрдб рдореЗрдВ рдЙрдЪреНрдЪрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдорддреМрд░ рдкрд░ рд╣рд░ рджреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рдмреАрдЪ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ CopyFile рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг ~ 20 рд▓рд╛рдЗрдиреЗрдВ рд▓реЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдкрд╛рдВрдЪ рдЪрд░рдг рдХрд░рддрд╛ рд╣реИ: рдУрдкрди рд╕реЛрд░реНрд╕, рдбрд┐рдлрд░ рдХреНрд▓реЛрдЬ рд╕реЛрд░реНрд╕, рдУрдкрди рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рди, рдХреЙрдкреА рд╕реЛрд░реНрд╕ -> рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рди, рдХреНрд▓реЛрдЬ рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рдиред

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

рдореБрдЭреЗ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдкрд░ try рдкрд╕рдВрдж рд╣реИред
рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ handler func рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

func try(error, optional func(error)error)
func (p *pgStore) DoWork() error {
    tx, err := p.handle.Begin()
    try(err)

    handle := func(err error) error {
        tx.Rollback()
        return err
    }

    var res int64
    _, err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
    try(err, handle)

    _, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
    try(err, handle)

    return tx.Commit()
}

@zeebo : рдореИрдВрдиреЗ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рд╣реИрдВ рд╡реЗ 1:1 рдЕрдиреБрд╡рд╛рдж рд╣реИрдВред рдкрд╣рд▓рд╛ (рдкрд╛рд░рдВрдкрд░рд┐рдХ if ) рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдкрд╛рдпрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рджреВрд╕рд░реЛрдВ рдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрджрд┐ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг ( if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдХрдИ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди (рд░реИрдкрд┐рдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╣реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдХреЛрдИ рднреА рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП defer рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ if рдХреЛ try рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрдВ)ред рдпрджрд┐ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ (рдЬреЛ рдПрдХ рд╕рдВрдХреЗрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЪрд┐рдВрддрд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ), if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ред рд╣рд╛рдВ, рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рд╕рд╣реА рдЪреБрдирд╛рд╡ рдХреЛрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрд╡рд╛рдж рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдо "рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛" рдХреЗ рд▓рд┐рдП рдЧреЛ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм if - else - if рдЕрдиреБрдХреНрд░рдо рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрднреА-рдХрднреА switch рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШреЛрд╖рдгрд╛ var x int x := 0 рд╕реЗ рдмреЗрд╣рддрд░ рдЗрд░рд╛рджрд╛ рд╡реНрдпрдХреНрдд рдХрд░рддреА рд╣реИ, рдФрд░ рдЖрдЧреЗ рднреА (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рд░ рдХреЛрдИ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЦреБрд╢ рдирд╣реАрдВ рд╣реИ)ред

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

[рд╕рдВрдкрд╛рджрд┐рдд] рдкреБрдирд╢реНрдЪ: рдПрдХ рдмреЗрд╣рддрд░ рдЬрд╡рд╛рдм рд╣реЛрдЧрд╛: try рдПрдХ рдирдЧреНрди рд╡рд╛рдкрд╕реА рдирд╣реАрдВ рд╣реИ (рднрд▓реЗ рд╣реА рдкреБрдирд░реНрд▓реЗрдЦрди рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ)ред рдЖрдЦрд┐рд░рдХрд╛рд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ try рдПрдХ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ (рдпрд╛ рд╣реИ) рдЬреЛ nil рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛ рддреНрд░реБрдЯрд┐ рд╕реНрд░реЛрдд рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ (рд╕реНрд░реЛрдд рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЛ рддреНрд░реБрдЯрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдУрд╡рд░рд░рдЪрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдШрдмрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрд╣ рдмрд┐рд▓реНрдЯрд┐рди рдХреЛ рдЕрдзрд┐рдХ рдмрд╣реБрдореБрдЦреА рдмрдирд╛ рджреЗрдЧрд╛ (рдЬреИрд╕реЗ #32219 рдореЗрдВ рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛)

@pjebs рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝реЗрдВ (рдЬреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

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

func doSomething() (error, error, error, error, error) {
   ...
}
try(try(try(try(try(doSomething)))))

рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд▓реМрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп panic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд┐рдпрд╛ред

рдореИрдВ рдПрдХ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ:

рдареАрдХ рд╡рд╣реА рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЙрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдХрд┐ рдУрд╡рд░рд░рдЪрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП error ред

рдпрджрд┐ рдЗрд╕рдореЗрдВ error => рдкреИрдирд┐рдХ рдХрд╛ рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ
рдпрджрд┐ рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ => рдЖрддрдВрдХ ( MustXXX( ) рд╕рдореНрдореЗрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ)

рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдореВрд▓реА рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрдиред

@mattn , рдореБрдЭреЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЛрдЧ рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗред

@pjebs , рд╡рд╣ рд╢рдмреНрджрд╛рд░реНрде - рдШрдмрд░рд╛рд╣рдЯ рдЕрдЧрд░ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реИ - рдареАрдХ рд╡рд╣реА рд╣реИ рдЬреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреЙрдХреНрдЯрд░ https://github.com/golang/proposal/blob/master/design/32437-try-builtin рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдПрдордбреА # рдЪрд░реНрдЪрд╛ред

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

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

@pjebs рд╡рд╣ _exactly_ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкреВрд░реНрд╡ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдорд╛рдирд╛ рдерд╛ (рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ, рдбрд┐рдЬрд╝рд╛рдЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ рдЕрдиреБрднрд╛рдЧ, рдЪреМрдерд╛ рдЕрдиреБрдЪреНрдЫреЗрдж):

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

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

@griesemer рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред

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

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЪрд┐рдВрддрд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИред рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рджрд╛рд╡рд╛ рдХрд┐рдП рдЧрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдиреАрдЪреЗ рдПрдХ рдбреНрд░реЙрдкрдбрд╛рдЙрди рдореЗрдВ рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЙрджрд╛рд╣рд░рдг https://github.com/golang/go/issues/32437#issuecomment рдореЗрдВ - 499007288 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

func (c *Config) Build() error {
    pkgPath, err := c.load()
    if err != nil { return nil, errors.WithMessage(err, "load config dir") }

    b := bytes.NewBuffer(nil)
    err = templates.ExecuteTemplate(b, "main", c)
    if err != nil { return nil, errors.WithMessage(err, "execute main template") }

    buf, err := format.Source(b.Bytes())
    if err != nil { return nil, errors.WithMessage(err, "format main template") }

    target := fmt.Sprintf("%s.go", filename(pkgPath))
    err = ioutil.WriteFile(target, buf, 0644)
    if err != nil { return nil, errors.WithMessagef(err, "write file %s", target) }
    // ...
}

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдХреЗрдд рднреА рд╣реИ рдХрд┐ defer wrap(&err, "message: %v", err) рдмрдЧ рдХрд┐рддрдиреЗ рд╕реВрдХреНрд╖реНрдо рдереЗ рдФрд░ рдХреИрд╕реЗ рд╡реЗ рдЕрдиреБрднрд╡реА рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рднреА рдЯреНрд░рд┐рдк рдХрд░ рджреЗрддреЗ рдереЗред


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

@griesemer рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдЦрдВрдб рдкрдврд╝рд╛ рдЬрд┐рд╕рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ рдкрд░ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рдФрд░ рдЦрддрд░реЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рджреЗрдЦреА рдЧрдИред

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

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

file := try(os.Open("my_file.txt"), nil)

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рд╣реИ? рдШрдмрд░рд╛рд╣рдЯ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЗрд╕реЗ рдПрдХ рдЕрдиреБрдкрд╕реНрдерд┐рдд рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдЪрд╛рд╣рд┐рдП?

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

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╢реВрдиреНрдп рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ "рд░рджреНрдж" рд╣реИ? рдпрд╛ рд╕рдВрд▓рдЧреНрди рдХрд╛рд░реНрдп рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП?

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

func getOrCreateObject(obj *object) error {
    defaultObjectHandler := func(err error) error {
        if err == ObjectDoesNotExistErr {
            *obj = object{}
            return nil
        }
        return fmt.Errorf("getting or creating object: %v", err)
    }

    *obj = try(db.getObject(), defaultObjectHandler)
}

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

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

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

@velovix рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐-рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ nil рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛? рд╣рдореЗрдВ "рджреГрд╢реНрдп рд╕реБрд░рд╛рдЧ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

@griesemer рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ @velovix рд╡рд┐рдЪрд╛рд░ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди builtin рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдЧрд▓рддреА рдХреЛ рдШрдмрд░рд╛рд╣рдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдУрд╡рд░-рдЖрд░реНрдХрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рд╣реИ?

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

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

@pjebs

рддреНрд░реБрдЯрд┐-рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛? рд╣рдореЗрдВ "рджреГрд╢реНрдп рд╕реБрд░рд╛рдЧ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдпрд╣ рдЙрди рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ

  1. try рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдм рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдирдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рдЗрддрдирд╛ рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реИред

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

  1. рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдПрдХ рдЪрд┐рдВрддрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛:

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

рдПрдХ рд╕реНрдкрд╖реНрдЯ nil рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рднреВрд▓рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рддрд░реНрдХ рдЫреЛрдбрд╝рдХрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред

рд╕рд╢рд░реНрдд рд╡рд╛рдкрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЧреЗ рд╕реЛрдЪрддреЗ рд╣реБрдП рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ https://github.com/golang/go/issues/32437#issuecomment -498947603 рдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ
return if f, err := os.Open("/my/file/path"); err != nil
рдЧреЛ рдХреЗ рдореМрдЬреВрджрд╛ if рджрд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЕрдиреБрдкрд╛рд▓рди рд╣реЛрдЧрд╛ред

рдпрджрд┐ рд╣рдо return if рдХрдерди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдХрд┐
рдЬрдм рдЕрдВрддрд┐рдо рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдЬреИрд╕реЗ err != nil ) рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ,рдФрд░ return if рдХрдерди рдореЗрдВ рдШреЛрд╖рдгрд╛ рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░ error рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ,рддреЛ рдЕрдВрддрд┐рдо рдЪрд░ рдХрд╛ рдорд╛рди рд╕реНрд╡рддрдГ рд╣реА nil рдХреЗ рд╕рд╛рде рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рддреБрд▓рдирд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдлрд┐рд░ return if рдХрдерди рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
return if f, err := os.Open("my/file/path")

рдЬреЛ рд╕рд┐рдЧреНрдирд▓-рд╢реЛрд░ рдЕрдиреБрдкрд╛рдд рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ рдЬреЛ try рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд░ рд╣рдо return if рдХреЛ try рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрди рдЬрд╛рддрд╛ рд╣реИ
try f, err := os.Open("my/file/path")
рдпрд╣ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ try рдХреА рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ return if рд╕реЗ рдЕрдзрд┐рдХ try рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдЕрдХреНрд╕рд░ рдПрдХ рдмрдбрд╝реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рднреА рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрдХ рдХреЗ рднреАрддрд░ рдХреАрд╡рд░реНрдб return рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреАрдмрдЧ рд▓реЙрдЧрд┐рдВрдЧ рдбрд╛рд▓рдиреЗ рдХреА рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рдорджрдж рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред
рдЬрдм рддрдХ рд╣рдо return if рдХреЗ рд▓рд┐рдП return if body рдмреНрд▓реЙрдХ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ, рдЬреИрд╕реЗ
рдореВрд▓:

        return if f, err := os.Open("my/path") 

рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп:

-       return if f, err := os.Open("my/path") 
+       return if f, err := os.Open("my/path") {
+               fmt.Printf("DEBUG: os.Open: %s\n", err)
+       }

return if рдХреЗ рдмреЙрдбреА рдмреНрд▓реЙрдХ рдХрд╛ рдЕрд░реНрде рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕реЗ defer рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

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

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

@griesemer - IIUC, рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреЙрд▓рд╕рд╛рдЗрдЯ-рдирд┐рд░реНрднрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдпрджрд┐ рдХрдерди рдареАрдХ рд╣реИред рдЬрдмрдХрд┐, рдпрд╣ рдирдпрд╛ try рдлрд╝рдВрдХреНрд╢рди рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдПрдХрд╛рдзрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЪрд┐рдВрддрд╛ рдпрд╣ рдереА рдХрд┐, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ if err != nil { return err} рдХрд░рдирд╛ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд┐рдЫрд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрд┐рд╕рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрд╕рд╛рди-рд╡рд╛рдкрд╕реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@agnivade рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди defer рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рддрдВрддреНрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред рдЬреИрд╕реЗ рд╣реА рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддреНрд░реБрдЯрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдбреЗрдХреЛрд░реЗрд╢рди рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рддреНрд░рд╛ if рдХреЛ рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдХрдард┐рди рдмрдирд╛ рджреЗрддреА рд╣реИред рдпрд╣ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рд╕рдЬрд╛рд╡рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдпрд╛ рдЬрд╣рд╛рдВ рд╕рдЬрд╛рд╡рдЯ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдПрдХ рджреГрд╢реНрдп рдЙрдкрджреНрд░рд╡ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

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

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдХреИрдЪ рдлрдВрдХреНрд╢рди рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЕрдЪреНрдЫреА рдЬреЛрдбрд╝реА рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП:

func a() int {
  x := randInt()
  // let's assume that this is what recruiters should "fix" for us
  // or this happens in 3rd-party package.
  if x % 1337 != 0 {
    panic("not l33t enough")
  }
  return x
}

func b() error {
  // if a() panics, then x = 0, err = error{"not l33t enough"}
  x, err := catch(a())
  if err != nil {
    return err
  }
  sendSomewhereElse(x)
  return nil
}

// which could be simplified even further

func c() error {
  x := try(catch(a()))
  sendSomewhereElse(x)
  return nil
}

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, catch() recover() рдПрдХ рдЖрддрдВрдХ рдФрд░ return ..., panicValue рд╣реЛрдЧрд╛ред
рдмреЗрд╢рдХ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЛрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ func рд╣реИ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рднреА рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдкрд╛рд╕-рдереНрд░реВ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рдореВрд▓ рд░реВрдк рд╕реЗ, рдЖрдк рдХреИрдЪ () рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд () рдкреИрдирд┐рдХ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдордЬрд╝реЗрджрд╛рд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, 'рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рдл-рд╕реБрдерд░рд╛ рдкреНрд░рдпрд╛рд╕ () - рдХреИрдЪ () рдкреИрдЯрд░реНрди рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдкреВрд░реЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдЬрд╛рд╡рд╛ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЙрдбрд╝рд╛рдПрдЧрд╛ ( catch(Throwable) рдореЗрди + throws LiterallyAnything рдореЗрдВ)ред рдЖрдк рдХрд┐рд╕реА рдХреЗ рдЖрддрдВрдХ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдереАрдВред рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЧреЛ рдореЗрдВ рд▓рдЧрднрдЧ 6mln+ LoC рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред

@griesemer рдЪрд░реНрдЪрд╛ рдХреЗ рдкреБрдирд░реНрдХрдерди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

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

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

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

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

рдЕрдиреНрдп рдХреНрдпрд╛ рдЪрд┐рдВрддрд╛рдПрдБ рдереАрдВ? рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдЙрди рд╕рднреА рдХрд╛ рдЙрддреНрддрд░ рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

@griesemer

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

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

рдПрдХ рдФрд░ рддрд░реНрдХ рдпрд╣ рдерд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреА рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП defer ред

рдЬреИрд╕рд╛ рдХрд┐ @beoran рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣реИрдВрдбрд▓рд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╢реИрд▓реА рдореЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЬрдмрдХрд┐ рдореИрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬреАрддреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рддрдм рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд░рдгрдиреАрддрд┐ рдореЗрдВ рдкрд┐рд╡рдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдлрд┐рд░, рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ defer s рд╣реЛрдВрдЧреЗ рдФрд░ рдкрд╛рдардХ рдХреЛ рддрд░реНрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд╣рд╛рдВ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рд╣реИрдВрдбрд▓рд░ рддрд░реНрдХ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рджреЛрдиреЛрдВ рд╣реЛрдЧрд╛, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ _рд╕рд╛рдкреЗрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдп рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдЗрд╕реЗ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рдпрд╛рдиреА рдХреБрдЫ рдРрд╕рд╛:
a := try func(some)

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

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

рдореБрдЭреЗ рдпрд╣ рдЕрдЧрд╕реНрдд рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИред

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

  1. рд▓реЛрдЧреЛрдВ рдХреЛ рдирд╛рдорд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ
  2. рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:

рдЙрди рджреЛ рдЖрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЦрдВрдбрди рдХреНрд░рдорд╢рдГ рд╣реИ:

  1. "рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ [рдирд╛рдорд╛рдВрдХрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░] рдареАрдХ рдереЗ"
  2. "рдХреЛрдИ рднреА рдЖрдкрдХреЛ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ" / рдпрд╣ 100% рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛

рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИ (рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛)ред рд▓реЗрдХрд┐рди 2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд╕реНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рди рддреЛ tryf рдкреНрд░рддрд┐-рдкреНрд░рд╕реНрддрд╛рд╡ (рдЬрд┐рд╕реЗ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рджреЛ рдмрд╛рд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рди рд╣реА try(X, handlefn) рдкреНрд░рддрд┐-рдкреНрд░рд╕реНрддрд╛рд╡ (рдЬреЛ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛) рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереАред

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

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

  1. рд╡рд░реНрддрдорд╛рди рдореЗрдВ defer рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред defer рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдмреНрджрд┐рдХ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЕрд░реНрдерд╛рдд
defer func(...) {...}
defer packageName.functionName
  1. рдЬрдм рдШрдмрд░рд╛рд╣рдЯ рдпрд╛ рдЖрд╕реНрдердЧрд┐рдд рд╡рд╛рдкрд╕реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕реНрдердЧрди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреА рд╣реИ, рддреЛ рд╡реЗ рдЕрдкрдиреЗ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ

  2. try рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдиреЗ рджреЗрдВ

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

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

func errorfn() error {
    return errors.New("an error")
}


func f(fail bool) {
    defer func(err *error, a, b, c int) {
        fmt.Printf("a=%d b=%d c=%d\n", a, b, c)
    }
    if fail {
        try(errorfn, 1, 2, 3)
    }
}

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛:

f(false)        // prints "a=0 b=0 c=0"
f(true)         // prints "a=1 b=2 c=3"

https://github.com/golang/go/issues/32437#issuecomment -499309304 рдореЗрдВ @zeebo рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func (c *Config) Build() error {
    defer func(err *error, msg string, args ...interface{}) {
        if *err == nil || msg == "" {
            return
        }
        *err = errors.WithMessagef(err, msg, args...)
    }
    pkgPath := try(c.load(), "load config dir")

    b := bytes.NewBuffer(nil)
    try(templates.ExecuteTemplate(b, "main", c), "execute main template")

    buf := try(format.Source(b.Bytes()), "format main template")

    target := fmt.Sprintf("%s.go", filename(pkgPath))
    try(ioutil.WriteFile(target, buf, 0644), "write file %s", target)
    // ...
}

рдФрд░ ErrorHandlef рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛:

func HandleErrorf(err *error, format string, args ...interface{}) {
        if *err != nil && format != "" {
                *err = fmt.Errorf(format + ": %v", append(args, *err)...)
        }
}

fmt -рд╕реНрдЯрд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЦреАрдВрдЪреЗ рдмрд┐рдирд╛, рд╕рднреА рдХреЛ tryf рдХреЗ рдмрд╛рдж рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╛рдВрдЧ рд╡рд╛рд▓рд╛ рдореБрдлреНрдд рдореЗрдВ рджреЗрдЧрд╛ред

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ defer рдлрд╝рдВрдХреНрд╢рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдирдП рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡реЗ рд╣реИрдВ:

  1. рдкрд╛рд░реНрд╕рд░ рдХреЛ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд▓рдВрдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд┐рдЦрд╛рдПрдВ
  2. рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдмрджрд▓реЗрдВ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкреИрд░рд╛рдореАрдЯрд░ (рдХреЙрд▓ рдХреЗ рдмрдЬрд╛рдП) рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд▓реЗ рд╕рднреА рдбрд┐рдлрд░реНрд╕ рдХреЗ рд╕рдорд╛рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ
  3. рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдмрджрд▓реЗрдВ рдХрд┐ try defer рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ
  4. рдЙрдкрдпреБрдХреНрдд deferproc рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб (?) рдмрджрд▓реЗрдВ
  5. рдЕрдкрдиреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдЖрд╕реНрдердЧрд┐рдд рдХреЙрд▓ рдХреЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП try рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓реЗрдВ рдЬрдм рдпрд╣ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕реНрдердЧрд┐рдд рдХреЙрд▓ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред

check/handle рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрди рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рднреВрдорд┐ рджреЗрдЦрдХрд░ рд╕реБрдЦрдж рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдирд┐рд░рд╛рд╢ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдЗрддрдирд╛ рдзрдХреНрдХрд╛-рдореБрдХреНрдХреА рд╣реБрдИ рд╣реИред

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

рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:

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

  2. рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ try рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЗрд▓рддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдЕрдкрдирд╛ рдкрд╕рдВрджреАрджрд╛ рд╕рдорд╛рдзрд╛рди рдПрдХ рджреВрд╕рд░рд╛ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди (рд╢рд╛рдпрдж ptry рдпрд╛ must ) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрд╢рд╛ рдШрдмрд░рд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( main рд╕рд╣рд┐рдд)ред рдпрджреНрдпрдкрд┐ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ 'рдирд┐рдХрдЯ рдХреЙрд▓' рдерд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

  3. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ рдХрд┐ go try(f) рдпрд╛ defer try(f) рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рдереЗ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

  4. рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдЬреЛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рддрдХрдиреАрдХ рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА рдпрджрд┐ go fmt рдиреЗ рд╕рд┐рдВрдЧрд▓ рд▓рд╛рдЗрди if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд┐рдпрдо рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ _any_ рд╕рд┐рдВрдЧрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ if рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПрдЧреА рдЪрд╛рд╣реЗ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рдпрд╛ рдирд╣реАрдВред рдЕрд╕рд▓ рдореЗрдВ рдореИрдВ рдХрднреА рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдШреЛрд╖рдгрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд░реАрд░ рдХреЛ рдЙрд╕реА рдкрдВрдХреНрддрд┐ рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рдЬрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ

func myfunc()( err error){
try(thing())
defer func(){
err = errors.Wrap(err,"more context")
}()
}

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

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рд╕рд╛рджрдЧреА рдФрд░ "рдПрдХ рдХрд╛рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░реЗрдВ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИред рдореЗрд░реЗ GoAWK рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ - рдореЗрд░реЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ 100 if err != nil { return nil } рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВрдЧреА, рдФрд░ рдпрд╣ рдХрд╛рдлреА рдЫреЛрдЯреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╣реИред

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

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

рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред рдпрд╣ рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдЖрд░рдХреНрд╖рдг рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ: handle рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ defer рдХреА рдЧреИрд░-рд░реВрдврд╝рд┐рд╡рд╛рджреАрддрд╛ред

рдореИрдВ рджреЛ рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдКрдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдВрджрд░реНрдн-рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдкрд╛рда рдХреЛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдпрд╣ _does_ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╕реНрдЯреИрдХ рдлрд╝реНрд░реЗрдо рддреНрд░реБрдЯрд┐-рдЕрдиреБрд░реЗрдЦрдг рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ: https://play.golang.org/p /YL1MoqR08E6

рджреВрд╕рд░реЗ, try рдпрдХреАрдирди https://github.com/golang/go/issues/19642 рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИред рдЙрд╕ рдореБрджреНрджреЗ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╣рд░ рдмрд╛рд░ рд╕рднреА рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓рдВрдмреЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдп рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред

func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) (buf []byte, offset, length uint32, err error) {
    xx := int(x)
    if f.NumGlyphs() <= xx {
        try(ErrNotFound)
    }
    i := f.cached.locations[xx+0]
    j := f.cached.locations[xx+1]
    if j < i {
        try(errInvalidGlyphDataLength)
    }
    if j-i > maxGlyphDataLength {
        try(errUnsupportedGlyphDataLength)
    }
    buf, err = b.view(&f.src, int(i), int(j-i))
    return buf, i, j - i, err
}

рдореБрдЭреЗ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдкрд╕рдВрдж рд╣реИред

рдФрд░ рдореЗрд░рд╛ рдПрдХ рдирд┐рд╡реЗрджрди рд╣реИред

make рдХреА рддрд░рд╣, рдХреНрдпрд╛ рд╣рдо try рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ

  • рдХреЛрд╢рд┐рд╢ (рдПрдл):
    рдКрдкрд░реЛрдХреНрдд рдЕрдиреБрд╕рд╛рд░ред
    рдПрдХ рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐ рдорд╛рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ (рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ)ред
    рд╕рдмрд╕реЗ рдЖрдо рдЙрдкрдпреЛрдЧ рдореЙрдбрд▓
  • рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдПрдл, рдбреЛрдкреИрдирд┐рдХ рдмреВрд▓):
    рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ doPanic рд╣реИ, рддреЛ рд▓реМрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдШрдмрд░рд╛рдПрдВ (рдЧрд▓рддреА)ред
    рдЗрд╕ рдореЛрдб рдореЗрдВ, рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐ рдорд╛рди рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
  • рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдПрдл, рдПрдлрдПрди):
    рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ fn(err) рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред
    рдЗрд╕ рдореЛрдб рдореЗрдВ, рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐ рдорд╛рди рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

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

  • рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ - рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдШрдмрд░рд╛рдирд╛ рд╣реИ рдпрд╛ рддреНрд░реБрдЯрд┐ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рд╣реИ
  • рд╕рдВрджрд░реНрдн-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдХреЛрдИ рд╣реИрдВрдбрд▓рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд╣реАрдВ)
  • рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдЪрд░ рдирд╣реАрдВ рд╣реИ
  • (...) рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

рдЬрдмрдХрд┐ рджреЛрд╣рд░рд╛рд╡ if err !=nil { return ... err } рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмрджрд╕реВрд░рдд рд╣рдХрд▓рд╛рдирд╛ рд╣реИ, рдореИрдВ рдЙрдирдХреЗ рд╕рд╛рде рд╣реВрдВ
рдЬреЛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ try() рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдардиреАрдпрддрд╛ рдкрд░ рдмрд╣реБрдд рдХрдо рд╣реИ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред
рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред

рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдлрд╛рдИ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддреЛ try(err) рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ
if err !=nil { return err } :

file, err := os.Open("file.go")
try(err)

рдХреЗ рд▓рд┐рдпреЗ

file, err := os.Open("file.go")
if err != nil {
   return err
}

рдФрд░ рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╣реИрдВ, рддреЛ try(err) return t1, ... tn, err . рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЬрд╣рд╛рдВ t1, ... tn рдЕрдиреНрдп рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рд╣реИрдВред

рдпрд╣ рд╕реБрдЭрд╛рд╡ рдирд╛рдорд┐рдд рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ,
рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ, рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдпред

рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реЛрдЧрд╛:

file, try(err) := os.Open("file.go")

рдпрд╛ рдФрд░ рднреА

file, err? := os.Open("file.go")

рдпрд╣ рдЕрдВрддрд┐рдо рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рд╣реИ (? рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ)ред

(рдпрд╣ рд╕реБрдЭрд╛рд╡ https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring-themes рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдмрд╛рд░-рдмрд╛рд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╖рдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЕрд▓рдЧ рд▓рдЧрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рдЪрд░рдг рдореЗрдВ рдерд╛ рдЬрдм рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВрдбрд▓ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрднреА рднреА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рдереАред рдХрд┐ рдПрдХ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред)

рдЗрд╕ рд╕рд╛рд╡рдзрд╛рди, рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЧреЛ рдЯреАрдо рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

@rogpeppe рдЯрд┐рдкреНрдкрдгреА рдЕрдЧрд░ try рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдХреЛ рдСрдЯреЛ-рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ, рдореИрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВред

@aarzilli - рддреЛ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо tryf рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдПрдХ рд╕реНрдердЧрд┐рдд рдЦрдВрдб рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ?

рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ

try(ioutil.WriteFile(target, buf, 0644), "write file %s", target)

рдФрд░ рдПрдХ defer рд╕рдорд╛рд░реЛрд╣ рдордд рд▓рд┐рдЦреЛ?

@agnivade

рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдореИрдВ (...) рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ defer рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ?

рдЯрд╛рдЗрдкрдЪреЗрдХ рддреНрд░реБрдЯрд┐ред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рднреА рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдФрд░ рд╣рдбрд╝рддрд╛рд▓ рд╣реИред

func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) (buf []byte, offset, length uint32, err error) {
    xx := int(x)
    if f.NumGlyphs() <= xx {
        try(ErrNotFound)
    }
    //...

рдореИрдВ return nil, 0, 0, ErrNotFound рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

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

return default(ErrNotFound)

рдХрдо рд╕реЗ рдХрдо рд╡рд╣ рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдкрдврд╝рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЖрдЗрдП рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП try рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рди рдХрд░реЗрдВред

@natefinch рдЕрдЧрд░ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ try рдмрд┐рд▓реНрдЯрд┐рди рдХреЛ $#$1 check #$ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ check(err) рд╣реЛрдЧрд╛ рдЬреЛ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рдкрдврд╝рддрд╛ рд╣реИ, рдЖрдИрдПрдордУред

рдЗрд╕реЗ рдПрдХ рддрд░рдл рд░рдЦрдХрд░, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ try(err) рд▓рд┐рдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рджреБрд░реБрдкрдпреЛрдЧ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рджреВрд╕рд░реА рдУрд░, рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реИ:

a, b := try(1, f(), err)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try рдХреЗ рд╕рд╛рде рдореЗрд░реА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ panic рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдКрдкрд░ рдЬрд╛рддрд╛ рд╣реИ ... рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдПрдХ рдмрдпрд╛рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЫреБрдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдХрд╣реАрдВ рдПрдХ рдмрдпрд╛рди рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реИред рдпрд╣ рд▓рдЧрднрдЧ рдЗрд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╕реЗ рднреА рдмрджрддрд░ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

@natefinch рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЖрддрдВрдХ рдХреА рддрд░рд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕реНрддрд░ рдКрдкрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЧрдиреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдБред рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ, рд░рд╕реНрдЯ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рд╕реЗ рд╢рд┐рдерд┐рд▓ рд░реВрдк рд╕реЗ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдПред try рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдирдкреИрдХ рдХрд░рддреА рд╣реИ рдФрд░ рдпрд╛ рддреЛ "рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо" рд▓реМрдЯрд╛рддреА рд╣реИ рдпрджрд┐ error != nil , рдпрд╛ рдпрджрд┐ error == nil рд╣реИ рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ T рднрд╛рдЧ рдХреЛ рдЕрдирдкреИрдХ рдХрд░реЗрдВред

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

@ugorji рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try(f, bool) рд╕рдВрд╕реНрдХрд░рдг #32219 рд╕реЗ must рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

@ugorji рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try(f, bool) рд╕рдВрд╕реНрдХрд░рдг #32219 рд╕реЗ must рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

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

рдЪреВрдВрдХрд┐ try() рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рджреБрдИ рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЗрд╕реЗ рдЙрд╕ рдореВрд▓реНрдп рдкрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдирд▓рд░реА (рд╢реВрдиреНрдп рддрд░реНрдХ) рдлреЙрд░реНрдо рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрд╣ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐, рджреГрд╖реНрдЯрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдердЧрд┐рдд рдмрдпрд╛рдиреЛрдВ рд╕реЗ рдЖрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

func foo() error {
  defer fmt.HandleErrorf(try(), "important foo context info")
  try(bar())
  try(baz())
  try(etc())
}

@ugorji
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try(f, bool) рдкрд░ рдмреВрд▓рд┐рдпрди рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рдпрд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред рдореБрдЭреЗ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рдкреИрдирд┐рдХ рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рддреАрд╕рд░реЗ рдмреБрд▓реЗрдЯ рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП try(f(), func(err error) { panic('at the disco'); }) , рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЫрд┐рдкреЗ рд╣реБрдП try(f(), true) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ

@ugorji
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try(f, bool) рдкрд░ рдмреВрд▓рд┐рдпрди рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рдпрд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред рдореБрдЭреЗ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рдкреИрдирд┐рдХ рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рддреАрд╕рд░реЗ рдмреБрд▓реЗрдЯ рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП try(f(), func(err error) { panic('at the disco'); }) , рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЫрд┐рдкреЗ рд╣реБрдП try(f(), true) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ

рдЖрдЧреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░, рдореИрдВ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЖрдкрдХреЗ рддрд░реНрдХ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдФрд░ рдпрд╣ рдЕрднреА рднреА рдПрдХ-рд▓рд╛рдЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рджрд┐рдЦрддрд╛ рд╣реИред

@ patrick-nyt рдЕрднреА рднреА https://github.com/golang/go/issues/32437#issuecomment -499533464 рдореЗрдВ рд╢реВрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕_ рдХрд╛ рдПрдХ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡рдХ рд╣реИред

рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЪреЗрдХ/рд╣реИрдВрдбрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ 13 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes

f, ?return := os.Open(...)
f, ?panic  := os.Open(...)

рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреЛ 1 рдХреА рддрд░рд╣ рдкрдврд╝рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ try() рдФрд░ check рдирд╣реАрдВред

try рдкрд░ рдПрдХ рдЖрдкрддреНрддрд┐ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдпреВрдирд░реА рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ ? рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ рддреЛ рд╡рд╛рдкрд╕реА рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдорд╛рдирдХ рдХреЛрдб рдирдореВрдирд╛ рд╣реИ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реНрдердЧрд┐рдд рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ):

func CopyFile(src, dst string) error {
    var err error // Don't need a named return because err is explicitly named
    defer deferred.Annotate(&err, "copy %s %s", src, dst)

    r, err := os.Open(src)
    err?
    defer deferred.AnnotatedExec(&err, r.Close)

    w, err := os.Create(dst)
    err?
    defer deferred.AnnotatedExec(&err, r.Close)

    defer deferred.Cond(&err, func(){ os.Remove(dst) })
    _, err = io.Copy(w, r)

    return err
}

рдкреАрдЬреАрд╕реНрдЯреЛрд░ рдЙрджрд╛рд╣рд░рдг:

func (p *pgStore) DoWork() error {
    tx, err := p.handle.Begin()
    err?

    defer deferred.Cond(&err, func(){ tx.Rollback() })

    var res int64 
    err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
    // tricky bit: this would not change the value of err 
    // but the deferred.Cond would still be triggered by err being set before
    deferred.Format(err, "insert table")?

    _, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
    deferred.Format(err, "insert table2")?

    return tx.Commit()
}

рдореБрдЭреЗ рдпрд╣ @jargv рд╕реЗ рдкрд╕рдВрдж рд╣реИ :

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

рд▓реЗрдХрд┐рди рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ try рдирд╛рдо рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдЬрд╛рджреВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, reterr рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд╣реЗрдВред

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

func (r *Request) write(w io.Writer, usingProxy bool, extraHeaders Header, waitForContinue func() bool) (err error) {
`

trace := httptrace.ContextClientTrace(r.Context())
if trace != nil && trace.WroteRequest != nil {
    defer func() {
        trace.WroteRequest(httptrace.WroteRequestInfo{
            Err: err,
        })
    }()
}

// Find the target host. Prefer the Host: header, but if that
// is not given, use the host from the request URL.
//
// Clean the host, in case it arrives with unexpected stuff in it.
host := cleanHost(r.Host)
if host == "" {
    if r.URL == nil {
        return errMissingHost
    }
    host = cleanHost(r.URL.Host)
}

// According to RFC 6874, an HTTP client, proxy, or other
// intermediary must remove any IPv6 zone identifier attached
// to an outgoing URI.
host = removeZone(host)

ruri := r.URL.RequestURI()
if usingProxy && r.URL.Scheme != "" && r.URL.Opaque == "" {
    ruri = r.URL.Scheme + "://" + host + ruri
} else if r.Method == "CONNECT" && r.URL.Path == "" {
    // CONNECT requests normally give just the host and port, not a full URL.
    ruri = host
    if r.URL.Opaque != "" {
        ruri = r.URL.Opaque
    }
}
if stringContainsCTLByte(ruri) {
    return errors.New("net/http: can't write control character in Request.URL")
}
// TODO: validate r.Method too? At least it's less likely to
// come from an attacker (more likely to be a constant in
// code).

// Wrap the writer in a bufio Writer if it's not already buffered.
// Don't always call NewWriter, as that forces a bytes.Buffer
// and other small bufio Writers to have a minimum 4k buffer
// size.
var bw *bufio.Writer
if _, ok := w.(io.ByteWriter); !ok {
    bw = bufio.NewWriter(w)
    w = bw
}

_, err = fmt.Fprintf(w, "%s %s HTTP/1.1\r\n", valueOrDefault(r.Method, "GET"), ruri)
if err != nil {
    return err
}

// Header lines
_, err = fmt.Fprintf(w, "Host: %s\r\n", host)
if err != nil {
    return err
}
if trace != nil && trace.WroteHeaderField != nil {
    trace.WroteHeaderField("Host", []string{host})
}

// Use the defaultUserAgent unless the Header contains one, which
// may be blank to not send the header.
userAgent := defaultUserAgent
if r.Header.has("User-Agent") {
    userAgent = r.Header.Get("User-Agent")
}
if userAgent != "" {
    _, err = fmt.Fprintf(w, "User-Agent: %s\r\n", userAgent)
    if err != nil {
        return err
    }
    if trace != nil && trace.WroteHeaderField != nil {
        trace.WroteHeaderField("User-Agent", []string{userAgent})
    }
}

// Process Body,ContentLength,Close,Trailer
tw, err := newTransferWriter(r)
if err != nil {
    return err
}
err = tw.writeHeader(w, trace)
if err != nil {
    return err
}

err = r.Header.writeSubset(w, reqWriteExcludeHeader, trace)
if err != nil {
    return err
}

if extraHeaders != nil {
    err = extraHeaders.write(w, trace)
    if err != nil {
        return err
    }
}

_, err = io.WriteString(w, "\r\n")
if err != nil {
    return err
}

if trace != nil && trace.WroteHeaders != nil {
    trace.WroteHeaders()
}

// Flush and wait for 100-continue if expected.
if waitForContinue != nil {
    if bw, ok := w.(*bufio.Writer); ok {
        err = bw.Flush()
        if err != nil {
            return err
        }
    }
    if trace != nil && trace.Wait100Continue != nil {
        trace.Wait100Continue()
    }
    if !waitForContinue() {
        r.closeBody()
        return nil
    }
}

if bw, ok := w.(*bufio.Writer); ok && tw.FlushHeaders {
    if err := bw.Flush(); err != nil {
        return err
    }
}

// Write body and trailer
err = tw.writeBody(w)
if err != nil {
    if tw.bodyReadError == err {
        err = requestBodyReadError{err}
    }
    return err
}

if bw != nil {
    return bw.Flush()
}
return nil

}
`

рдпрд╛ рдЬреИрд╕рд╛ рдХрд┐ pprof/profile/profile_test.go рдЬреИрд╕реЗ рд╕рдВрдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
`
func checkAggregation(prof *Profile, a *aggTest) рддреНрд░реБрдЯрд┐ {
// рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирдореВрдиреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред
рдХреБрд▓: = int64(0)

samples := make(map[string]bool)
for _, sample := range prof.Sample {
    tb := locationHash(sample)
    samples[tb] = true
    total += sample.Value[0]
}

if total != totalSamples {
    return fmt.Errorf("sample total %d, want %d", total, totalSamples)
}

// Check the number of unique sample locations
if a.rows != len(samples) {
    return fmt.Errorf("number of samples %d, want %d", len(samples), a.rows)
}

// Check that all mappings have the right detail flags.
for _, m := range prof.Mapping {
    if m.HasFunctions != a.function {
        return fmt.Errorf("unexpected mapping.HasFunctions %v, want %v", m.HasFunctions, a.function)
    }
    if m.HasFilenames != a.fileline {
        return fmt.Errorf("unexpected mapping.HasFilenames %v, want %v", m.HasFilenames, a.fileline)
    }
    if m.HasLineNumbers != a.fileline {
        return fmt.Errorf("unexpected mapping.HasLineNumbers %v, want %v", m.HasLineNumbers, a.fileline)
    }
    if m.HasInlineFrames != a.inlineFrame {
        return fmt.Errorf("unexpected mapping.HasInlineFrames %v, want %v", m.HasInlineFrames, a.inlineFrame)
    }
}

// Check that aggregation has removed finer resolution data.
for _, l := range prof.Location {
    if !a.inlineFrame && len(l.Line) > 1 {
        return fmt.Errorf("found %d lines on location %d, want 1", len(l.Line), l.ID)
    }

    for _, ln := range l.Line {
        if !a.fileline && (ln.Function.Filename != "" || ln.Line != 0) {
            return fmt.Errorf("found line %s:%d on location %d, want :0",
                ln.Function.Filename, ln.Line, l.ID)
        }
        if !a.function && (ln.Function.Name != "") {
            return fmt.Errorf(`found file %s location %d, want ""`,
                ln.Function.Name, l.ID)
        }
    }
}

return nil

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

рдХреНрдпрд╛ рдХреЛрдИ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ try() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреЗ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ?

рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред

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

  • рдкрд░рд┐рдгрд╛рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг
  • рдПрдХ рдбрд┐рдлрд░ рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рдгрд╛рдо рдорд╛рди (рдЖрдорддреМрд░ рдкрд░ рдПрдХ error ) рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛

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

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

рддреЛ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИ

func f(err error, t1 T1, t2 T2, ..., tn Tn) error

рдлрд┐рд░, рдПрдХ рдлрд╝рдВрдХреНрд╢рди g рдореЗрдВ рдЬрд╣рд╛рдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ error рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛рдиреА, рдХреЛрдИ рднреА рдлрд╝рдВрдХреНрд╢рди рдЬрд╣рд╛рдВ try рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), f рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func g() (R0, R0, ..., error) {
    defer f(t0, t1, ..., tn) // err is implicit
}

рддреНрд░реБрдЯрд┐-рд╕реНрдердЧрд┐рдд рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВ:

  1. f рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХреЙрд▓ рдХреЛ f рдХреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде g f рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
  2. f рдХреЗрд╡рд▓ рддрднреА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рди рд╣реЛ
  3. f рдХрд╛ рдкрд░рд┐рдгрд╛рдо g . рдХреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ

рддреЛ рдкреБрд░рд╛рдиреЗ рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреЙрдХ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд░рд░-рдбреЗрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

func printSum(a, b string) error {
    defer func(err error) error {
        return fmt.Errorf("printSum(%q + %q): %v", a, b, err)
    }()
    x := try(strconv.Atoi(a))
    y := try(strconv.Atoi(b))
    fmt.Println("result:", x+y)
    return nil
}

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ HandleErrorf рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛:

func printSum(a, b string) error {
    defer handleErrorf("printSum(%q + %q)", a, b)
    x := try(strconv.Atoi(a))
    y := try(strconv.Atoi(b))
    fmt.Println("result:", x+y)
    return nil
}

func handleErrorf(err error, format string, args ...interface{}) error {
    return fmt.Errorf(format+": %v", append(args, err)...)
}

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

func(error, ...error) error

рдпрд╣ рдХрд╣рдирд╛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЧреИрд░-рддреНрд░реБрдЯрд┐-рд╕реНрдердЧрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИ)ред


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

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

// GetMulti retrieves multiple files through the cache at once and returns its
// results as a slice parallel to the input.
func (c *FileCache) GetMulti(keys []string) (_ []*File, err error) {
    files := make([]*file, len(keys))

    defer func() {
        if err != nil {
            // Return any successfully retrieved files.
            for _, f := range files {
                if f != nil {
                    c.put(f)
                }
            }
        }
    }()

    // ...
}

рддреНрд░реБрдЯрд┐-рд╕реНрдердЧрд┐рдд рдХреЗ рд╕рд╛рде, рдпрд╣ рдмрди рдЬрд╛рддрд╛ рд╣реИ:

// GetMulti retrieves multiple files through the cache at once and returns its
// results as a slice parallel to the input.
func (c *FileCache) GetMulti(keys []string) ([]*File, error) {
    files := make([]*file, len(keys))

    defer func(err error) error {
        // Return any successfully retrieved files.
        for _, f := range files {
            if f != nil {
                c.put(f)
            }
        }
        return err
    }()

    // ...
}

@beoran рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЬреЗрдирд░рд┐рдХ рдпрд╣рд╛рдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рдХреГрдкрдпрд╛ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдкрдврд╝реЗрдВред

@velovix рдХреЗ 2-рддрд░реНрдХ try рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд┐рд╕реА рдФрд░ рдХрд╛ рджреБрдГрд╕реНрд╡рдкреНрди рд╣реИред

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

(рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд░рдЦрдирд╛ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╣рдо try рдХреЛ рдЕрдкрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрднреА рднреА try рдХреА рдУрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред -рд╕рдВрдЧрдд рддрд░реАрдХрд╛ - рдХрдо рд╕реЗ рдХрдо рдЕрдЧрд░ рд╣реИрдВрдбрд▓рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рд▓реЗрдХрд┐рди рдЪрд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдХрджрдо рдЙрдард╛рддреЗ рд╣реИрдВред)

@arzilli рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try _discourages_ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ (рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░рдг рд╕реЗ if рдХреЗ рд╕рд╛рде рднреА рдирд┐рд░рд╛рд╢ рд╣реИрдВ); рдпрд╣ рд╣реИ рдХрд┐ try рдЗрд╕реЗ _рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рд╡рд╛рдкрд╕: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╢реАрдирд░реА рдкреЗрд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред defer try рд▓рд┐рдП рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ defer рдкрд░рд┐рд╡рд░реНрддрди рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдлрд╛рдпрджреЗрдордВрдж рди рд╣реЛрдВред рд╕рд╛рде рд╣реА, рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ defer рдХреЛ try рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрди рджреЛрдиреЛрдВ рддрдВрддреНрд░реЛрдВ рдХреЛ рдХрдо рдСрд░реНрдереЛрдЧреЛрдирд▓ рдмрдирд╛рддрд╛ рд╣реИ; рдХреБрдЫ рд╣рдо рдмрдЪрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рдХреЛ defer рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╡реЗ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ: рд▓реЛрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рди рд╕рдЬрд╛рдиреЗ рдХреА рдУрд░ рдЭреБрдХреЗрдВрдЧреЗред

(рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд░рдЦрдирд╛ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╣рдо рдХреЛрд╢рд┐рд╢ рдХреЛ рдЕрдкрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрднреА рднреА рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ-рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХрдо рд╕реЗ рдХрдо рдЕрдЧрд░ рд╣реИрдВрдбрд▓рд░ рд╣реИ рд╡реИрдХрд▓реНрдкрд┐рдХред рд▓реЗрдХрд┐рди рдЪрд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдХрджрдо рдЙрдард╛рддреЗ рд╣реИрдВред)

рдЬрд╝рд░реВрд░, рд╢рд╛рдпрдж рдПрдХ рдмрд╣реБ-рдЪрд░рдгреАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВрдбрд▓рд░ рддрд░реНрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЯреВрд▓рд┐рдВрдЧ рдХреЛ рд▓реЗрдЦрдХ рдХреЛ errcheck рдЯреВрд▓ рдХреЗ рд╕рдорд╛рди рднрд╛рд╡рдирд╛ рд╕реЗ рд╣реИрдВрдбрд▓ рди рдХрд┐рдП рдЧрдП try рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рднрд▓реЗ рд╣реА, рдореИрдВ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ!

@alanfo рдЖрдкрдХреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:

1) рдпрджрд┐ try рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо defer рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдЬрд╛ рд╕рдХреЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдЪреНрдЫреЗ рд╣реИрдВред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдирд╛рдордХрд░рдг рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрдВрддреНрд░ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рдкреВрд░реНрд╡ рдШреЛрд╖рд┐рдд рдЪрд░ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо рд╣реИ (рдЗрд╕реЗ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВ рдЬрд┐рд╕рдиреЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ try рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛)ред рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЗрд╕рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддрдВрддреНрд░ рд╣реИ, рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд╛рдо рджреЗрдирд╛ рд╣реИред
2) try рдФрд░ рдкрд░реАрдХреНрд╖рдг: рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
3) рдЗрд╕реЗ рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
4) рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реИред

@benhoyt рдЖрдкрдХреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

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

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

@ugorji рдЖрдкрдХреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП try рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ func (error) error рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдШрдмрд░рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ-рдкрдВрдХреНрддрд┐ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:

func doPanic(err error) error { panic(err) }

try рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рд╕рд░рд▓ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

@ рдкреИрдЯреНрд░рд┐рдХ-рдирд╛рдЗрдЯ рдЖрдк рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ:

file, err := os.Open("file.go")
try(err)

рдореМрдЬреВрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

@dpinela , @ugorji рдХреГрдкрдпрд╛ must рдмрдирд╛рдо try рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреА рдкрдврд╝реЗрдВред try рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред must рдЖрд░рдВрднреАрдХрд░рдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп "рдкреИрдЯрд░реНрди" рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ "рдареАрдХ" рдХрд░рдиреЗ рдХреА рдХреЛрдИ рддрддреНрдХрд╛рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@jargv рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИ (рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдпрд╣рд╛рдВ рднреА рджреЗрдЦреЗрдВ)ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:

  • try(x) рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ
  • try() рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП *error $ рд▓реМрдЯрд╛рддрд╛ рд╣реИ

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ w/o рдЗрд╕реЗ рдирд╛рдо рджреЗрдирд╛ред

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

https://github.com/golang/go/issues/32437#issuecomment -499320588 рдХреЗ рдЕрдиреБрд╕рд╛рд░:

func doPanic (рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐) рддреНрд░реБрдЯрд┐ {рдЖрддрдВрдХ (рдЧрд▓рддреА)}

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рд░реЛрд╣ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЗрд╕реЗ "рдмрд┐рд▓реНрдЯрд┐рди" (рдпрд╛ рдорд╛рдирдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдЬреИрд╕реЗ errors ) рдореЗрдВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

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

рд╣рд╛рдВ, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╣рд▓рд╛ рдХрджрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ
рдпрд╣ рдЦреБрдж рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдЕрдм рдЦрдбрд╝рд╛ рд╣реИред

рджреА, рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╢рд╛рдпрдж рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,
рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдкреНрд░рддрд┐рднрд╛рдЧреА рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЦреБрд╢ рдирд╣реАрдВ рд╣реИрдВ
рдпрд╣ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд╕рд╣рдорддрд┐ рдХреА рдХрдореА рд╣реИ...

рдСрдк рд╡реАрдЖрд░ 7 рдЬреВрдиред 2019 01:04 рд╢реНрд░рд╛рдл рдкреАрдЬреЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com :

рдПрд╕реНрдкрд░ #32437 (рдЯрд┐рдкреНрдкрдгреА)
https://github.com/golang/go/issues/32437#issuecomment-499320588 :

func doPanic (рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐) рддреНрд░реБрдЯрд┐ {рдЖрддрдВрдХ (рдЧрд▓рддреА)}

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

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=AAARM6OOOLLYO5ZCE6VVL2TPZGJWRA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJ69WSN рдореБрджреНрджрд╛
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAARM6K5AOR2DES4QDTNLSTPZGJWRANCNFSM4HTGCZ7Q
.

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

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

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

рдЗрд╕ рдкрд░ рдореЗрд░реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ ЁЯСО рдереА рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд▓реНрдкрдирд╛ рдХреА рдереА рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдХрдИ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рдХреЙрд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╕реЗ defer рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдкреВрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ тЭдя╕П рдФрд░ рдкрд░ рдлрд╝реНрд▓рд┐рдк рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@carlmjohnson рд╣рд╛рдБ рдпрд╣ рдЖрд╕рд╛рди рд╣реИ рд▓реЗрдХрд┐рди ...

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

рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд╛рдн рд╣реИрдВ:

  1. рд╣рдо рдЗрд╕реЗ рдПрдХ-рдкрдВрдХреНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  2. рд╣рдореЗрдВ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдПрд░рд░ => рдкреИрдирд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд╛рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ рдЧреЛ рд╕рдореБрджрд╛рдп рдореЗрдВ рд╢рд╛рдпрдж рд╕рднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП "рдорд╛рдирдХ рдкреИрдХреЗрдЬ" рдЗрд╕рдХреЗ рд▓рд┐рдП _ _ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд╛рди рд╣реИред

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

рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рддреА => рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдиреЗ рдЗрд╕реЗ рдорд╛рдирд╛ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрд╣реБрдд рдЦрддрд░рдирд╛рдХ рдорд╛рдирд╛ (рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП)ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдмрд┐рдирд╛ try() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдУрд╡рд░рд░рдЪрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рдореЗрдВ рдмрдирд╛рдиреЗ рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдЪрд┐рдВрддрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ

@pjebs рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореВрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди _if_ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рд▓реЗрдХрд┐рди рдпрд╣ try рдХреА рдПрдХ рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рд░рд▓ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдЕрд▓рдЧ must рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рдЬреЛ рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐ рд╕реЗ рдШрдмрд░рд╛рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ try рдЬреИрд╕рд╛ рд╣реИ)ред рдлрд┐рд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдХреЛ рд╕рдВрджрд░реНрдн рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ must рд╣реЛрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдЖрдХрд░реНрд╖рдг рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ testing рдкреИрдХреЗрдЬ рдХреЛ must рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдмрд░рд╛рд╣рдЯ рд╕реЗ рдЙрдмрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рдирдпрд╛ рднрд╛рд╖рд╛ рддрдВрддреНрд░ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝реЗрдВ рдЬрдм рд╣рдо TestXxx(t *testing.T) error рдлреЙрд░реНрдо рдХреЗ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдкреИрдХреЗрдЬ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЕрдЧрд░ рд╡реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддреА рд╣реИ (рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕реЗ рд╢реБрд░реВ рд╕реЗ рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛), рддреЛ try рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рд╕рдВрднрд╡ рд╣реИред

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

@griesemer рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ must рдЕрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ try рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЧрддрд┐ try рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреА рдУрд░ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ must рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ

рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЗрд╕ рджреМрд░ рдореЗрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо 3+ рд╡рд░реНрд╖реЛрдВ (рдпрд╛ рд╢рд╛рдпрдж рдХрднреА) рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛/рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪрд░реНрдЪрд╛ рдореЗрдВ рдУрд╡рд░рд▓реИрдк рдЦрд░реЛрдВрдЪ рдФрд░ рд░реАрд╕рд╛рдЗрдХреНрд▓рд┐рдВрдЧ рдЪрд░реНрдЪрд╛рдУрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ must рддрд╛рд░реАрдл try рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗред

@pjebs рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА " try рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдХреЛрдИ рдЧрддрд┐" рд╣реИ ... - рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рджреЛ рджрд┐рди рдкрд╣рд▓реЗ рд╣реА рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рди рд╣реА рдХреБрдЫ рддрдп рд╣реБрдЖ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рджреЗрдВред

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

рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдШрдВрдЯреЛрдВ рдмрд┐рддрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

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

рдЪрд┐рдВрддрд╛рдУрдВ

рдЖрд╕реНрдердЧрд┐рдд рдХрд╛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ

рдЦрддрд░рдирд╛рдХ рдХреЗ рд░реВрдк рдореЗрдВ defer рдХреА рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реАрдзреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ред рдЕрдЧрд░ рдореИрдВ defer closeFile(f) рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рд╕реАрдзрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВ; func рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬрд┐рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ defer рдХреЗ рд▓рд┐рдП panic() рдФрд░ recover() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдЗрд╕реЗ рд▓рдЧрднрдЧ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП defer рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреВ рд╕реНрдкрд╖реНрдЯ рдФрд░ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рдХреАрд╡рд░реНрдб defer рдХреНрдпреЛрдВ? рдХреНрдпрд╛ defer рдХрд╛ рдЕрд░реНрде _"рд╢рд╛рдпрдж рдмрд╛рдж рдореЗрдВ?" рдХреЗ рдмрдЬрд╛рдп _"рдмрд╛рдж рдореЗрдВ рдХрд░реЗрдВ"_ рдирд╣реАрдВ рд╣реИ?

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

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдИ рдЖрдВрдХрдбрд╝реЗ рдирд╣реАрдВ

рдЬреИрд╕рд╛ рдХрд┐ @prologic рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ try() рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛрдб рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдкреНрд░рддрд┐рд╢рдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬреЛ рдЗрд╕ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХреА рд╣реИ?

рдХрд╛рд╢ рдореИрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рд╣рд░ рдлрд╛рдЗрд▓ рдХреА рдкреВрд░реА рд╕рдореАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдиреЛрдЯреНрд╕ рд▓рд┐рдП рдмрд┐рдирд╛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдмреЗрд╕ рд╕реЗ рдЖрдВрдХрдбрд╝реЗ рдХреИрд╕реЗ рджреЗрдирд╛ рд╣реИ; рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ @prologic рдХреИрд╕реЗ рдЦреБрд╢ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕рдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ред

рд▓реЗрдХрд┐рди рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдЕрдЧрд░ try() рдиреЗ рдореЗрд░реЗ 5% рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рд╕рдВрджреЗрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ 1% рд╕реЗ рдХрдо рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рджреВрд╕рд░реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдкрдиреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

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

рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ

рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдХреБрд▓ рджреЛрд╣рд░рд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ try() рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЧрд▓реЗ рд▓рдЧрд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдпрд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдХрднреА рднреА рдХрд┐рд╕реА рднреА рдХреЛрдб рдореЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдЦреЛрдЬреЗрдЧрд╛ред рдбреЗрд╡рд▓рдкрд░ рдЬрд╣рд╛рдЬреЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛:

f, _ := os.Open(filename)

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

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

(рдЬреНрдпрд╛рджрд╛рддрд░) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреВрдЬрд░рд▓реИрдВрдб рдореЗрдВ try() рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЬрдм рддрдХ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрддрд╛ - рдЬреЛ рдореИрдВ рд╢рд╛рдпрдж рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд▓реИрдВрдб рдореЗрдВ рд▓рд╛рдЧреВ рдЧреЛ рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ try() рд╣реИ, рдпрджреНрдпрдкрд┐ рдХреЗрд╡рд▓ рдПрдХ (1) рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИ:

package main

import (
    "errors"
    "fmt"
    "strings"
)
func main() {
    defer func() {
        r := recover()
        if r != nil && strings.HasPrefix(r.(string),"TRY:") {
            fmt.Printf("Ouch! %s",strings.TrimPrefix(r.(string),"TRY: "))
        }
    }()
    n := try(badjuju()).(int)
    fmt.Printf("Just chillin %dx!",n)   
}
func badjuju() (int,error) {
    return 10, errors.New("this is a really bad error")
}
func try(args ...interface{}) interface{} {
    err,ok := args[1].(error)
    if ok && err != nil {
        panic(fmt.Sprintf("TRY: %s",err.Error()))
    }
    return args[0]
}

рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ try2() , try3() рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рддрдиреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

func try(args ...interface{}) ...interface{} {
    err,ok := args[1].(error)
    if ok && err != nil {
        panic(fmt.Sprintf("TRY: %s",err.Error()))
    }
    return args[0:len(args)-2]
}

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

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рдХрдореА

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдХреБрдЫ рдХрдард┐рди рд╣реИред

рдЬрдм рдореИрдВ try() рдПрдХ рд╡реНрдпрдВрдЬрдХ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реБрдЖ рджреЗрдЦрддрд╛ рд╣реВрдВ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ?

рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рдпрд╛ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ defer рдкрд░ рдХреВрдж рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдЕрдВрджрд░ err рдирд╛рдордХ рдПрдХ рдЪрд░ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛, рдпрд╛ рдЗрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ _(I рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ?)_ред рдФрд░ рдпрджрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддреНрд░реБрдЯрд┐ рдирд╛рдо рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдирд╛рдо рджреВрдВ? рдФрд░ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдВрдШрд░реНрд╖ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ err рдЪрд░ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛?

рдФрд░ рдХреНрдпрд╛ рдпрд╣ рд╕рднреА defer s рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛? рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рдпрд╛ рдирд┐рдпрдорд┐рдд рдХреНрд░рдо рдореЗрдВ?

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

рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдЕрдм рддрдХ рдХреА рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореБрдЭреЗ рдЕрднреА рднреА рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рдирд╣реАрдВ рдкрддрд╛ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдЙрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рдорд░реНрдердХ _"рдХрдкреНрддрд╛рди рд╕реНрдкрд╖реНрдЯ" рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рдЪреИрдВрдкрд┐рдпрди рд╣реИрдВ?

рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЕрднрд╛рд╡

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

рдЕрдХреНрд╕рд░ рдореИрдВрдиреЗ рдЗрд╕реЗ func рдХреЗ рднреАрддрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдкрд╣рд▓реВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрджрдЧрд╛рд░ рдкрд╛рдпрд╛ рд╣реИ - рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ package рдореЗрдВ рднреА - рд▓реЗрдХрд┐рди рдлрд┐рд░ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рднреА рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд╛рдВрдЪ (5) func рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп func рдХреЗ рднреАрддрд░ рд╕реЗ error() #$ рд▓реМрдЯрд╛рддреА рд╣реИрдВ; рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ A() , B() , C() , D() , рдФрд░ E() рд▓реЗрдмрд▓ рдХрд░реЗрдВред рдореБрдЭреЗ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП C() рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, A() , B() , D() , рдФрд░ E() рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП B() рдФрд░ E() ред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдХрдо рд╕реЗ рдХрдо рдЖрд╕рд╛рдиреА рд╕реЗ рддреЛ рдирд╣реАрдВред

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

_ "рд╣рдо рдЗрди рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдорд╛рдореВрд▓реА рд╡реГрджреНрдзрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирдП рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?" _

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

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

break . рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рд╕рдорд░реНрдерди рдХрд╛ рдЕрднрд╛рд╡

рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╛рдПрдВ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ break рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП return рд╕реЗ рдкрд╣рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдпрд╛ рд╕рднреА func рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред

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

рдЬрд▓реНрджреА рд╡рд╛рдкрд╕реА рдХреЗ рдмрдЬрд╛рдп break рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд▓реЙрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП for range "1" {...} рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ only рдирд╛рдордХ рдПрдХ рдкреИрдХреЗрдЬ рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддрд╛ рд╣реИ Once рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде "1" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ):_

func (me *Config) WriteFile() (err error) {
    for range only.Once {
        var j []byte
        j, err = json.MarshalIndent(me, "", "    ")
        if err != nil {
            err = fmt.Errorf("unable to marshal config; %s", 
                err.Error(),
            )
            break
        }
        err = me.MaybeMakeDir(me.GetDir(), os.ModePerm)
        if err != nil {
            err = fmt.Errorf("unable to make directory'%s'; %s", 
                me.GetDir(), 
                err.Error(),
            )
            break
        }
        err = ioutil.WriteFile(string(me.GetFilepath()), j, os.ModePerm)
        if err != nil {
            err = fmt.Errorf("unable to write to config file '%s'; %s", 
                me.GetFilepath(), 
                err.Error(),
            )
            break
        }
    }
    return err
}

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

рд▓реЗрдХрд┐рди рдореИрдВ рдкреАрдЫреЗ рд╣рдЯрд╛ред рдЗрд╕реЗ рдпрд╣рд╛рдВ рд▓рд╛рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬреЛ return s рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП break рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ

рдореЗрд░реА рд░рд╛рдп err == nil рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ

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

рддреЛ рдЧреЛ 2 рдХреЗ рд▓рд┐рдП рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЧреЛ рдПрдХ рдирдпрд╛ рдмрд┐рд▓реНрдЯрд┐рди рдкреНрд░рдХрд╛рд░ status рдФрд░ рддреАрди рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рдВрд╕ iserror() , iswarning() , issuccess() рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред status error #$ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдмрд╣реБрдд рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ nil рдорд╛рди issuccess() рдкрд░ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ issuccess() true - рд▓реЗрдХрд┐рди status рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреА рддрд╛рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╣рдореЗрд╢рд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдХрднреА рднреА nil рдЪреЗрдХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдирд┐рдореНрди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рдХреБрдЫ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

func (me *Config) WriteFile() (sts status) {
    for range only.Once {
        var j []byte
        j, sts = json.MarshalIndent(me, "", "    ")
        if iserror(sts) {
            sts.AddMessage("unable to marshal config")
            break
        }
        sts = me.MaybeMakeDir(me.GetDir(), os.ModePerm)
        if iserror(sts) {
            sts.AddMessage("unable to make directory'%s'", me.GetDir())
            break
        }
        sts = ioutil.WriteFile(string(me.GetFilepath()), j, os.ModePerm)
        if iserror(sts) {
            sts.AddMessage("unable to write to config file '%s'", 
                me.GetFilepath(), 
            )
            break
        }
        sts = fmt.Status("config file written")
    }
    return sts
}

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

рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЧреЛ рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕ try() рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред

_"рд╕рднреА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ"_ рдФрдЪрд┐рддреНрдп

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

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

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

_"рдПрдХ рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рднреА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рдпрд╛ рдХреЛрдИ рднреА рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛; рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рд╡реЗ рднрд╛рд╖рд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдФрд░ рд╕рднреА рдХреЛ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВ? рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рд╣реИрдВ рдпрд╣рд╛рдВ рдорд╛рдорд▓реЗ рд╣реИрдВ? рд▓реЛрдЧ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд▓реЛрдЧ рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рд╕рдХреНрд╖рдо рд╣реЛрдВ ... рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рд╡реЗ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдкрдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХрд░рддрд╛ рд╣реИ...?"_
тАФ рдПрдХ рдХреЛрд░ рдЧреЛ рдЯреАрдо рд╕рджрд╕реНрдп

рд╕рдЪ рдХрд╣реВрдВ рддреЛ рдЬрдм рдореИрдВрдиреЗ рдЙрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИ рддреЛ рдореИрдВрдиреЗ рджреЛ рднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рд╣реИ:

  1. рдЖрдХреНрд░реЛрд╢ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдпрд╛
  2. рдЙрддреНрд╕рд╛рд╣ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред

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

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

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

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

рдХреЛрд╢рд┐рд╢ рдХрд╛ рдШреЛрдВрд╕рд▓рд╛ ()

рдпрд╣ рднреА рдХреБрдЫ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ try() рдФрд░ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдмреАрдЪ рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓рдЧрднрдЧ 18 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЧреЛ рдЯреАрдо рдХреЗ рдПрдХ рдЕрдиреНрдп рд╕рджрд╕реНрдп рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:

_"рдЬрдм "рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" (рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдореЗрдВ рдмрдбрд╝реА рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдмрдбрд╝реЗ рдХреЛрдб рдЖрдзрд╛рд░), рдХреЛрдб рдХреЛ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рд▓реЗрдЦрди рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд▓рд┐рдПред"_

рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП _рдкреНрд░рд╛рдердорд┐рдХ_ рдмрддрд╛рдП рдЧрдП рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдФрд░/рдпрд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ рднреА рдиреЗрд╕реНрдЯреЗрдб try() рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреИрд╕реЗ try(try(try(to()).parse().this)).easily()) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдпрд╣реА рд╕рдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░рдг рдпрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╡реЗ _"рдПрдХреНрд╕рдкреНрд░реЗрд╢рди"_ рд╣реИрдВ, рдЗрд╕ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ try() рдПрдХ рдиреЗрд╕реНрдЯреЗрдмрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рднреА рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ?

рдЕрдм рдпрд╣рд╛рдБ рдХрд┐рд╕реА рдиреЗ рдХрд╣рд╛ _"рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ [рдиреЗрд╕реНрдЯреЗрдб try() s] рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВ"_ рдФрд░ рдЙрд╕ рдХрдерди рдХреЛ рдЪреБрдиреМрддреА рдирд╣реАрдВ рджреА рдЧрдИ рдереАред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд▓реЛрдЧ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ try() рдШреЛрдВрд╕рд▓рд╛ рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗ, рддреЛ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╡рд╣реА рд╕рдореНрдорд╛рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд▓реЛрдЧ рдХрд╣рддреЗ рд╣реИрдВ _ "рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВ?"_

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

рд╕рд╛рд░рд╛рдВрд╢

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

fwiw

рдкреАрдПрд╕ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬреАрдн-рдЧрд╛рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпреЛрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдЬреНрдЮрд╛рди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

_"рдХреЛрдИ try() рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ do() ред"_

@ianlancetaylor

@beoran рд╢рд╛рдпрдж рдЖрдк рдЬреЗрдирд░рд┐рдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@beoran рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмреЛрд▓ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд┐рдирдЯ рдкрд╣рд▓реЗ рдХреА рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЗрдирд░рд┐рдХ _(рдкреНрд▓рд╕ рд╡реИрд░рд┐рдПрдбрд┐рдХ рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░)_ рд╣реЛрддреЗ рддреЛ рд╣рдо рдЕрдкрдирд╛ рдЦреБрдж try() рдмрдирд╛ рд╕рдХрддреЗ рдереЗред

рд╣рд╛рд▓рд╛рдБрдХрд┐ - рдФрд░ рдореИрдВ рдпрд╣рд╛рдБ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдКрдкрд░ рдХрд╣реА рдЧрдИ рдмрд╛рддреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдКрдБрдЧрд╛ рдЬрд╣рд╛рдБ рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:

_" рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЛ рдЬрд╛рд╡рд╛ рд╡рдЧреИрд░рд╣ рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢рдмреНрджрд╛рд░реНрде рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд▓рд╛рдж рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓рд┐рдиреНрд╕ рдЬреЛрдбрд╝рдХрд░ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред)"_

@ianlancetaylor

рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдЧреЛ рдореЗрдВ try рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рдФрд░ рдореЗрд░реА рдЦреБрд╢реА рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рди рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ:

func try(v interface{}, err error) interface{} {
   if err != nil { 
     panic(err)
   }
   return v
}

рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://play.golang.org/p/Kq9Q0hZHlXL

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:

  1. рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рдмрдЪрд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ try рдХреЗ рд╕рд╛рде, рдпрджрд┐ рд╣рдо рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рдЧрдВрднреАрд░ рдХрдореА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ super(arg1, ..., argn) рдмрд┐рд▓реНрдЯрд┐рди рдХреЙрд▓рд░ рдХреЗ рдХреЙрд▓рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдКрдкрд░ рдПрдХ рд╕реНрддрд░, рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП arg1,...argn, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реБрдкрд░ рд░рд┐рдЯрд░реНрди рдЕрдЧрд░ рдЖрдк рдХрд░реЗрдВ рддреЛред
  2. рдпрд╣ try рдореИрдВрдиреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред
  3. рдЖрдкрдХреЛ рджрд┐рдП рдЧрдП emtpy рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред

рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдорд╕реНрдпрд╛ 2 рдФрд░ 3 рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ 1 рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬрд┐рд╕реЗ super() рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрди рджреЛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func (T ... interface{})try(T, err error) super {
   if err != nil { 
      super(err)
   }
  super(T...)
}

рдФрд░ рддрдм рдЖрд╕реНрдердЧрд┐рдд рдмрдЪрд╛рд╡ рдХреА рдЕрдм рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣ рд▓рд╛рдн рддрдм рднреА рдорд┐рд▓реЗрдЧрд╛ рдЬрдм рдЧреЛ рдореЗрдВ рдХреЛрдИ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

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

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

рдореБрдЭреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдерд╛ рдХрд┐ defer try(...) рдФрд░ go try(...) рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рдерд╛ .... рдСрд░реНрдереЛрдЧреЛрдиреИрд▓рд┐рдЯреА рдПрдХ рдЕрдЪреНрдЫреА рдбрд┐рдЬрд╛рдЗрди рдЧрд╛рдЗрдб рд╣реИред рдЖрдЧреЗ рдкрдврд╝рдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдкрд░ рдЬреИрд╕реА рдЪреАрдЬрд╝реЗрдВ
x = try(foo(...)) y = try(bar(...))
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ try рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ! рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:
try ( x = foo(...) y = bar(...) )
рдпрд╣рд╛рдВ foo() рдФрд░ bar() рджреЛ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рджреВрд╕рд░рд╛ рд╣реИ error ред рдХреЗрд╡рд▓ try рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рд▓реМрдЯрд╛рдП рдЧрдП рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдХреЛрдИ рд░рд┐рд╕реАрд╡рд░ рдирд╣реАрдВ) рдЬреИрд╕рд╛ рдХрд┐ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд░рд┐рд╕реАрд╡рд░ _ рд╣реИ)ред рдЖрдк foo рдФрд░ bar рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╛рд░рд╛рдВрд╢:
a) try рдХреЗ рд▓рд┐рдП go рдФрд░ defer рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдмреА) рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЧ) рдЗрд╕рдХреА рдЬрд╛рджреБрдИ рдкреНрд░рдХреГрддрд┐ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдХреЛрдИ рдкрдХрдбрд╝ рдирд╣реАрдВ рд╣реИред рдареАрдХ рдЙрд╕реА рдХреЛрдб рдХреЛ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ
x = try(foo(...)) y = try(bar(...))
рдпрд╣ рд╕рд┐рд░реНрдл рдЕрд▓рдЧ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИ, рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВред
````

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдзрд╛рд░рдгрд╛рдПрдБ рдмрдирд╛рдИ рдереАрдВ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдереАрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рдХреБрдЫ рдХрдорд┐рдпрд╛рдБ рд╣реИрдВред

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

рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ keyword ( ... ) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рдХреАрд╡рд░реНрдб рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдЖрдпрд╛рдд, var, const, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП: рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреАрд╡рд░реНрдб рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЙрд╕ рдирд┐рдпрдо рдХрд╛ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд▓рдЧрддрд╛

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

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд┐рдХреНрдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ _ рд╣реИ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ # рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХрд╛ рдЕрдВрддрд┐рдо рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣реИред

func foo() (error) {
    f, # := os.Open()
    defer f.Close()
    _, # = f.WriteString("foo")
    return nil
}

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

  • рдпрджрд┐ рдЙрдирдХрд╛ рдирд╛рдо рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реИ
  • рдирд╛рдорд┐рдд рдЪрд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдорд╛рди рдЕрдиреНрдпрдерд╛

@deanveloper , try рдмреНрд▓реЙрдХ рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдорд╛рди рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрддрдГ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
try(x = foo(...)) try(y = bar(...))
рджреЛрдиреЛрдВ рдХрдердиреЛрдВ рдХреЛ рдПрдХ рд╣реА рдмреНрд▓реЙрдХ рдореЗрдВ рд░рдЦрдирд╛, import , const рдФрд░ var рдХрдердиреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред

рдЕрдм рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ, рдЙрджрд╛
try( x = foo(...)) go zee(...) defer fum() y = bar(...) )
рдпрд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
try(x = foo(...)) go zee(...) defer fum() try(y = bar(...))
рдПрдХ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдХрдо рд╡реНрдпрд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛
try(x = foo())
рдпрджрд┐ foo() рддреНрд░реБрдЯрд┐ рдорд╛рди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд░рд╛рдмрд░ рд╣реИ
x = foo()

рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛
try(f, _ := os.open(filename))
рдЪреВрдВрдХрд┐ рд▓реМрдЯрд╛рдП рдЧрдП рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╕реНрдЯ . рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
f, _ := os.open(filename)

рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛
try(f, err := os.open(filename))
рдЪреВрдВрдХрд┐ рд▓реМрдЯрд╛рдП рдЧрдП рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдмрд░рд╛рдмрд░ рд╣реИ
f, err := os.open(filename) if err != nil { return ..., err }
рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред

рдФрд░ рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдХреЛрд╢рд┐рд╢реЛрдВ рдХреЛ рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ!

рдпрд╣рд╛рдБ рдЙрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ:

рдпрд╣ try() . рдХреЗ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ (2) рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реИ

  1. рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ func /рдХреНрд▓реЛрдЬрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
  2. break , continue рдпрд╛ return рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░реЛрдВ рдХреА рдХреНрд╖рдорддрд╛ред

рдЗрди рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдХреЛрдИ _"рдЬрд╛рджреВ"_ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЛ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ рдЬреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЧреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЗрдирд▓рд╛рдЗрди рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рд╕рднреА рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред

рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдХрд╣рд╛рдБ рдЬрд╛ рд░рд╣реА рд╣реИред

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

рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдорд╛рдиреНрдп рд╣реИ:

v := m[key]

рдЬреИрд╕рд╛ рдпрд╣ рд╣реИ:

v, ok := m[key]

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

v, err := fn()

рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп:

v := try(fn())

рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

v := fn()

рдЬрдм рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдЖрджрдд рдкрдбрд╝рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ v, ok := m[key] рдФрд░ v, ok := x.(string) рдХреЗ рд╕рдорд╛рди рд╣реА рд▓рдЧрддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рднреА рдЕрдирд╣реЗрд▓реНрдб рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдорд╛рди рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдбрд┐рдЬрд╝рд╛рдЗрди рдбреЙрдХреНрд╕ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

тАв рднрд╛рд╖рд╛ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдмрд░рдХрд░рд╛рд░ рд╣реИ рдФрд░ рдХреЛрдИ рдирдпрд╛ рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
тАв рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА рддрд░рд╣ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдмрдиреА рд╣реБрдИ рд╣реИ рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдордЭрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
тАв рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
тАв рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рддреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ CopyFile рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде defer fmt.HandleErrorf(&err, "copy %s %s", src, dst) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

func CopyFile(src, dst string) (err error) {
        defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)

        r := os.Open(src)
        defer r.Close()

        w := os.Create(dst)
        defer func() {
                err := w.Close()
                if err != nil {
                        os.Remove(dst) // only if a тАЬtryтАЭ fails
                }
        }()

        io.Copy(w, r)
        w.Close()
        return nil
}

@savaki рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдФрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╛рд▓рдХрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдлрд╝реНрд▓рд┐рдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рджреЗрдВ рдХрд┐ рдРрд╕рд╛ рдХрдм рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ (рдЧрд▓рддреА рдХреЛ рдПрдХ рдЪрд░ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░рдХреЗ) рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреА рдХреБрд▓ рдХрдореА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛрдб рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рд╕рднреА рд░рд┐рдЯрд░реНрди рдкреЙрдЗрдВрдЯ рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдЧрд╛ред рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореНрдореЗрд▓рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреИрдкрд┐рдЯрд▓ рдХрд░рдирд╛)ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдИ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ ? ред рддрдм рдЧреЛ рд╣рдореЗрд╢рд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХреА рддрд░рд╣ рд╣реА рдЗрд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрдЬрд╛рдп ? рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ ? рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛, рди рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ error рдХреЛ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╡рд╣ рднреА рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ ? рдкреНрд░рддреНрдпрдп рдирд╣реАрдВ рд╣реИред рдмреЗрд╢рдХ ? рдордирдорд╛рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЗрд░рд╛рджрд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛред operation?() рд░реИрдкрд┐рдВрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ try(someFunc()) рд▓реЗрдХрд┐рди ? рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреИрдкрд┐рдЯрд▓рд╛рдЗрдЬрд╝рд┐рдВрдЧ рдХреА рддрд░рд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдПрдХ рдЪрд░ рдХрд╛ рдкрд╣рд▓рд╛ рдЕрдХреНрд╖рд░ред

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

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

рдХреНрдпрд╛ рд╣рдо рдкреБрд░рд╛рдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде c++ рдЕрдкрд╡рд╛рджреЛрдВ рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

func some_old_test() (int, error){
    return 0, errors.New("err1")
}
func some_new_test() (int){
        if true {
             return 1
        }
    throw errors.New("err2")
}
func throw_res(int, e error) int {
    if e != nil {
        throw e
    }
    return int
}
func main() {
    fmt.Println("Hello, playground")
    try{
        i := throw_res(some_old_test())
        fmt.Println("i=", i + some_new_test())
    } catch(err io.Error) {
        return err
    } catch(err error) {
        fmt.Println("unknown err", err)
    }
}

@owais рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ try рддреЛ рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо рдЖрдкрдХреЛ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рддреЛ рдЕрдЧрд░ рд╣рдордиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХреА:

func foo() error {
  _, err := fn() 
  if err != nil {
    return err
  }

  return nil
} 

рдЕрдЧрд░ рдореИрдВ рдХреЛрд╢рд┐рд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдмрд╕ рдпрд╣ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

func foo() error {
  _  := fn() 
  return nil
} 

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

рдпрд╣ рддрдм рдХрд╛рдо рдХрд░реЗрдЧрд╛:

func foo() (err error) {
  _  := fn() 
  return nil
} 

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

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

рдЕрдЧрд░ рдЧрд▓рддреА рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рд╡рд╛рдкрд╕реА! = рд╢реВрдиреНрдп рдорд╛рдорд▓рд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рд░рд┐рдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдирд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рд╕реНрдЯреИрдВрдбрдкреЙрдЗрдВрдЯ рд╕реЗ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ

f := os.Open("foo.txt")

рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдкрд╕реА рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛрдб рд▓рд┐рдЦрд┐рдд рдордВрддреНрд░ рд╕реЗ рдЕрдзрд┐рдХ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ

f := os.Open("foo.txt") else return

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рд░реВрдкреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ gofmt рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛, рдЪрд░ рдХрд╛ рд╕реНрдерд╛рдиреАрдп рдирд╛рдордХрд░рдг рднреАред рд╡рд╛рдкрд╕реА рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

f := os.Open("foo.txt") else err {
  return errors.Wrap(err, "some context")
}

рдПрдХрд╛рдзрд┐рдХ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛

f := os.Open("foo.txt") else err {
  return i, j, errors.Wrap(err, "some context")
}

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

bits := ioutil.ReadAll(os.Open("foo")) else err {
  // either error ends up here.
  return i, j, errors.Wrap(err, "some context")
}

рдХрдВрдкрд╛рдЗрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдЧреБрдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рди рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ

func foo(s string) int {
   i := strconv.Atoi(s) // cannot implicitly return error due to missing error return value for foo.
   return i * 2
}

рдЦреБрд╢реА рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

func foo(s string) int {
   i, _ := strconv.Atoi(s)
   return i * 2
} 

рд╕рдВрдХрд▓рдХ рдЦреБрд╢ рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдпрд╛ рдЕрдиреНрдп рдкреНрд░рддреНрдпрдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

func foo() error {
  return errors.New("whoops")
}

func bar() {
  foo()
}

рдПрдХ рд▓реВрдк рдХреЗ рднреАрддрд░ рдЖрдк рдЬрд╛рд░реА рд░рдЦреЗрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

for _, s := range []string{"1","2","3","4","5","6"} {
  i := strconv.Atoi(s) else continue
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: ; рдХреЛ else . рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛

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

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

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

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

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

func example() error {
        var err *error = funcerror() // always return a non-nil pointer
        fmt.Print(*err) // always nil if the return parameters are not named and not in a defer

        defer func() {
                err := funcerror()
                fmt.Print(*err) // "x"
        }

        return errors.New("x")
}
func exampleNamed() (err error) {
        funcErr := funcerror()
        fmt.Print(*funcErr) // "nil"

        err = errors.New("x")
        fmt.Print(*funcErr) // "x", named return parameter is reflected even before return is called

        *funcErr = errors.New("y")
        fmt.Print(err) // "y", unfortunate side effect?

        defer func() {
                funcErr := funcerror()
                fmt.Print(*funcErr) // "z"
                fmt.Print(err) // "z"
        }

        return errors.New("z")
}

рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ:

func CopyFile(src, dst string) (error) {
        defer func() {
                err := funcerror()
                if *err != nil {
                        *err = fmt.Errorf("copy %s %s: %v", src, dst, err)
                }
        }()
        // one liner alternative
        // defer fmt.HandleErrorf(funcerror(), "copy %s %s", src, dst)

        r := try(os.Open(src))
        defer r.Close()

        w := try(os.Create(dst))
        defer func() {
                w.Close()
                err := funcerror()
                if *err != nil {
                        os.Remove(dst) // only if a тАЬtryтАЭ fails
                }
        }()

        try(io.Copy(w, r))
        try(w.Close())
        return nil
}

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ funcerror (рдирд╛рдо рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИ :D ) рдпрджрд┐ рдЖрд╕реНрдердЧрд┐рдд рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ funcerror рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рддреНрд░реБрдЯрд┐рдХрд░реНрддрд╛" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЗрддрд╛ рд╣реИ:

type interface Errorer() {
        Error() error
}

@savaki рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try() рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ _"рдЧреЛ-рд▓рд╛рдЗрдХред"_

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

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

рдЗрд╕рд▓рд┐рдП рдореИрдВ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ break рдФрд░ continue рдХреЛ рд╡реИрдз рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ return $ рдорд╛рдирддрд╛ рд╣реИ рдЬрдмрдХрд┐ try() рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдмреБрд▓рд╛ рд░рд╣рд╛ рд╣реИ рд╣реИрдВрдбрд▓рд░ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреЗрд╡рд▓ return , break рдпрд╛ continue рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

@mikeschinkel рдореЗрд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреЗрдЦреЗрдВ, рдЙрдирдХреЗ рдФрд░ рдореЗрд░реЗ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рдереЗ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмреНрд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛рдпрд╛ рдерд╛

@ рдЬреЗрдореНрд╕-рд▓реЙрд░реЗрдВрд╕

@mikesckinkel рдореЗрд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреЗрдЦреЗрдВ, рдЙрдирдХреЗ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рдереЗ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмреНрд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛рдпрд╛ рдерд╛

рдЕрдкрдирд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реБрдП:

f := os.Open("foo.txt"); err {
  return errors.Wrap(err, "some context")
}

рдЬрд┐рд╕рдХреА рддреБрд▓рдирд╛ рдЖрдЬ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ:

f,err := os.Open("foo.txt"); 
if err != nil {
  return errors.Wrap(err, "some context")
}

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВ:

  1. err _"рдЬрд╛рджреБрдИ"_ рдШреЛрд╖рд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдЬрд╛рджреВ рдХрдо рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд╣реАрдВ? рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
f, err := os.Open("foo.txt"); err {
  return errors.Wrap(err, "some context")
}
  1. рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ nil false рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рди рд╣реА рд╕реВрдЪрдХ рдорд╛рдиреЛрдВ рдХреЛ true рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
f, err := os.Open("foo.txt"); err != nil {
  return errors.Wrap(err, "some context")
}

рдФрд░ рд╡рд╣ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╛рдо рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рддрд░рд╣ рд▓рдЧрдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдФрд░ рдореИрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЧреЛ рдиреЗ рджреЛ (2) рдмрд┐рд▓реНрдЯрд┐рди рдЬреЛрдбрд╝реЗ; iserror() рдФрд░ error() ? рддрдм рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рдереЗ, рдЬреЛ рдореБрдЭреЗ рдЙрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛:

f := os.Open("foo.txt"); iserror() {
  return errors.Wrap(error(), "some context")
}

рдпрд╛ рдмреЗрд╣рддрд░ _(рдХреБрдЫ рдЗрд╕ рддрд░рд╣):_

f := os.Open("foo.txt"); iserror() {
  return error().Extend("some context")
}

рдЖрдк рдФрд░ рдЕрдиреНрдп рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

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

@mikeschinkel рдЙрд╕ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреЗрдж рд╣реИ рдЬреЛ рдореИрдВ рдЕрдкрдиреЗ рдлреЛрди рдкрд░ рдерд╛ рдФрд░ рдЬрд┐рдердм рд╕реНрд╡рддрдГ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рдерд╛ред

рддреНрд░реБрдЯрд┐ "рдЬрд╛рджреБрдИ" рдШреЛрд╖рд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдЬрд╛рджреВ рдХрдо рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд╣реАрдВ? рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

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

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

_"рд░рд┐рдЯрд░реНрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░ рдЬрд╛рджреБрдИ рд╣реИред"_

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

_"рдЗрд╕ рдкреВрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╢рд╛рдпрдж рд╣реА рд╕рдмрд╕реЗ рдЬрд╛рджреБрдИ рдмрд╛рдд рдЪрд▓ рд░рд╣реА рд╣реЛред"_

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ _ "рд╕рднреА рдЬрд╛рджреВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред" _

_ "рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЧрд▓рддреА рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рдереА, рдЕрдВрдд рдореЗрдВ рдПрдХ рд╕реНрдХреЛрдкреНрдб рдмреНрд▓реЙрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ ..." _

рддреЛ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ err2 рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛?

f := os.Open("foo.txt"); err2 {
  return errors.Wrap(err, "some context")
}

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕реЗрдореА-рдХреЛрд▓рди рдХреЗ рдмрд╛рдж err / err2 рдХреЗ рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛рдиреА рдХрд┐ рдЗрд╕реЗ рдпрд╛ рддреЛ nil рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдирд╣реАрдВ nil bool рдЬреИрд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп?

if _,ok := m[a]; !ok {
   print("there is no 'a' in 'm'")
}

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

break рдФрд░ continue _(рд▓реЗрдХрд┐рди return ) рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░, рдореИрдВ рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдЦреБрд╢ рд╣реВрдВред

рд╡реИрд╕реЗ рднреА, рдореИрдВ рдЗрд╕ try() рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдорджрджрдЧрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦреВрдВрдЧрд╛ред #рдЬреЗрдПрдордЯреАрд╕реАрдбрдмреНрд▓реНрдпреВ.

@beoran @mikeschinkel рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ try рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдЖрдк рджреЛрдиреЛрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо try рдХреЛ panic рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди try рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ panic рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо try рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд╣рд╛рдВ, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ (рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md рдкрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдорд╕реМрджреЗ рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЛ рдЧрд▓рддреА рд╕реЗ рдШрдмрд░рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдкрд░ рдШрдмрд░рд╛рдирд╛ рдЙрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдЬ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

@mikeschinkel рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред
```
рдПрдл: = рдУрдПрд╕ред рдУрдкрди ('рдлреВ'); рдЧрд▓рддреА {рд╡рд╛рдкрд╕реА рдЧрд▓рддреА}//рдЧрд▓рддреА рд╣рдореЗрд╢рд╛ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдЧреАред

@ianlancetaylor

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

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЧреЛ рдЯреАрдо panic() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧреА - рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред

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

рдореИрдВ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ - рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ - рдЗрд╕ рдмрд╛рдд рдХреА рд╡рдХрд╛рд▓рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ panic() рдХрд╛ рдЙрдкрдпреЛрдЧ $#$4 try() panic() рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рдмрд╕ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рдереЗ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдереАрдВ рдЬреЗрдирд░рд┐рдХред

рдХреНрдпрд╛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ?

рдореЗрд░реЗ рд▓рд┐рдП panic рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, try рдХреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╡реЗ рд╕рдордХрдХреНрд╖ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ try рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЬреЗрдирд░рд┐рдХ рдереЗ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд try рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдХ рдЙрдЪрд┐рдд рдЗрдЪреНрдЫрд╛ рд╣реЛрдЧреАред

@ianlancetaylor рдиреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ред рджреЛрдмрд╛рд░рд╛, рдореИрдВ рдПрдХ рдХрд╛рд░рдг рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрдЬрд╛рдп try() рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try() рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рджреГрд╢реНрдп рдкрд╣рд▓реБрдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ check рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдЖрдпрд╛; check рдореЗрдВ рдЗрд╕ try() рдЬреИрд╕реА рд╣реА рд╢рдХреНрддрд┐ рдереА рд▓реЗрдХрд┐рди bar(check foo()) рдореЗрд░реЗ рд▓рд┐рдП bar(try(foo())) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ (рдореБрдЭреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рд╕реЗрдХрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!)

рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ handle / check рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдореБрдЦреНрдп рд╢рд┐рдХрд╛рдпрдд рдпрд╣ рдереА рдХрд┐ рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреЗрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рдерд╛ - рдФрд░ рдЕрдм рдЗрд╕ try() рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдПрдХ рд╣реА рджреЛрд╖ рд╣реИ, рдЯрд╛рд▓рдордЯреЛрд▓ рдФрд░ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдХреА рдореБрд╢реНрдХрд┐рд▓ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдиреМрд╕рд┐рдЦрд┐рдпрд╛-рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╣реБрдПред рдФрд░ handle рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИрдВрдбрд▓ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдерд╛, defer рдХреЗ рд╕рд╛рде рднреА рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореЗрд░рд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣рд░ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ handle / check рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рд╣рд╛рд░ рдЬрд╛рддрд╛ рд╣реИред

рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП defers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЪрд┐рдВрддрд╛ рд╣реИред

try рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд/рдЗрдЪреНрдЫрд┐рдд рдирд┐рдХрд╛рд╕ рд╣реИред рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд/рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдирд┐рдХрд╛рд╕ рд╕рд╣рд┐рдд, defers рд╣рдореЗрд╢рд╛ рдЪрд▓рддреЗ рд╣реИрдВред рдпрд╣ рдмреЗрдореЗрд▓ рднреНрд░рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ:

func someHTTPHandlerGuts() (err error) {
  defer func() {
    recordMetric("db call failed")
    return fmt.HandleErrorf("db unavailable: %v", err)
  }()
  data := try(makeDBCall)
  // some code that panics due to a bug
  return nil
}

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдиреЗрдЯ/http рдЖрддрдВрдХ рд╕реЗ рдЙрдмрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрддрдВрдХ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЙрддреНрдкрд╛рджрди рд╕рдорд╕реНрдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рд╣реИред рдЖрдк рдЕрдкрдиреЗ рдЗрдВрд╕реНрдЯреНрд░реБрдореЗрдВрдЯреЗрд╢рди рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдФрд░ recordMetric рдХреЙрд▓ рд╕реЗ рдбреАрдмреА рдХреЙрд▓ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕реНрдкрд╛рдЗрдХ рджреЗрдЦреЗрдВрдЧреЗред рдпрд╣ рдЕрд╕рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреБрдкрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ рд╣реИред

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

рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрд╢реЛрдзрди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЙрдард╛рдИ рдЧрдИ рдХреБрдЫ рдЪрд┐рдВрддрд╛рдУрдВ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: try рдХреЛ return рдХреЗ рдмрдЬрд╛рдп goto return рддрд░рд╣ рдорд╛рдиреЗрдВред рдореЗрд░реА рдмрд╛рдд рд╕реБрдиреЛред :)

try рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рд╣реЛрдЧрд╛:

t1, тАж tn, te := f()  // t1, тАж tn, te are local (invisible) temporaries
if te != nil {
        err = te   // assign te to the error result parameter
        goto error // goto "error" label
}
x1, тАж xn = t1, тАж tn  // assignment only if there was no error

рд▓рд╛рдн:

  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП defer рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред (рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред)
  • error: рд▓реЗрдмрд▓ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдПрдХ рджреГрд╢реНрдп рд╕реБрд░рд╛рдЧ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╣реАрдВ try рд╣реИред

рдпрд╣ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣реИрдВрдбрд▓рд░-рдП-рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рддрд╛ рд╣реИ: рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред try(fn(), wrap) $ рдХреЗ рдмрдЬрд╛рдп goto wrap goto error ред рдХрдВрдкрд╛рдЗрд▓рд░ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ wrap: рдореМрдЬреВрдж рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рд╣реЛрдиреЗ рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рднреА рдорджрдж рдорд┐рд▓рддреА рд╣реИ: рдЖрдк рдбрд┐рдмрдЧрд┐рдВрдЧ рдкрде рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬреЛрдбрд╝/рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдирдореВрдирд╛ рдХреЛрдб:

func CopyFile(src, dst string) (err error) {
    r := try(os.Open(src))
    defer r.Close()

    w := try(os.Create(dst))
    defer func() {
        w.Close()
        if err != nil {
            os.Remove(dst) // only if a тАЬtryтАЭ fails
        }
    }()

    try(io.Copy(w, r), copyfail)
    try(w.Close())
    return nil

error:
    return fmt.Errorf("copy %s %s: %v", src, dst, err)

copyfail:
    recordMetric("copy failure") // count incidents of this failure
    return fmt.Errorf("copy %s %s: %v", src, dst, err)
}

рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ:

  • рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ try рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд▓реЗрдмрд▓ рдХреЛ рд╕рдорд╛рдкреНрддрд┐ рдХрдерди рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдХреБрдЫ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛрдб рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдХреБрдЫ рдЙрдЪрд┐рдд, рдЙрдкрдпреЛрдЧреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред
  • рд▓реВрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдЕрдЧрд░ рджрд░реНрдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рдордд рдХрд░реЛ" рдХреЗ рдмреИрдирд░ рддрд▓реЗ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред
  • рдЗрд╕рдХреЗ рд▓рд┐рдП https://github.com/golang/go/issues/26058 рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╢реНрд░реЗрдп: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реА рдмрд╛рд░ @griesemer рджреНрд╡рд╛рд░рд╛ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдЧреЛрдлрд░рдХреЙрди рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

@josarian panic рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рд▓рд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ defer рд╣рдореЗрд╢рд╛ "db call failed" рдореАрдЯреНрд░рд┐рдХ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ someHTTPHandlerGuts рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рдФрд░ nil рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рдЧрд▓рдд рдореАрдЯреНрд░рд┐рдХ рд╣реЛрдЧрд╛ред defer рд╕рднреА рдирд┐рдХрд╛рд╕ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдпрд╛ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдШрдмрд░рд╛рд╣рдЯ рди рд╣реЛрдиреЗ рдкрд░ рднреА рдХреЛрдб рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред

func someHTTPHandlerGuts() (err error) {
  defer func() {
    recordMetric("db call failed")
    return fmt.HandleErrorf("db unavailable: %v", err)
  }()
  data := try(makeDBCall)
  // some code that panics due to a bug
  return nil
}

@josarian рд╣рд╛рдБ, рдпрд╣ рдХрдореЛрдмреЗрд╢ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдЪрд░реНрдЪрд╛ рдХреА рдереА (рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдордиреЗ try рдХреЗ рдмрдЬрд╛рдп try check рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо error рд▓реЗрдмрд▓ рдкрд░ рд╣реЛрдВ, рддреЛ рд╣рдо рдмрд╛рдХреА рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ "рд╡рд╛рдкрд╕" рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ goto рдХреБрдЫ рд╣рдж рддрдХ "рд╕рдВрд░рдЪрд┐рдд" рд╣реИ (рдХреЛрдИ рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЛрдб рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ)ред рдПрдХ рдЪрд┐рдВрддрд╛ рдЬреЛ рд╕рд╛рдордиреЗ рдЖрдИ рдереА рд╡рд╣ рдпрд╣ рдереА рдХрд┐ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ ( error: ) рд▓реЗрдмрд▓ рд╣рдореЗрд╢рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛ (рдЕрдиреНрдпрдерд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреВрджрдирд╛ рд╣реЛрдЧрд╛)ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрд╛рд╣рд░ (рдЕрдВрдд рдореЗрдВ) рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

рд╡реА, рдареАрдХ: = рдПрдо [рдХреБрдВрдЬреА]

рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдкреНрд░рдкрддреНрд░

рдЖрдк handle / check рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЧреЛрдЯреЛ рд▓реЗрдмрд▓ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо handle err { ... } рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдЪреЗрди рдирд╣реАрдВ рд╣реЛрдиреЗ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЧреЛрдЯреЛ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдВрджреБ рдХреЗ рдХрд░реАрдм рд░рдЦрддрд╛ рд╣реИред

func CopyFile(src, dst string) (err error) {
    handle err {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }
    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    defer func() {
        w.Close()
        if err != nil {
            os.Remove(dst) // only if a тАЬcheckтАЭ fails
        }
    }()

    {
        // handlers are scoped, after this scope the original handle is used again.
        // as an alternative, we could have repeated the first handle after the io.Copy,
        // or come up with a syntax to name the handlers, though that's often not useful.
        handle err {
            recordMetric("copy failure") // count incidents of this failure
            return fmt.Errorf("copy %s %s: %v", src, dst, err)
        }
        check io.Copy(w, r)
    }
    check w.Close()
    return nil
}

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

@josharian @griesemer рдпрджрд┐ рдЖрдк рдирд╛рдорд┐рдд рд╣реИрдВрдбрд▓рд░ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рдЪреЗрдХ/рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ, рдЖрд╡рд░реНрддреА рдереАрдо рджреЗрдЦреЗрдВ), try(f(), err) рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

try.err f()
try?err f()
try#err f()

?err    f() // because 'try' is redundant
?return f() // no handler
?panic  f() // no handler

(?err f()).method()

f?err() // lead with function name, instead of error handling
f?err().method()

file, ?err := os.Open(...) // many check/handle responses also requested this style

рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬреЛ рдЪреАрдЬреЗрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд╕рдВрдж рд╣реИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди-рдореБрдХреНрдд рд╣реИ, рдФрд░ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдЬреЛрд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ рдХреЗ рд▓рд┐рдП $#@!perl рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдирдлрд░рдд рдХрд░реВрдВрдЧрд╛ред

рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдХреЛрд╢рд┐рд╢" рдХрд░рдиреЗ рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдореЗрдВ 2 рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • рдпрд╣ рдмрд╛рдХреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,/if/рд░рд┐рдЯрд░реНрди/рдЖрджрд┐ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП)ред
  • рдпрд╣ рдХреЛрдб рдХреЛ рдХрдо рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред

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

рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдПрдХ рдФрд░ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдкрдардиреАрдпрддрд╛/рд░рдЦрд░рдЦрд╛рд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд░реВрдк рдореЗрдВ "рдХреЛрд╢рд┐рд╢" рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдо рдкрдардиреАрдпрддрд╛, рдЖрдИрдПрдордУ рдмреЗрд╣рддрд░ рд╕рдВрддреБрд▓рди рд╣реЛрдЧрд╛ред

FWIW, panic рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди go рдФрд░ defer рднреА рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try defer рдХреЗ рд╕рдорд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╡рд╛рд╣ рд╕рдВрдЪрд╛рд▓рди рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ try (try os.Open(file)).Read(buf) рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ-рд▓рд╛рдЗрдирд░реНрд╕ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реИрд╕реЗ рднреА, рд▓реЗрдХрд┐рди рдЬреЛ рднреА рд╣реЛред рдХреБрдЫ рднреА рдЪрд▓реЗрдЧрд╛ред

рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╣рд┐рдд рдирд╛рдо рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рд╣рд░ рдХреЛрдИ рдирдлрд░рдд рдХрд░реЗрдЧрд╛: $err ред рдпрд╣ try() рдЖрдИрдПрдордУ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред :-)

@griesemer

_ "рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдкрд╕рдВрдж рд╣реИ (рдЕрдВрдд рдореЗрдВ)"_

рдЙрд╕ рдкрд░ +1!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ _before_ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ _after_ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдХреВрджрдирд╛ рдФрд░ рддрд░реНрдХ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ 1980 рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реВрдВ рдФрд░ GOTO рдХреЗ рд╕рд╛рде рдмреЗрд╕рд┐рдХ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред

рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ CopyFile() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдиреЗ рджреЗрдВ:

func CopyFile(src, dst string) (err error) {

    r := os.Open(src)
    defer r.Close()

    w := os.Create(dst)
    defer w.Close()

    io.Copy(w, r)
    w.Close()

    for err := error {
        switch err.Source() {
        case w.Close:
            os.Remove(dst) // only if a тАЬtryтАЭ fails
            fallthrough
        case os.Open, os.Create, io.Copy:
            err = fmt.Errorf("copy %s %s: %v", src, dst, err)
        default:
            err = fmt.Errorf("an unexpected error occurred")
        }
    }

    return err
}

рдЖрд╡рд╢реНрдпрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдВрдЧреЗ:

  1. for error{} рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, $#$3 for range{} #$ рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд░ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред

  2. <object>.Error() string рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрднреА рдЬрдм for error{} рдирд┐рд░реНрдорд╛рдг рдЙрд╕реА func рдХреЗ рднреАрддрд░ рдореМрдЬреВрдж рд╣реЛред

  3. рдЬрдм рдХреЛрдИ func рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рдорд╛рди рдореЗрдВ _"рддреНрд░реБрдЯрд┐"_ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ for error{} рдирд┐рд░реНрдорд╛рдг рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

  4. рдПрдХ _"рддреНрд░реБрдЯрд┐"_ рд▓реМрдЯрд╛рддреЗ рд╕рдордп рдЧреЛ рдЙрд╕ рдлрдВрдХ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ <error>.Source() рджреНрд╡рд╛рд░рд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдПрдХ _"рддреНрд░реБрдЯрд┐"_ рдХреНрдпрд╛ рд╣реИ?

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ _"рддреНрд░реБрдЯрд┐"_ рдХреЛ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ Error() string рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ nil рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ RESTful API рдХреЗ рд╕рдлрд▓рддрд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рддреНрд░реБрдЯрд┐ _even on Success_ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреВрдЫреВрдВрдЧрд╛ рдХрд┐ рдЧреЛ рдЯреАрдо рдХреГрдкрдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ err!=nil рдХрд╛ рдЕрд░реНрде _"рддреНрд░реБрдЯрд┐"_ рди рдорд╛рдиреЗрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ IsError() рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ IsError() true рджреЗрддрд╛ рд╣реИ nil рдорд╛рди рдПрдХ _"рддреНрд░реБрдЯрд┐" рд╣реИред

_(рдореИрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдпрджрд┐ рдЖрдк _"рддреНрд░реБрдЯрд┐"_ рдкрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЕрдкрдирд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЪреБрдирддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ err!=nil рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ рд╣рдо рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реЛрдВрдЧреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)_

рдмреАрдЯреАрдбрдмреНрд▓реВ, рд╕рднреА рдХреЛ _"рддреНрд░реБрдЯрд┐"_ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрддрд╛ рд╣реИ, рд╡реИрд╕реЗ рд╣реА рдПрдХ рдирдпрд╛ рдмрд┐рд▓реНрдЯрд┐рди iserror() рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдХрд░ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type ErrorIser interface {
    IsError() bool
}
func iserror(err error) bool {
    if err == nil { 
        return false
    }
    if _,ok := err.(ErrorIser); !ok {
        return true
    }
    return err.IsError()
}

_"рддреНрд░реБрдЯрд┐рдпреЛрдВ"_ рдХреЗ рдЧреИрд░-рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдПрдХ рдкрдХреНрд╖ рд▓рд╛рдн

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

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

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

https://github.com/rhysd/trygo

рдореИрдВрдиреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рднрд╛рд╖рд╛ рдХреЛ рдЯреНрд░рд╛рдИрдЧреЛ рдХрд╣рд╛ рдФрд░ рдЯреНрд░рд╛рдИрдЧреЛ рдЯреВ рдЧреЛ рдЕрдиреБрд╡рд╛рджрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред

рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд╕рд╛рде, рдХреЛрдб

func CreateFileInSubdir(subdir, filename string, content []byte) error {
    cwd := try(os.Getwd())

    try(os.Mkdir(filepath.Join(cwd, subdir)))

    p := filepath.Join(cwd, subdir, filename)
    f := try(os.Create(p))
    defer f.Close()

    try(f.Write(content))

    fmt.Println("Created:", p)
    return nil
}

рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

func CreateFileInSubdir(subdir, filename string, content []byte) error {
    cwd, _err0 := os.Getwd()
    if _err0 != nil {
        return _err0
    }

    if _err1 := os.Mkdir(filepath.Join(cwd, subdir)); _err1 != nil {
        return _err1
    }

    p := filepath.Join(cwd, subdir, filename)
    f, _err2 := os.Create(p)
    if _err2 != nil {
        return _err2
    }
    defer f.Close()

    if _, _err3 := f.Write(content); _err3 != nil {
        return _err3
    }

    fmt.Println("Created:", p)
    return nil
}

рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп try() рдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИ

  • рдкрд░рд┐рднрд╛рд╖рд╛ рдХрдерди рдХрд╛ RHS
  • рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ RHS
  • рдХреЙрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ

рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЖрдЬрдорд╛ рд╕рдХрддрд╛ рдерд╛ред рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдерд╛

  • рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ
  • рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ err рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдФрд░ try() рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рджреЛрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдЙрд▓рдЭрди
  • рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдЗрд╕ try() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ 'рд░реИрдкрд┐рдВрдЧ рдПрд░рд░' рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрднрд╛рд╡ рдерд╛ред

_"рдпреЗ рджреЛрдиреЛрдВ рдореБрдЭреЗ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рд▓рдЧрддреЗ рд╣реИрдВред"_

рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдЕрд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред

_ "рдпрд╣ рдХреЛрд╢рд┐рд╢ рд╕рд┐рдВрдЯреИрдХреНрд╕ (рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ)"_

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

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

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

рдореЗрд░реЗ рдЕрдиреБрдорд╛рди рдореЗрдВ, рдпрд╣ рдорд┐рд╕рд╛рд▓ рдХрд╛рдпрдо рдХрд░рдиреЗ рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдЪреНрдЫреЗ рдирддреАрдЬреЗ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗ...

_"@рдорд┐рдХреЗрд╢реЗрдВрдХреЗрд▓"_

PS рдореИрдВрдиреЗ рдЖрдкрдХрд╛ рд╕рдВрджреЗрд╢ рдЧрд▓рдд рд╡рд░реНрддрдиреА рдХреЗ рдХрд╛рд░рдг рдкрд╣рд▓реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ред _(рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдареЗрд╕ рдирд╣реАрдВ рдкрд╣реБрдБрдЪрддреА, рдЬрдм рдореЗрд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреА рд╡рд░реНрддрдиреА рдЧрд▓рдд рд╣реЛрддреА рд╣реИ рддреЛ рдореБрдЭреЗ рд╕реВрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛...)_

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпреЛрдВрдХрд┐ try , рдХрд┐рд╕реА рднреА рдХреАрд╡рд░реНрдб рдХреА рддрд░рд╣, рд▓реЛрдЕрд░рдХреЗрд╕ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗред рдХреАрд╡рд░реНрдб рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдкреИрдХреЗрдЬ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдВрдЧреЗ.

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

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦреВрдВрдЧрд╛ред

1) рдХреЛрдИ рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ

// The existing proposal, but as a keyword rather than builtin.  When an error is 
// "caught", the function returns all zero values plus the error.  Nothing 
// particularly new here.
func doSomething() (int, error) {
    try SomeFunc()
    a, b := try AnotherFunc()

    // ...

    return 123, nil
}

2) рд╣реИрдВрдбрд▓рд░

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рд╕рд░рд▓ рдХреЛрдб рдмреНрд▓реЙрдХ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдЗрдирд▓рд╛рдЗрди рд╣реЛрдирд╛ рд╣реИред рдЗрд╕ рдкрд░ рдФрд░ рдиреАрдЪреЗред

func doSomething() (int, error) {
    // Inline error handler
    a, b := try SomeFunc() else err {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    // Named error handlers
    handler logAndContinue err {
        log.Errorf("non-critical error: %v", err)
    }
    handler annotateAndReturn err {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    c, d := try SomeFunc() else logAndContinue
    e, f := try OtherFunc() else annotateAndReturn

    // ...

    return 123, nil
}

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рддрд┐рдмрдВрдз:

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

рд▓рд╛рдн:

  • try / else рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рдореМрдЬреВрджрд╛ "рдпреМрдЧрд┐рдХ рдЕрдЧрд░" рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
    go a, b := try SomeFunc() else err { return 0, errors.Wrap(err, "error in doSomething:") }
    рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
    go if a, b, err := SomeFunc(); err != nil { return 0, errors.Wrap(err, "error in doSomething:") }
    рдореЗрд░реА рдирдЬрд╝рд░ рдореЗрдВ, рдпреМрдЧрд┐рдХ ifs рд╣рдореЗрд╢рд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдорджрджрдЧрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ: рд╕рд╢рд░реНрдд рдЖрдорддреМрд░ рдкрд░ _after_ рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдСрдкрд░реЗрд╢рди рд╕рд╢рд░реНрдд рдмрдпрд╛рди рдХреЗ рдЕрдВрджрд░ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЖрдВрдЦ рд╡рд┐рдЪрд▓рд┐рдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЪрд░ рдХрд╛ рджрд╛рдпрд░рд╛ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╡реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдмрд╕реЗ рдмрд╛рдИрдВ рдУрд░ рд╣реЛрддреЗ рд╣реИрдВред
  • рддреНрд░реБрдЯрд┐ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рди рд╣реА рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рдЬреИрд╕рд╛ рдХреБрдЫ рднреА)ред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрдИ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

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

    • рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо check / handle рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдШреВрдорддреЗ рд╣реИрдВ рдХрд┐ "рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдврд╛рдВрдЪрд╛ рдХреЗрд╡рд▓ рдЦреИрд░рд╛рдд рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ"ред рд╣рдо "рд╣реИрдВрдбрд▓рд░ рдЪреЗрди" рдХреА рдЖрд▓реЛрдЪрдирд╛ рднреА рдХрд░рддреЗ рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рднреА рдордирдорд╛рдирд╛ рдХреЛрдб рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИред

    • рд╣рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ return рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ super return ред рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░рдирд╛ рдмреЗрд╣рдж рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред return рдХрд╛ рдЕрд░реНрде рд╣реИ return , рдФрд░ super return рдХреА рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

    • defer рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рдВрджрдиреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдЖрджрд┐ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:

    • рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ рдФрд░ рдореМрдЬреВрджрд╛ if err != nil рдмреНрд▓реЙрдХ рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ

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

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

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

рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдпрд╣ рдмрд┐рдирд╛ рдирд╛рдо рд╡рд╛рд▓реЗ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рднреА рдареАрдХ рд░рд╣реЗрдЧрд╛, рд╣реИ рдирд╛? (рдпрд╣ рд╢рдХреНрддрд┐ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред рдХреЛрдИ рдХреЗрд╡рд▓ рдЗрдирд▓рд╛рдЗрди рд╣реИрдВрдбрд▓рд░ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред)

рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдпрд╣ рдмрд┐рдирд╛ рдирд╛рдо рд╡рд╛рд▓реЗ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рднреА рдареАрдХ рд░рд╣реЗрдЧрд╛, рд╣реИ рдирд╛? (рдпрд╣ рд╢рдХреНрддрд┐ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред рдХреЛрдИ рдХреЗрд╡рд▓ рдЗрдирд▓рд╛рдЗрди рд╣реИрдВрдбрд▓рд░ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред)

@griesemer рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЧреБрдирдЧреБрдирд╛ рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЧреЛ-рдИрд╢ рдмрд┐рдирд╛ред

рджреВрд╕рд░реА рдУрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдПрдХ-рд▓рд╛рдЗрдирд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ-рд▓рд╛рдЗрдирд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ return ред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд▓реЙрдЧ рд╣реЛрдЧрд╛, рдлрд┐рд░ return ред рдпрджрд┐ рд╣рдо else рдХреНрд▓реЙрдЬ рдореЗрдВ рдХрд┐рд╕реА рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЦреЛрд▓ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╢рд╛рдпрдж рдЗрд╕реЗ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ:

a, b := try SomeFunc() else err {
    someLocalFunc(err)
    return 0, err
}

(рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдХрдВрдкрд╛рдЙрдВрдб рдЗрдлреНрд╕ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐)

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

a, b := try SomeFunc() else err { return 0, errors.Wrap(err, "bad stuff!") }

рдХреНрдпрд╛ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдирдпрд╛ рдХреАрд╡рд░реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдХреНрдпреЛрдВ рдирд╣реАрдВ:

SomeFunc() else return
a, b := SomeOtherFunc() else err { return 0, errors.Wrap(err, "bad stuff!") }

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

рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╣рд▓реЗ рдЪреЗрдХ/рд╣реИрдВрдбрд▓ рдлреАрдбрдмреИрдХ рд╡рд┐рдХреА рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдЪреНрдЫреА рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рд╕рдкрдирд╛ рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдгрд┐рдд рд╣реИ :-)
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback

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

https://github.com/golang/go/issues/32437#issuecomment -499808741
https://github.com/golang/go/issues/32437#issuecomment -499852124
https://github.com/golang/go/issues/32437#issuecomment -500095505

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

рдореИрдВ рдХреБрдЫ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ @deanveloper рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЕрдкрдиреЗ рдЬреЛрд░ рдХреЗ рд╕рд╛рдеред https://github.com/golang/go/issues/32437#issuecomment -498939499 рдореЗрдВ @deanveloper рдиреЗ рдХрд╣рд╛:

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ try рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдмрдбрд╝реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ panic рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдорд┐рд╕рд╛рд▓ рдХрд╛рдпрдо рдХреА рд╣реИ рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ panic рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╣реИ:

  1. рдЖрддрдВрдХ рд╕рд╢рд░реНрдд рдирд╣реАрдВ рд╣реИ; рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред
  2. рдЖрддрдВрдХ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕рдХреА рджреГрд╢реНрдпрддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред

рджреВрд╕рд░реА рдУрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

  1. рд╕рд╢рд░реНрдд рд╣реИ; рдпрд╣ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рднреАред
  2. рдорд╛рди рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд┐рд╢реНрд░рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдХрдИ рдмрд╛рд░, рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реА рд╕рдВрдкрд╛рджрдХ рд╡рд┐рдВрдбреЛ рдХреЗ рджрд╛рд╣рд┐рдиреЗ рдорд╛рд░реНрдЬрд┐рди рд╕реЗ рдкрд╣рд▓реЗред

рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try "рдмрд┐рдЯ рдСрдл" рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред

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

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

````
рдЕрдЧрд░ рдпрд╣! = "рдЯреВрдЯ рдЧрдпрд╛" {
рдиреЙрдЯ рдлрд┐рдХреНрд╕ (рдпрд╣)
}

@ChrisHines рдЖрдкрдХреА рдмрд╛рдд рдкрд░ (рдЬреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдЧреВрдБрдЬрддреА рд╣реИ), рдЖрдЗрдП рдПрдХ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдз рдЬреЛрдбрд╝реЗрдВ:

  • рдХреЛрдИ рднреА try рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд┐рдирд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рднреА) рдЕрдкрдиреА рд▓рд╛рдЗрди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рддреЛ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдмрдХрд╡рд╛рд╕ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ:

try EmitEvent(try (try DecodeMsg(m)).SaveToDB())

рдмрд▓реНрдХрд┐ рдпрд╣:

dm := try DecodeMsg(m)
um := try dm.SaveToDB()
try EmitEvent(um)

рдЬреЛ рдЕрднреА рднреА рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ:

dm, err := DecodeMsg(m)
if err != nil {
    return nil, err
}

um, err := dm.SaveToDB()
if err != nil {
    return nil, err
}

err = EmitEvent(um)
if err != nil {
    return nil, err
}

рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдмрд┐рдирд╛ рдпрд╣ рдмрддрд╛рдП рдХрд┐ рдХреЛрдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред рдЬрдмрдХрд┐ рдЕрднреА, рдЖрдк рдХрднреА-рдХрднреА x, _ := SomeFunc() рджреЗрдЦрддреЗ рд╣реИрдВ (рдЕрдирджреЗрдЦрд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреНрдпрд╛ рд╣реИ? рдПрдХ рддреНрд░реБрдЯрд┐? рдХреБрдЫ рдФрд░?), рдЕрдм рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

x := try SomeFunc() else err {}

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рдж рд╕реЗ, рдореИрдВрдиреЗ @jagv (рдкреИрд░рд╛рдореАрдЯрд░ рд░рд╣рд┐рдд try рд░рд┐рдЯрд░реНрди *error ) рдФрд░ @josharian (рд▓реЗрдмрд▓ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░) рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рджреЛ рд╡рд┐рдЪрд╛рд░ рджреЗрдЦреЗ рд╣реИрдВ, рдЬрд┐рди рдкрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд░реВрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдХрд╛рдлреА рдмрдврд╝рд╛ рджреЗрдЧрд╛ред

рдереАрд╕рд┐рд╕ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдХрд░ рдПрдХ рдФрд░ рдПрдХ рдХреЗ рд╕рд╛рде рдЬреЛ рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдпрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ try рдХреЗ рдЪрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдВрдЧреЗ:

  1. рдХреЛрд╢рд┐рд╢ рдХрд░реЛ()
  2. рдХреЛрд╢рд┐рд╢ рдХрд░реЛ (рдкрд░рдо)
  3. рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдкреИрд░рд╛, рд▓реЗрдмрд▓)
  4. рдХреЛрд╢рд┐рд╢ рдХрд░реЛ (рдкрд░рдо, рдЖрддрдВрдХ)

1 рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ (рдИрдЖрд░рдкреА) рдпрд╛ рд╢реВрдиреНрдп рдкрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рдПрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рдерд╛ (рдХреЗрд╡рд▓ # 4)ред рдпрд╣ рдПрдХ рдирд╛рдорд┐рдд рдИрдЖрд░рдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмрд┐рд▓реНрдЯ-рдЗрди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред

2 рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд░рд┐рдХрд▓реНрдкрд┐рдд рд╣реИред рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рддреБрд░рдВрдд рд▓реМрдЯрд╛ рджреА рдЬрд╛рдПрдЧреА рд▓реЗрдХрд┐рди defer рдХрдерди рджреНрд╡рд╛рд░рд╛ рд╕рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

3 @josarian рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрд╛рдиреА рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдкрд░ рдХреЛрдб рд▓реЗрдмрд▓ рдкрд░ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рд▓реЗрдмрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдорд╛рдорд▓рд╛ рдЕрдм # 2 рдореЗрдВ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

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

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

рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдмрд▓ рдФрд░ goto рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рд╖рдп рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ @josharian рдиреЗ рдХрд╣рд╛) #26058 рдкрд░ рдкрд╣рд▓реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдмрд▓ рдХрд╛ рдирд╛рдо panic рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ #4 рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдХрд░реЗрдЧрд╛ред

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

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

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

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╡рд╛рд╣ рдХреА рдЖрд╕рд╛рди рджреГрд╢реНрдпрддрд╛ рдЦреЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдереА рдЬрд╣рд╛рдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, @deanveloper рдиреЗ https://github.com/golang/go/issues/32437#issuecomment -498932961 рдореЗрдВ рдЙрд╕ рдЪрд┐рдВрддрд╛ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЕрдкрд╡реЛрдЯ рдХреА рдЧрдИ рдЯрд┐рдкреНрдкрдгреА рд╣реИред

@dominikh рдиреЗ https://github.com/golang/go/issues/32437#issuecomment -499067357 рдореЗрдВ рд▓рд┐рдЦрд╛:

gofmt'ed рдХреЛрдб рдореЗрдВ, рдПрдХ рд░рд┐рдЯрд░реНрди рд╣рдореЗрд╢рд╛ /^\t*return / рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ - рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рдЖрдВрдЦреЛрдВ рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЫреЛрдЯрд╛ рдкреИрдЯрд░реНрди рд╣реИред рджреВрд╕рд░реА рдУрд░, рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЧрд╣рд░рд╛ рдШреЛрдВрд╕рд▓рд╛ред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рдХреЛрдИ рднреА рд░рд╛рд╢рд┐ рд╣рдореЗрдВ рдЯреВрд▓ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рддреБрд░рдВрдд рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдмрдирд╛рддреА рд╣реИред

рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, @brynbellomy рдиреЗ рдХрд▓ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛:

рдХреЛрдИ рднреА рдХреЛрд╢рд┐рд╢ рдХрдерди (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдмрд┐рдирд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рднреА) рдЕрдкрдиреА рд▓рд╛рдЗрди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рддреЛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

try dm := DecodeMsg(m)
try um := dm.SaveToDB()
try EmitEvent(um)

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрдЬрд╛рдп ( @brynbellomy рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ):

dm, err := DecodeMsg(m)
if err != nil {
    return nil, err
}

um, err := dm.SaveToDB()
if err != nil {
    return nil, err
}

err = EmitEvent(um)
if err != nil {
    return nil, err
}

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

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

рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИ:

info := try(try(os.Open(file)).Stat())    // proposed try built-in

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

try f := os.Open(file)
try info := f.Stat()

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

@ elagergren-spideroak рдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреА:

try(try(try(to()).parse().this)).easily())

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

@thepudds , рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдорд┐рд▓ рд░рд╣рд╛ рдерд╛ред рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рджрд┐рдпрд╛ рдЧрдпрд╛

try f := os.Open(file)
try info := f.Stat()

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ try рдХреЛ рдПрдХ try рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рдХреНрдп рдХреЛрд╖реНрдардХ рдХреЗ рднреАрддрд░ рд░рдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдЙрдкрд░реЛрдХреНрдд рдмрди рд╕рдХрддрд╛ рд╣реИ

try (
    f := os.Open(file)
    into := f.Stat()
)

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

try info := os.Open(file).Stat()

рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рд╕реЗ рд╕рдВрдХрд▓рдХ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдУрдкрди рдПрдХ рддреНрд░реБрдЯрд┐ рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдПрдХ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реИ, рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░рд╛рдердорд┐рдХ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдкрд░ рд╕реНрдЯреЗрдЯ() рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ред

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

try (
    f := os.Open(file)
    debug("f: %v\n", f) // debug returns nothing
    into := f.Stat()
)

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

try(try(try(to()).parse()).this)).easily())

рдЬрдмрдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реВрдВ

try to().parse().this().easily()

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

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

рдореИрдВ рдХреБрдЫ рд╣рдж рддрдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдерд╛ рдЬрд╣рд╛рдВ try рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ grep "return .*err$" рдЪрд▓рд╛рдпрд╛ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдмреНрд▓реЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред 7214 рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рджреЛ рд╕реМ рд╣реА рдкрдврд╝реЗ рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ try рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЗрди рд╕рднреА рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред

рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХрдо, 10 рдореЗрдВ 1 рд╕реЗ рдХрдо, try рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рд░рдЦреЗрдВрдЧреЗред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓рд╛ x := try(...) рдпрд╛ ^try(...)$ рдлрд╝реЙрд░реНрдо рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред

рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдВ try рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

рдЯреЗрдХреНрд╕реНрдЯ/рдЯреЗрдореНрдкрд▓реЗрдЯ

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        lessOrEqual, err := le(arg1, arg2)
        if err != nil {
                return false, err
        }
        return !lessOrEqual, nil
}

рдмрди рдЬрд╛рддрд╛ рд╣реИ:

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        return !try(le(arg1, arg2)), nil
}

рдЯреЗрдХреНрд╕реНрдЯ/рдЯреЗрдореНрдкрд▓реЗрдЯ

func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
        switch v.Kind() {
        case reflect.Map:
                index, err := prepareArg(index, v.Type().Key())
                if err != nil {
                        return reflect.Value{}, err
                }
                if x := v.MapIndex(index); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}

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

func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
        ...
        switch v.Kind() {
        case reflect.Map:
                if x := v.MapIndex(try(prepareArg(index, v.Type().Key()))); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}

(рдпрд╣ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╕рдмрд╕реЗ рд╕рдВрджрд┐рдЧреНрдз рдЙрджрд╛рд╣рд░рдг рд╣реИ)

рд░реЗрдЧреЗрдХреНрд╕рдкреА/рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕:

regexp/syntax/parse.go

func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        if c, t, err = nextRune(t); err != nil {
                return nil, err
        }
        p.literal(c)
        ...
}

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

func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        c, t = try(nextRune(t))
        p.literal(c)
        ...
}

рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ c рдФрд░ t рдХреЗ рдорд╛рди if рдХрдерди рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рд╣ рд░рд╣реЗ рд╣реИрдВред

рдиреЗрдЯ/http

рдиреЗрдЯ/http/request.go:readRequest

        mimeHeader, err := tp.ReadMIMEHeader()
        if err != nil {
                return nil, err
        }
        req.Header = Header(mimeHeader)

рдмрди рдЬрд╛рддрд╛ рд╣реИ:

        req.Header = Header(try(tp.ReadMIMEHeader())

рдбреЗрдЯрд╛рдмреЗрд╕/рдПрд╕рдХреНрдпреВрдПрд▓

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                connector, err := driverCtx.OpenConnector(dataSourceName)
                if err != nil {
                        return nil, err
                }
                return OpenDB(connector), nil
        }

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

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                return OpenDB(try(driverCtx.OpenConnector(dataSourceName))), nil
        }

рдбреЗрдЯрд╛рдмреЗрд╕/рдПрд╕рдХреНрдпреВрдПрд▓

        si, err := ctxDriverPrepare(ctx, dc.ci, query)
        if err != nil {
                return nil, err
        }
        ds := &driverStmt{Locker: dc, si: si}

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

        ds := &driverStmt{
                Locker: dc,
                si: try(ctxDriverPrepare(ctx, dc.ci, query)),
        }

рдиреЗрдЯ/http

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                cc, err := p.t.dialclientconn(addr, singleuse)
                if err != nil {
                        return nil, err
                }
                return cc, nil
        }

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

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                return try(p.t.dialclientconn(addr, singleuse))
        }

рдиреЗрдЯ/http

func (f *http2Framer) endWrite() error {
        ...
        n, err := f.w.Write(f.wbuf)
        if err == nil && n != len(f.wbuf) {
                err = io.ErrShortWrite
        }
        return err
}

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

func (f *http2Framer) endWrite() error {
        ...
        if try(f.w.Write(f.wbuf) != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

(рдпрд╣ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рд╣реИред)

рдиреЗрдЯ/http

        if f, err := fr.ReadFrame(); err != nil {
                return nil, err
        } else {
                hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
        }

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

        hc = try(fr.ReadFrame()).(*http2ContinuationFrame)// guaranteed by checkFrameOrder

}

(рдЕрдЪреНрдЫрд╛ рднреАред)

рд╢реБрджреНрдз :

        if ctrlFn != nil {
                c, err := newRawConn(fd)
                if err != nil {
                        return err
                }
                if err := ctrlFn(fd.ctrlNetwork(), laddr.String(), c); err != nil {
                        return err
                }
        }

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

        if ctrlFn != nil {
                try(ctrlFn(fd.ctrlNetwork(), laddr.String(), try(newRawConn(fd))))
        }

рд╢рд╛рдпрдж рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

        if ctrlFn != nil {
                c := try(newRawConn(fd))
                try(ctrlFn(fd.ctrlNetwork(), laddr.String(), c))
        }

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореИрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рдкрд░ try рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдХрд╛рдлреА рдЖрдирдВрдж рд▓реЗрддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрдврд╝рд╛ рд╣реИред

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

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

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

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        try lessOrEqual := le(arg1, arg2)
        return !lessOrEqual, nil
}
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
        ...
        switch v.Kind() {
        case reflect.Map:
                try index := prepareArg(index, v.Type().Key())
                if x := v.MapIndex(index); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}
func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        try c, t = nextRune(t)
        p.literal(c)
        ...
}
        try mimeHeader := tp.ReadMIMEHeader()
        req.Header = Header(mimeHeader)
        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                try connector := driverCtx.OpenConnector(dataSourceName)
                return OpenDB(connector), nil
        }

рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдпрдХреАрдирди рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛- try рдЕрдЧрд░ рдРрд╕реЗ рдХрдИ рдХреНрд╖реЗрддреНрд░ рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ try -ed рд╣реЛрдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд╕рдВрддреБрд▓рди рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ

        try si := ctxDriverPrepare(ctx, dc.ci, query)
        ds := &driverStmt{Locker: dc, si: si}

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╣реИ рдФрд░ рдпрд╣ рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ:

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                try cc := p.t.dialclientconn(addr, singleuse)
                return cc, nil
        }

рдореИрдВрдиреЗ рдЦреБрдж рд╕реЗ рдмрд╣рд╕ рдХреА рдХрд┐ рдХреНрдпрд╛ if try рдХрд╛рдиреВрдиреА рд╣реЛрдЧрд╛ рдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЙрдЪрд┐рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрд╛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдпрд╣рд╛рдВ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

func (f *http2Framer) endWrite() error {
        ...
        if try n := f.w.Write(f.wbuf); n != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}
        try f := fr.ReadFrame()
        hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
        if ctrlFn != nil {
                try c := newRawConn(fd)
                try ctrlFn(fd.ctrlNetwork(), laddr.String(), c)
        }

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

func (f *http2Framer) endWrite() error {
        ...
        if try(f.w.Write(f.wbuf) != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

рд╕рд╛рде рд╣реА, try рдХреБрдЫ рднреА "рдХреЛрд╢рд┐рд╢" рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдПрдХ "рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рд░рд┐рд▓реЗ" рд╣реИред рдпрджрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЖрдзрд╛рд░ рд╢рдмреНрджрд╛рд░реНрде рдмрдВрдж рд╣реИ, рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рднреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред

func (f *http2Framer) endWrite() error {
        ...
        relay n := f.w.Write(f.wbuf)
        return checkShortWrite(n, len(f.wbuf))
}

рдпрджрд┐ рдЖрдк рдПрдХ рдмрдпрд╛рди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп, рдФрд░ рдХреМрди рд╕реА рдХреНрд░рд┐рдпрд╛:

try c, @      := newRawConn(fd) // return
try c, <strong i="6">@panic</strong> := newRawConn(fd) // panic
try c, <strong i="7">@hname</strong> := newRawConn(fd) // invoke named handler
try c, <strong i="8">@_</strong>     := newRawConn(fd) // ignore, or invoke "ignored" handler if defined

рдХрдо рд╕реЗ рдХрдо рдШрдмрд░рд╛рд╣рдЯ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрднреА рднреА рдПрдХ рдЙрдк-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд░рд╕ рдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд▓рдЧрднрдЧ 200 рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдКрдкрд░ рдЙрдирдХреЗ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП @crawhaw рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред

рджреВрд╕рд░рд╛, @jimmyfrasche , рдпрд╣рд╛рдВ http2Framer рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:


рдореИрдВрдиреЗ рдЦреБрдж рд╕реЗ рдмрд╣рд╕ рдХреА рдХрд┐ рдХреНрдпрд╛ if try рдХрд╛рдиреВрдиреА рд╣реЛрдЧрд╛ рдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЙрдЪрд┐рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрд╛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдпрд╣рд╛рдВ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

```
func (f *http2Framer) рдПрдВрдбрд░рд╛рдЗрдЯ () рддреНрд░реБрдЯрд┐ {
...
рдЕрдЧрд░ рдХреЛрд╢рд┐рд╢ n := fwWrite(f.wbuf); n!= рд▓реЗрди(f.wbuf) {
рд╡рд╛рдкрд╕реА io.ErrShortWrite
}
рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп
}

At least under what I was suggesting above in https://github.com/golang/go/issues/32437#issuecomment-500213884, under that proposal variation I would suggest `if try` is not allowed.

That `http2Framer` example could instead be:

func (f *http2Framer) рдПрдВрдбрд░рд╛рдЗрдЯ () рддреНрд░реБрдЯрд┐ {
...
рдХреЛрд╢рд┐рд╢ n:= fwWrite(f.wbuf)
рдЕрдЧрд░ n!= рд▓реЗрди(f.wbuf) {
рд╡рд╛рдкрд╕реА io.ErrShortWrite
}
рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп
}
`` That is one line longer, but hopefully still "light on the page". Personally, I think that (arguably) reads more cleanly, but more importantly it is easier to see the рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ'ред

@deanveloper рдиреЗ рдКрдкрд░ https://github.com/golang/go/issues/32437#issuecomment -498932961 рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ:

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рд▓реМрдЯрдирд╛ рдПрдХ "рдкрд╡рд┐рддреНрд░" рдмрд╛рдд рдереА

рд╡рд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ http2Framer рдЙрджрд╛рд╣рд░рдг рдЙрддрдирд╛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡рддрдГ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рдЕрдзрд┐рдХ "рдкрд╡рд┐рддреНрд░" рд▓реМрдЯрддрд╛ рд╣реИ рдпрджрд┐ try рдПрдХ рд▓рд╛рдЗрди рдкрд░ рдкрд╣рд▓реА рдЪреАрдЬ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

@ рдХреНрд░реЙрд╢реЙ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛:

рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХрдо, 10 рдореЗрдВ 1 рд╕реЗ рдХрдо, рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓рд╛ рдкреНрд░рдкрддреНрд░ x := try(...) рдпрд╛ ^try(...)$ рдХреЗ рд╡рд┐рд╡рд░рдг рд╣реИрдВред

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

@jimmyfrasche

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

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

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        try lessOrEqual := le(arg1, arg2)
        return !lessOrEqual, nil
}

рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ- try ред рдЖрдкрдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдореБрдЭреЗ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдЪрд░ рдореЗрдВ le рдкрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрд╕ рдЪрд░ рдХрд╛ рдХреЛрдИ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╢рдмреНрдж le рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд░реНрде рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рддреЛ рдРрд╕рд╛ рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдпрд╛ рддреЛ рдЕрд░реНрдерд╣реАрди рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ x ) рдпрд╛ рдмреЗрдорд╛рдиреА (рдЬреИрд╕реЗ lessOrEqual )ред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде- try , рдХрд┐рд╕реА рдордзреНрдпрд╡рд░реНрддреА рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рднреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдореБрдЭреЗ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╛рдореЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╕рд┐рдХ рдкреНрд░рдпрд╛рд╕ рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ рдЬреЛ рдмреЗрд╣рддрд░ рдЧреБрдордирд╛рдо рд░рд╣ рдЧрдП рд╣реИрдВред

рдореБрдЭреЗ рдкрд┐рдЫрд▓реА рдХреБрдЫ рдкреЛрд╕реНрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рдорд░реНрдерди рджреЗрдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИ рдЬрд╣рд╛рдВ try (рдХреАрд╡рд░реНрдб) рдХреЛ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ return рдХреЗ рд╕рдорд╛рди рджреГрд╢реНрдп рд╕реНрдерд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХреЛрдг рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ try s рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред try / else рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрд╛рдж рдХреА рд╢рд░реНрддреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдЬреЛ рдХрд┐ рдХрдИ I/O рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬреЛ err рдФрд░ n рджреЛрдиреЛрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ

func (f *http2Framer) endWrite() error {
        // ...
        try n := f.w.Write(f.wbuf) else err {
                return errors.Wrap(err, "error writing:")
        } else if n != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк .Write рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдПрдиреЛрдЯреЗрд╢рди рд╣реЛрдЧрд╛ рдХрд┐ .Write рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ @thepudds рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

func (f *http2Framer) endWrite() error {
        // ...
        try n := f.w.Write(f.wbuf)
        if n != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

рдореИрдВ рджреВрд╕рд░рд╛ @daved рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдЬрд┐рд╕реЗ @crawshaw рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдФрд░ try рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реЛ рдЧрдпрд╛ред

рдореБрдЭреЗ рдкрд┐рдЫрд▓реА рдХреБрдЫ рдкреЛрд╕реНрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рдорд░реНрдерди рджреЗрдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИ рдЬрд╣рд╛рдВ try (рдХреАрд╡рд░реНрдб) рдХреЛ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ return рдХреЗ рд╕рдорд╛рди рджреГрд╢реНрдп рд╕реНрдерд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдПред)

try f := os.Open(filepath) else err {
    return errors.Wrap(err, "can't open")
}

рдмреАред)

f := try os.Open(filepath) else err {
    return errors.Wrap(err, "can't open")
}

рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирдП рдХреАрд╡рд░реНрдб рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ? _(рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЧрд╣рд░реА рдХрд▓рд╛ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рд╣реИред)_ рдХреНрдпрд╛ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реАрдорд┐рдд рд╣реЛрдЧрд╛?

@davecheney @daved @crawshaw
рдореИрдВ рдЗрд╕ рдкрд░ рдбреЗрд╡ рдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: @ рдХреНрд░реЙрд╢реЙ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ try рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИрдВ рдЬреЛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЧрд╣рд░реЗ рдПрдореНрдмреЗрдбреЗрдб рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдмрд╣реБрдд рд╕реА рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЪрд▓ рд░рд╣реА рд╣реИрдВред рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, try рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдмрд╣реБрдд рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВред

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

  • try рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ
  • рдХреЗрд╡рд▓ рдПрдХ try рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐
  • try рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдЯреЗрдХреНрд╕реНрдЯ/рдЯреЗрдореНрдкрд▓реЗрдЯ

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        lessOrEqual, err := le(arg1, arg2)
        if err != nil {
                return false, err
        }
        return !lessOrEqual, nil
}

рдмрди рдЬрд╛рддрд╛ рд╣реИ:

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        try lessOrEqual := le(arg1, arg2)
        return !lessOrEqual, nil
}

рдЯреЗрдХреНрд╕реНрдЯ/рдЯреЗрдореНрдкрд▓реЗрдЯ

func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
        switch v.Kind() {
        case reflect.Map:
                index, err := prepareArg(index, v.Type().Key())
                if err != nil {
                        return reflect.Value{}, err
                }
                if x := v.MapIndex(index); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}

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

func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
        ...
        switch v.Kind() {
        case reflect.Map:
                try index := prepareArg(index, v.Type().Key())
                if x := v.MapIndex(index); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}

рд░реЗрдЧреЗрдХреНрд╕рдкреА/рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕:

regexp/syntax/parse.go

func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        if c, t, err = nextRune(t); err != nil {
                return nil, err
        }
        p.literal(c)
        ...
}

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

func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        try c, t = nextRune(t)
        p.literal(c)
        ...
}

рдиреЗрдЯ/http

рдиреЗрдЯ/http/request.go:readRequest

        mimeHeader, err := tp.ReadMIMEHeader()
        if err != nil {
                return nil, err
        }
        req.Header = Header(mimeHeader)

рдмрди рдЬрд╛рддрд╛ рд╣реИ:

        try mimeHeader := tp.ReadMIMEHeader()
        req.Header = Header(mimeHeader)

рдбреЗрдЯрд╛рдмреЗрд╕/рдПрд╕рдХреНрдпреВрдПрд▓

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                connector, err := driverCtx.OpenConnector(dataSourceName)
                if err != nil {
                        return nil, err
                }
                return OpenDB(connector), nil
        }

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

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                try connector := driverCtx.OpenConnector(dataSourceName)
                return OpenDB(connector), nil
        }

рдбреЗрдЯрд╛рдмреЗрд╕/рдПрд╕рдХреНрдпреВрдПрд▓

        si, err := ctxDriverPrepare(ctx, dc.ci, query)
        if err != nil {
                return nil, err
        }
        ds := &driverStmt{Locker: dc, si: si}

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

        try si := ctxDriverPrepare(ctx, dc.ci, query)
        ds := &driverStmt{Locker: dc, si: si}

рдиреЗрдЯ/http

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                cc, err := p.t.dialclientconn(addr, singleuse)
                if err != nil {
                        return nil, err
                }
                return cc, nil
        }

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

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                try cc := p.t.dialclientconn(addr, singleuse)
                return cc, nil
        }

рдиреЗрдЯ/http
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдХреЛрдИ рд▓рд╛рдЗрди рдирд╣реАрдВ рдмрдЪрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ if err == nil рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрдорд╛рдг рд╣реИред

func (f *http2Framer) endWrite() error {
        ...
        n, err := f.w.Write(f.wbuf)
        if err == nil && n != len(f.wbuf) {
                err = io.ErrShortWrite
        }
        return err
}

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

func (f *http2Framer) endWrite() error {
        ...
        try n := f.w.Write(f.wbuf)
        if n != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

рдиреЗрдЯ/http

        if f, err := fr.ReadFrame(); err != nil {
                return nil, err
        } else {
                hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
        }

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

        try f := fr.ReadFrame()
        hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
}

рдЬрд╛рд▓:

        if ctrlFn != nil {
                c, err := newRawConn(fd)
                if err != nil {
                        return err
                }
                if err := ctrlFn(fd.ctrlNetwork(), laddr.String(), c); err != nil {
                        return err
                }
        }

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

        if ctrlFn != nil {
                try c := newRawConn(fd)
                try ctrlFn(fd.ctrlNetwork(), laddr.String(), c)
        }

@ James-lawrence https://github.com/golang/go/issues/32437#issuecomment -500116099 рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ: рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ , err рдЬреИрд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдирд╣реАрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдкрд┐рдЫрд▓рд╛ error рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдореМрдЬреВрджрд╛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ред

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рддреНрд░реБрдЯрд┐ рдФрд░ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ if err != nil рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдмрд╛рд╣рд░реА рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдпрд╣ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

func handler(err *error) {
  if *err != nil {
    *err = handle(*err)
  }
} 

рдЬреЛ рдХреА рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

defer handler(&err)

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

рдЖрдВрддрд░рд┐рдХ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдпрд╣ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

defer func() {
  if err != nil {
    err = handle(err)
  }
}()

рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рд╣реА рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╕рд╛рд░рдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func catch(err *error, handle func(error) error) {
  if *err != nil && handle != nil {
    *err = handle(*err)
  }
}

рдпрд╣ nil рд╣реИрдВрдбрд▓рд░ funcs рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдкрд░ @griesemer рдХреА рдЪрд┐рдВрддрд╛ рд╕реЗ рджреВрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ defer рдФрд░ func(err error) error рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ err рдирд╛рдо рднреА рд╣реИ

рдпрджрд┐ try рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ catch рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХрд╛ рднреА рдЕрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡рд░реНрдгрди рдиреАрдЪреЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ handle рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛:

catch err {
  return handleThe(err)
}

рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдЖрдВрддрд░рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЪреАрдиреА рд╣реЛрдЧреА:

defer func() {
  if err != nil {
    err = handleThe(err)
  }
}()

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

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

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

рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП catch рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП try рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЪреВрдВрдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рдЪреАрдиреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП try рдХреЗ рд╕рд╛рде try catch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред catch рд╣реИрдВрдбрд▓рд░ рддрдм рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЧреИрд░- nil рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рддреНрд╡рд░рд┐рдд рд▓реЙрдЧрд┐рдВрдЧ рдореЗрдВ рдЪрд┐рдкрдХреЗ рд░рд╣рдирд╛:

catch err {
  log.Print(err)
  return err
}

рдпрд╛ рдмрд╕ рд╕рднреА рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдирд╛:

catch err {
  return fmt.Errorf("foo: %w", err)
}

@ianlancetaylor

_" рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдкрд┐рдЫрд▓рд╛ error рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдореМрдЬреВрджрд╛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ред"_

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

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

рдХреНрдпрд╛ рдЖрдк рдПрдХ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓реЗрдЧрд╛? рдореЗрд░реЗ рд▓рд┐рдП рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ _ "рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА" рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рдЖ рдЧрдП рд╣реИрдВ рдпрд╛ _ "рдореИрдВ рдЖрд▓рд╕реА рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рд╢рд╛рдпрдж рдирд╣реАрдВ рд╣реЛрдЧреАред" _

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

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

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


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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреИрдХреЗрдЬ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?


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

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

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

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

try рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрдардиреАрдпрддрд╛ (рдмрдирд╛рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓) рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдо рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред @brynbellomy @crawshaw рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

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

рд╕рд╢рд░реНрдд рд╡рд╛рдкрд╕реА рдкрд░ рдЫреЛрдЯрд╛ рдкреНрд░рд╕реНрддрд╛рд╡

рдЕрдВрд╢:

err, thing := newThing(name)
refuse nil, err

рдореИрдВрдиреЗ рдЗрд╕реЗ "рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ" рдХреЗ рддрд╣рдд рд╡рд┐рдХреА рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛

рдХреБрдЫ рди рдХрд░рдирд╛ рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рд▓рдЧрддрд╛ рд╣реИред

@alexhornbake рдЬреЛ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛

assert(nil, err)
assert(len(a), len(b))
assert(true, condition)
assert(expected, given)

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

рджрд┐рдП рдЧрдП рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@alexhornbake

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

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

        req.Header = Header(try(tp.ReadMIMEHeader())

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

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                return OpenDB(try(driverCtx.OpenConnector(dataSourceName))), nil
        }

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

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

        ds := &driverStmt{
                Locker: dc,
                si: try(ctxDriverPrepare(ctx, dc.ci, query)),
        }   

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдб рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред try рдХреЗ рдмрд┐рдирд╛, рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ ред рдореЗрд░реА рдЖрдБрдЦреЗрдВ рдЗрд╕ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдШреВрдореЗрдВрдЧреА рдЬреИрд╕реЗ "рдареАрдХ рд╣реИ, рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ ... рдЖрдЧреЗ рдмрдврд╝рдирд╛ .." рдФрд░ рдЗрд╕реЗ рдпрд╛рдж рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЗ рдХрд╛рд░реНрдп рдХреЛ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕рдВрднрд╡ рд╣реЛрддрд╛, рдЕрдЧрд░ ctxDriverPrepare рдШрдмрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ... рдФрд░ рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ 1.) рдореВрд▓ рд░реВрдк рд╕реЗ рдХрднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ 2.) рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рдмрд╣реБрдд рдЧрд▓рдд рд╣реИред

рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рдФрд░ рдПрдХ рдмрдпрд╛рди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдмрд╣реБрдд рд╕реЗ рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдЦрд░рд╛рдм рд╕рдВрд╕реНрдХрд░рдг рдкрд┐рдЫрд▓реА рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред

@daved рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рдирд╛рдо рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ?

рд╡реИрд╕реЗ рднреА, рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ ... рдпрджрд┐ рдХрд╛рдиреВрдиреА рд░реБрдЪрд┐ рд╣реИ рддреЛ рдореИрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ (рд╢рд╛рдпрдж рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ?) рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЕрдВрдЧреВрдареЗ рдКрдкрд░/рдиреАрдЪреЗ рджреЗрдВрдЧреЗ рд╣рдореЗрдВ рдПрдХ рднрд╛рд╡рдирд╛... рдмреЗрд╢рдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ "рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╢рд░реНрдд рд╡рд╛рдкрд╕реА" рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ @jimmyfrasche рджреНрд╡рд╛рд░рд╛ рдХреИрдЪ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИ, рдореИрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
go handler fmt.HandleErrorf("copy %s %s", src, dst)
рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:
go defer func(){ if(err != nil){ fmt.HandleErrorf(&err,"copy %s %s", src, dst) } }()
рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПрдЧреА:
go handler func(err *error){ *err = fmt.Errorf("foo: %w", *err) }() `
рдореЗрд░реЗ рдкрд╛рд╕ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ (рдЬреЛ рдкрдХрдбрд╝ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЧрд▓рддреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред fmt.HandleErrorf рдЬреИрд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рд╕реНрдердЧрд┐рдд рдХрд░рддреЗ рд╕рдордп, рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреЗ рд╕реВрдЪрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреЛрдИ рдЙрдЪрд┐рдд рдкрд╣рд▓рд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЧрд▓рддреА рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдХреНрдпреЛрдВ рджреЗ рд░рд╣рд╛ рд╣реИ?

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

@yiyus catch , рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ $#$2 catch #$ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдирд╛рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП err рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

catch err { рдореЗрдВ, err рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ catch рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рддреНрд░реБрдЯрд┐ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдХреА рддрд░рд╣ рд╣реИред

рдЗрд╕рдХреЗ рд╕рд╛рде, fmt.HandleErrorf рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдирд┐рдпрдорд┐рдд fmt.Errorf рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func f() error {
  catch err {
    return fmt.Errorf("foo: %w", err)
  }
  return errors.New("bar")
}

рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ foo: bar рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐:

  • try() рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкреИрд░реЗрдВрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
  • рдХреЛрдИ return рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред

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

  1. рдЗрд╕реЗ if x, err := thingie(); err != nil { handle(err) } рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try x := thingie else err { handle(err) } рдХреА рддрд░реНрдЬ рдкрд░ рд╕реБрдЭрд╛рд╡ рдЙрд╕ рдмрд╛рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗред рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ if рдХрд╣реЗрдВ?

  2. рдпрд╣ defer рдХреА рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рдпрд╣ рдЗрддрдирд╛ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рддрдВрддреНрд░ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрдЬреАрдм рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдЬрдм рд╣реИрдВрдбрд▓ рдФрд░ рдбрд┐рдлрд░ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреГрдкрдпрд╛ рдЗрди desiderata рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо try /handle рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рддрдВрддреНрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред

@carlmjohnson рдореБрдЭреЗ рдЖрдкрдХреЗ рдмрд┐рдВрджреБ 2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @jimmyfrasche рдХрд╛ catch рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ - рдпрд╣ defer рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рд╣реИ рдЬреЛ 2 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди (рдЬреЛ рдореЗрдВ) рдирд╛рдо рджреЗрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рдереЗ рддреЛ рдЖрдкрдХреЛ рдЕрдиреНрдп рд╕рднреА рдХреЗ рдирд╛рдо рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)ред рдпрд╣ defer рдХреЗ рд╕рд╛рде рдПрдХ рдСрд░реНрдереЛрдЧреЛрдиреИрд▓рд┐рдЯреА рдореБрджреНрджрд╛ рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ defer рд╣реИред

@ubombi рдиреЗ рдЬреЛ рдХрд╣рд╛ рдЙрд╕рдХреА рдЧреВрдВрдЬ:

try() рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкреИрд░реЗрдВрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред; рдХреЛрдИ рд╡рд╛рдкрд╕реА рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред

рд░реВрдмреА рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕ рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдХрд┐ try рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ... рдПрдХ рдкреНрд░реЛ рдХреЛрдб рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдмреНрд▓реЙрдХ рд╕реЗ рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХреЙрд▓рд░ рд╕реЗ рдЖрддрд╛ рд╣реИред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ try рдХрд░рддрд╛ рд╣реИ ... рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкреВрд░реНрд╡-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░реВрдмреА рдкреНрд░реЛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЙрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдереЗ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ proc functions рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ try рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ

рдореИрдВ рдЕрднреА рднреА if err != nil рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try рдЕрдзрд┐рдХ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рдЦрд░реАрдж рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

proc try(err *error, msg string) {
  if *err != nil {
    *err = fmt.Errorf("%v: %w", msg, *err)
    return
  }
}

рдФрд░ рдлрд┐рд░ рдЖрдк рдЗрд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func someFunc() (string, error) {
  err := doSomething()
  try(&err, "someFunc failed")
}

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

рдпрд╣ рдореВрд▓ Go2 рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ handle {} рдХреНрд▓реЙрдЬ рд╕реЗ рднреА рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреВрд░реЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд╣реАрдВред

рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ func() рдФрд░ рдПрдХ proc() рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ func() рдФрд░ proc!() рддрд╛рдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдПрдХ proc рдХреЙрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдиред

@ рдорд╛рд░рд╡рд╛рди-рдПрдЯ-рд╡рд░реНрдХ, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ try(err, "someFunc failed") try(&err, "someFunc failed") рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

@dpinela рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ :)

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

try := handler(err error) {     //which corelates with - try := func(err error) 
   if err !=nil{
       //do what ever you want to do when there's an error... log/print etc
       return2   //2 levels
   }
} 

рдФрд░ рдлрд┐рд░ рдПрдХ рдХреЛрдб рдЬреИрд╕реЗ
f := try(os.Open(filename))
рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ, рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ "рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди") рдХреЗ рд░реВрдк рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛрдЧрд╛, рдПрдХ рд╕рдорд╛рди рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЪрд╛рд░реЛрдВ рдУрд░ рд╣рд░ рдмрд╛рд░ fmt.Errorf ("рдПрд░рд░ рдУрдкрдирд┐рдВрдЧ рдлрд╛рдЗрд▓ %s ....") рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп os.Open рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдбред
рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рднреА рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ "рдХреЛрд╢рд┐рд╢" рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реИред

@guybrand рдЗрд╕ рддрд░рд╣ рдХреЗ рджреЛ-рд╕реНрддрд░реАрдп рд░рд┐рдЯрд░реНрди return2 (рдпрд╛ "рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рд░рд┐рдЯрд░реНрди" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕реНрдореЙрд▓рдЯрд╛рдХ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рддрдВрддреНрд░ рд╣реЛрдЧрд╛ (# 32473 рдореЗрдВ @mikeschinkel рджреНрд╡рд╛рд░рд╛ рднреА рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛) . рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдореЗрдВ рдЕрднреА рднреА try рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ return2 рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ - try рдХреЗрд╡рд▓ return рдХрд░ рд╕рдХрддрд╛ рд╣реИ try рднреА рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдордирдорд╛рдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

@griesemer

_"рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ return2 рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ - try рдмрд╕ return рдХрд░ рд╕рдХрддрд╛ рд╣реИред"_

рдПрдХ рдХрд╛рд░рдг - рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ #32473 _(рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж)_ рдореЗрдВ рдмрддрд╛рдпрд╛ - $#$ return рдХреЗ рдЕрд▓рд╛рд╡рд╛ break рдФрд░ continue рдХреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред

рд╕рднреА рдирдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж; рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рде рдмрдиреЗ рд░рд╣рдиреЗ рдФрд░ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдордп рдХрд╛ рдирд┐рд╡реЗрд╢ рд╣реИред рдФрд░ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдХрднреА-рдХрднреА рдЬреЛрд╢реАрд▓реЗ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рдЕрдм рддрдХ рдПрдХ рдирд╛рдЧрд░рд┐рдХ рдзрд╛рдЧрд╛ рд░рд╣рд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

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

1) рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, try рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ _at рдХрдо рд╕реЗ рдХрдо_ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ( @carloslenz "рдЗрд╕реЗ рдмрд┐рдирд╛ рдмрдпрд╛рди рдХреЗ рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ рдХреЛрд╖реНрдардХ"); try рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдкрдардиреАрдпрддрд╛ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИ ( @ChrisHines , @jimmyfrasche), рд╡реЗ " return рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдЯрд░реНрди" рд╣реИрдВред @brynbellomy рдиреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП try рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛; рдмрд╣реБрдд рдХрдо рдкреНрд░рддрд┐рд╢рдд-рд╡рд╛рд░ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреАрд╡рд░реНрдб рд░реВрдЯ w/o рдкрд░ рдЬрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

2) @crawhaw рдиреЗ рдПрд╕рдЯреАрдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреБрдЫ рд╕реМ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖред @jimmyfrasche рд╡рд┐рдкрд░реАрдд рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрдпрд╛ред

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

4) рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕реБрдЭрд╛рд╡ рд▓рд┐рдЦреЗред @zeebo , @patrick-nyt gofmt рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рд▓рд╛рдЗрди рдкрд░ рд╕рд░рд▓ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдлрд╝реЙрд░реНрдореЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдпрдерд╛рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЦреБрд╢ рд░рд╣реЗрдВ)ред @jargv рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ try() (рдмрд┐рдирд╛ рддрд░реНрдХреЛрдВ рдХреЗ) рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рд▓рдВрдмрд┐рдд" рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ defer рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛред @masterada рдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп errorfunc() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред @velovix рдиреЗ 2-рддрд░реНрдХ try рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рд╣реЛрдЧрд╛ред

@klaidliadon , @networkimprov рд╡рд┐рд╢реЗрд╖ "рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ" рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИрдВ рдЬреИрд╕реЗ f, # := os.Open() рдХреЗ рдмрдЬрд╛рдп try рдореЗрдВред @networkimprov рдиреЗ рдРрд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд╛рдпрд░ рдХрд┐рдпрд╛ (рджреЗрдЦреЗрдВ рдЕрдВрдХ #32500)ред @mikeschinkel рдиреЗ рджреЛ рдирдИ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реБрдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рджрд╛рдпрд░ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддреНрд░реБрдЯрд┐-рд╡рд┐рд╢рд┐рд╖реНрдЯ try рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕рдорд╕реНрдпрд╛ #32473 рджреЗрдЦреЗрдВ)ред @josharian рдиреЗ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдЧреЛрдлрд░рдХреЙрди рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ try рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ error (рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ) рдирд╛рдордХ рд▓реЗрдмрд▓ рдкрд░ рдХреВрджрддрд╛ рд╣реИ ( goto рдХреЗ рд╕рд╛рде) , try рд▓рдХреНрд╖реНрдп рд▓реЗрдмрд▓ рдХрд╛ рдирд╛рдо рд▓реЗ рд╕рдХрддрд╛ рд╣реИ)ред

5) рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ try рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╕рд╛рдордиреЗ рдЖрдИ рд╣реИрдВред @brynbellomy рдиреЗ рдПрдХ рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

a, b := try f()
a, b := try f() else err { /* handle error */ }

@thepudds рдПрдХ рдХрджрдо рдЖрдЧреЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ try рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, try рдХреЛ $#$24 return try рдХреЗ рд╕рдорд╛рди рджреГрд╢реНрдпрддрд╛ рджреЗрддрд╛ рд╣реИ:

try a, b := f()

рдпреЗ рджреЛрдиреЛрдВ defer рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@griesemer

@Mikeschinkel #32473 рдХреЗ рд░реЗрдлрд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╕рдорд╛рди рд╣реИред

рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

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

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

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

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬрд▓реНрдж рд╣реА рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХреВрдВрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ - рдЕрджреНрднреБрдд рдХрд╛рдо рдФрд░ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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

try a, b := f() else err { return fmt.Errorf("Decorated: %s", err); }
if a,b, err :=f;  err != nil { return fmt.Errorf("Decorated: %s", err); }
try a, b := f()
if a,b, err :=f;  err != nil { return err; }

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

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

a, b, err := doSomething()
try fmt.HandleErrorf(&err, "Decorated "...)

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

рдореИрдВ @daved рд╕реЗ рднреА рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдирд╛рдо рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдпрд╣рд╛рдВ рдЬреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ guard рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ else рдХреНрд▓реЙрдЬ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдПрдВ? рдХреБрдЫ рдЗрд╕ рддрд░рд╣

GuardStmt = "guard" ( Assignment | ShortVarDecl | Expression ) [  "else" Identifier Block ] .

рдЬрд╣рд╛рдВ Identifier рддреНрд░реБрдЯрд┐ рдЪрд░ рдирд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд Block рдореЗрдВ рдмрд╛рдзреНрдп рд╣реИред else рдЦрдВрдб рдХреЗ рд╕рд╛рде, рдмрд╕ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдПрдВ (рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдердЧрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред

рдореБрдЭреЗ рд╢реБрд░реВ рдореЗрдВ else рдХреНрд▓реЙрдЬ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕рд┐рд░реНрдл рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рдж if err != nil рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: guard рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

рдЬрдмрдХрд┐ рдореБрдЭреЗ рдХреЛрд╢рд┐рд╢-рдФрд░-рдХрдерди рдкрд╕рдВрдж рд╣реИ, рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

a, b, (err) := func() else { return err }

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ try - else рдПрдХ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рд╣реИред

a, b := try f() else err { ... }
fmt.Println(try g() else err { ... })`

рдХрдерди try - else рдПрдХ if рдХрдерди рд╣реИред

try a, b := f() else err { ... }
// (modulo scope of err) same as
a, b, err := f()
if err != nil { ... }

рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд┐рдд try рдпрд╛ рддреЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди (рдиреАрдЪреЗ) рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ, рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ)ред

a, b := try(f(), decorate)
// same as
a, b := try(g())
// where g is
func g() (whatever, error) {
  x, err := f()
  if err != nil {
    try(decorate(err))
  }
  return x, nil
}

рддреАрдиреЛрдВ рдиреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкрд░ рдХрдЯреМрддреА рдХреА рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХреАред

рдпрд╣ рдмрд┐рд▓реНрдЯрд┐рди try рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрдЪрдд рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

рдХрдерди try - else рдХреЗ рд▓рд┐рдП, рдпрд╣ $#$ try $#$ рдХреЗ рдмрдЬрд╛рдп if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдПрдХ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓рд╛рдн рдЗрддрдирд╛ рдорд╛рдореВрд▓реА рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдЦреБрдж рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддреЗ рд╣реБрдП рджреЗрдЦрдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред

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

рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ defer рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ else рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдереЛрдбрд╝рд╛ рджреЛрд╣рд░рд╛рд╡ рд╣реИ:

func printSum(a, b string) error {
  try x := strconv.Atoi(a) else err {
    return fmt.Errorf("printSum: %w", err)
  }
  try y := strconv.Atoi(b) else err {
    return fmt.Errorf("printSum: %w", err)
  }
  fmt.Println("result:", x + y)
  return nil
}

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдореЗрд░реА рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрд╣реЗрдВ, 100 рдореЗрдВ рд╕реЗ 1 рдмрд╛рд░, рдХреНрдпрд╛ try рд╕рд░рд▓ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ try рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ? рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдпрд╣ 10 рдореЗрдВ рд╕реЗ 1 рдмрд╛рд░ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ else /handler рдЬреЛрдбрд╝рдирд╛ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рддрдиреА рдмрд╛рд░ try рдмрд┐рдирд╛ else /рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдо try рдХреЗ рд╕рд╛рде else /рд╣реИрдВрдбрд▓рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбреЗрдЯрд╛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

рдореИрдВ @jimmyfrasche рдХреА рд╣рд╛рд▓рд┐рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд▓рдХреНрд╖реНрдп рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ

    a, b, err := f()
    if err != nil {
        return nil, err
    }

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

    try a, b := f() else err { return nil, err }

рдореИрдВ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд▓реЗрдХрд┐рди рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрддрдирд╛ рдмрдЪрдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдЧрд┐рдирддреА рд╕реЗ рд╣рдо 56 рд╕реЗ 46 рд╡рд░реНрдгреЛрдВ рдХреЛ рдХрдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдирд╣реАрдВ рд╣реИред рд╕реЗ рддреБрд▓рдирд╛

    a, b := try(f())

рдЬреЛ 56 рд╕реЗ 18 рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдХрдЯреМрддреА рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореАред рдФрд░ рдЬрдмрдХрд┐ try рдХрдерди рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдореБрдЭреЗ рдпрд╣ рдХрдерди рдЕрдзрд┐рдХ рдкрдардиреАрдп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд▓рд╕ рд╕рд╛рдЗрдб рдкрд░ try рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

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

рджреВрд╕рд░реЛрдВ рдХреА рддрд░рд╣, рдореИрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП @crawshaw рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдРрд╕реА рдорд╛рдирд╕рд┐рдХрддрд╛ рдЕрдкрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк try рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ, рд╢рд╛рдпрдж рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ, рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рдЬрд▓реНрджреА рд╣реА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рдкреНрд░рдХреГрддрд┐ рдмрди рдЬрд╛рдПрдЧрд╛ рдЬреЛ рднрд╛рд╖рд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд▓реЛрдЧ рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред try рдкрд░ рдЧреНрд▓реЗрдЬрд╝рд┐рдВрдЧ рдХрд░рддреЗ рд╣реБрдП рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА if err != nil { return err } рдкрд░ рдЧреНрд▓реЗрдЬрд╝ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред

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

  1. рдЗрд╕рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдмреЙрдпрд▓рд░ рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрдо рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред IMHO рдпрд╣ рдХреЛрдб рдХреЛ "рдЕрд╕реНрд╡реАрдХрд╛рд░" рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдордЬрдмреВрдд рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЬрд╛рдУ"рд╕рд┐рдВрдЯреИрдХреНрд╕ рдиреЗ рд╕рдорд╡рд░реНрддреА рдзрд╛рдЧреЗ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ред рдореБрдЭреЗ рдЙрд╕ рддрд░рд╣ рдХрд╛ "рдЖрд╣!" рдпрд╣рд╛рдБ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд▓рд╛рдЧрдд/рд▓рд╛рдн рдЕрдиреБрдкрд╛рдд рдХрд╛рдлреА рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред

  2. рдЗрд╕рдХрд╛ рдирд╛рдо рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдирд╣реАрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╕рд░рд▓рддрдо рд░реВрдк рдореЗрдВ, рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ: "рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреЙрд▓рд░ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ" рд▓реЗрдХрд┐рди рд╡рд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ :-) рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

  4. рдФрд░ рдлрд┐рд░ рднреА рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рд╡рд╣ рд╡рд┐рдХрд▓реНрдк рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

@ianlancetaylor
рдЕрдЧрд░ рдореИрдВ "рдЕрдиреНрдп рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ" рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ else рдмреНрд▓реЙрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ try a, b := f() else err { return nil, err } else рдХреНрд▓реЙрдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрдорд╛рдиреА рд╣реИ, рдФрд░ рдкреВрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреЗрд╡рд▓ try a, b := f() рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐ рд╡рд░реНрддрдорд╛рди

a, b, err := f()
if err != nil {
    return nil, err
}

рдЕрддреНрдпрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред
рдФрд░ рдЬрдм рд╕реЗ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ

if a, b, err := f(); err != nil {
    return nil, err
}

рд▓рдЧрднрдЧ рдкрдардиреАрдп рд╣реИ, рдлрд┐рд░ рднреА рдЗрд╕рдХрд╛ рджрд╛рдпрд░рд╛ "рдореБрджреНрджреЗ" рдерд╛, рд╢рд╛рдпрдж a

ifErr a, b, err := f() {
    return nil, err
}

рд╡рд╣ рдХреЗрд╡рд▓ ; рдЧрд╝рд▓рддреА != рд╢реВрдиреНрдп рднрд╛рдЧ, рдФрд░ рдХреЛрдИ рджрд╛рдпрд░рд╛ рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛, рдпрд╛

рдЙрд╕реА рдкреНрд░рдХрд╛рд░

рдП, рдмреА, рдПрд░рд░ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: = рдПрдл () {
рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп, рддреНрд░реБрдЯрд┐
}

рдЕрддрд┐рд░рд┐рдХреНрдд рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдкрдардиреАрдп рд╣реИред

рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ, 11 рдЬреВрди 2019, 20:19 рджрд┐рдорд┐рддреНрд░реА рдореИрдЯреНрд░реЗрдирд┐рдЪреЗрд╡, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@ianlancetaylor https://github.com/ianlancetaylor
рдЕрдЧрд░ рдореИрдВ "рдЕрдиреНрдп рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ" рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдмреНрд▓реЙрдХ
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
рдХреЛрд╢рд┐рд╢ рдП, рдмреА: = рдПрдл () рдФрд░ рдЧрд▓рддреА {рд╡рд╛рдкрд╕реА рд╢реВрдиреНрдп, рдЧрд▓рддреА} рдЕрдиреНрдп рдЦрдВрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ
рдмреЗрдорд╛рдиреА, рдФрд░ рдкреВрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдХреЛрд╢рд┐рд╢ рдП, рдмреА: = рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдПрдл()

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=ABNEY4XPURMASWKZKOBPBVDPZ7NALA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXH93Z94#VGOORPWSZ
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABNEY4SAFK4M5NLABF3NZO3PZ7NALNCNFSM4HTGCZ7Q
.

@ianlancetaylor

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

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

@ianlancetaylor рдЗрдХреЛрдЗрдВрдЧ @DmitriyMV , else рдмреНрд▓реЙрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВ рдЬреЛ рджреЛрдиреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ (рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдЧреИрд░-рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ try рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЕрдиреБрдкрд╛рдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╢рд╛рди рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ):

func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
    headRef, err := r.Head()
    if err != nil {
        return err
    }

    parentObjOne, err := headRef.Peel(git.ObjectCommit)
    if err != nil {
        return err
    }

    parentObjTwo, err := remoteBranch.Reference.Peel(git.ObjectCommit)
    if err != nil {
        return err
    }

    parentCommitOne, err := parentObjOne.AsCommit()
    if err != nil {
        return err
    }

    parentCommitTwo, err := parentObjTwo.AsCommit()
    if err != nil {
        return err
    }

    treeOid, err := index.WriteTree()
    if err != nil {
        return err
    }

    tree, err := r.LookupTree(treeOid)
    if err != nil {
        return err
    }

    remoteBranchName, err := remoteBranch.Name()
    if err != nil {
        return err
    }

    userName, userEmail, err := r.UserIdentityFromConfig()
    if err != nil {
        userName = ""
        userEmail = ""
    }

    var (
        now       = time.Now()
        author    = &git.Signature{Name: userName, Email: userEmail, When: now}
        committer = &git.Signature{Name: userName, Email: userEmail, When: now}
        message   = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
        parents   = []*git.Commit{
            parentCommitOne,
            parentCommitTwo,
        }
    )

    _, err = r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
    if err != nil {
        return err
    }
    return nil
}
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
    try headRef := r.Head()
    try parentObjOne := headRef.Peel(git.ObjectCommit)
    try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    try parentCommitOne := parentObjOne.AsCommit()
    try parentCommitTwo := parentObjTwo.AsCommit()
    try treeOid := index.WriteTree()
    try tree := r.LookupTree(treeOid)
    try remoteBranchName := remoteBranch.Name()
    try userName, userEmail := r.UserIdentityFromConfig() else err {
        userName = ""
        userEmail = ""
    }

    var (
        now       = time.Now()
        author    = &git.Signature{Name: userName, Email: userEmail, When: now}
        committer = &git.Signature{Name: userName, Email: userEmail, When: now}
        message   = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
        parents   = []*git.Commit{
            parentCommitOne,
            parentCommitTwo,
        }
    )

    try r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
    return nil
}

рдЬрдмрдХрд┐ try / else рдкреИрдЯрд░реНрди рдХрдВрдкрд╛рдЙрдВрдб if рдкрд░ рдХрдИ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХрд░рддрд╛ рд╣реИ:

  • рд╣реИрдВрдбрд▓ рди рдХрд┐рдП рдЧрдП try . рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ
  • рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рд╕рд╢рд░реНрдд рдмреНрд▓реЙрдХ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рд╣реИ
  • рд╣рдореЗрдВ рдЙрд╕ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдЕрдЬреАрдмрддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рджреЗрдВ рдЬреЛ рдХрдВрдкрд╛рдЙрдВрдб if s рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИ

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд┐рдирд╛ рдХреНрд░рд┐рдпрд╛ рдХреЗ try рд╕рдмрд╕реЗ рдЖрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

@ianlancetaylor

рдЧреНрд▓реЗрдЬрд╝рд┐рдВрдЧ рдУрд╡рд░ рдХреЗ рджреМрд░рд╛рди рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреНрд▓реЗрдЬрд╝рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп {рд╡рд╛рдкрд╕реА рдЧрд▓рддреА}ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡/рд╕рдорд╛рдирддрд╛ рдпреЛрдЧреНрдп рд╣реИред рдпрд╣ рдЧреБрдо рд╣реИ рдХрд┐ рдПрдХ рдХреЛрд╢рд┐рд╢ рдПрдХ рднреАрдбрд╝-рднрд╛рдбрд╝ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдпрд╛ рдХрд┐ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ ...

@ianlancetaylor

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

рдореЗрд░реА рдЖрдБрдЦреЗрдВ if err != nil { return err } рд╕реЗ рдЕрдзрд┐рдХ рдЪрдордХ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдпрд╣ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рддреБрд░рдВрдд рдкрдВрдЬреАрдХреГрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

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

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣рд╛рдБ рдпрд╛ рд╡рд╣рд╛рдБ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реЗрдЦрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдпрдерд╛рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХрдо рд░реЗрдЦрд╛рдПрдБ рд╣реИрдВред

@brynbellomy

  1. рдЖрдк рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
    func createMergeCommit(r *repo.Repo, index *git.Index, Remote *git.Remote, RemoteBranch *git.Branch) (рд╣реИрд╢, рддреНрд░реБрдЯрд┐) {
  2. рдЖрдк рдЙрд╕ рд╕рд╣реА рд▓рд╛рдЗрди рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдиреЗ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдИ рд╣реИ
  3. рджрд╛рдпрд░реЗ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░ (рдЬрд┐рд╕реЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {

    if headRef, err := r.Head(); err != nil {
        return err
    } else if parentObjOne, err := headRef.Peel(git.ObjectCommit); err != nil {
        return err
    } else parentObjTwo, err := remoteBranch.Reference.Peel(git.ObjectCommit); err != nil {
        return err
    } ...

рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ рдЗрддрдирд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА (рдпрд╛ fmt.Errorf ("рд╣реЗрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐:% s", err.Error() ) рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЕрднреА рднреА рдПрдХ рдирд╛рдЧ рд╣реИ

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

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ (рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ: рдкреА) рдЗрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ:

fail := func(err error) error {
  log.Print("unexpected error", err)
  return err
}

a, b, err := f1()          // normal
c, d := f2() -> throw      // calls throw(err)
e, f := f3() -> panic      // calls panic(err)
g, h := f4() -> t.Error    // calls t.Error(err)
i, j := f5() -> fail       // calls fail(err)

рдпрд╛рдиреА, рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдПрдХ -> handler рд╣реИ рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд▓реМрдЯрд╛рдИ рдЧрдИ рдЧрд▓рддреА != nil. рд╣реИрдВрдбрд▓рд░ рдХреЛрдИ рднреА рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ (рдпрд╛рдиреА, func(error) рдпрд╛ func(error) error )ред рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рддреЛ рдлрд╝рдВрдХреНрд╢рди рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЕрдиреНрдпрдерд╛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред

рддреЛ a := b() -> handler рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

a, err := b()
if err != nil {
  if herr := handler(err); herr != nil {
    return herr
  }
}

рдЕрдм, рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк try рдмрд┐рд▓реНрдЯрд┐рди (рдпрд╛ рдХреАрд╡рд░реНрдб рдпрд╛ ?= рдСрдкрд░реЗрдЯрд░ рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ a := b() -> throw рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХреЗрдВ:

func() error {
  a, b := try(f1())
  c, d := try(f2())
  e, f := try(f3())
  ...
  return nil
}() -> panic // or throw/fail/whatever

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдПрдХ ?= рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХреАрд╡рд░реНрдб/рдмрд┐рд▓рд┐рди рд╕реЗ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ:

func() error {
  a, b ?= f1()
  c, d ?= f2()
  e, f ?= f3()
  ...
  return nil
}() -> panic

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

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

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

рдХреЛрд╢рд┐рд╢ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред

func try(t1 T1, t2 T2, тАж tn Tn, te error) (T1, T2, тАж Tn)

рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ try рдкрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдЬреИрд╕рд╛ рдХрд┐ try(f()) рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЧреЛ рдореЗрдВ рдХрдИ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдореЗрд░реЗ рдкрдврд╝рдиреЗ рд╕реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдорд╛рдиреНрдп рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рджреЛрдиреЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВред

a, b = try(f())
//
u, v, err := f()
a, b = try(u, v, err)

рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде try рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рднреА рдмрдврд╝рд╛рддрд╛ рд╣реИред

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

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рд╣реИрдВрдбрд▓рд░ рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдпрд╛ рддреЛ рддрд░реНрдХ рд╕реВрдЪреА рдХреА рд╢реБрд░реБрдЖрдд рдпрд╛ рдЕрдВрдд рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

var h handler
a, b = try(h, f())
// or
a, b = try(f(), h)

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

func f() (handler, error) { ... }
func g() (error) { ... }
try(f())
try(h, g())

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

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

@рдЬрд╛рджреБрдИ

рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реЛрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рд╢рд╛рдпрдж:
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдШреЛрд╖рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдерд╛ рдХрд┐,

рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

var h handler
a, b, h = f()

рдпрд╛

a, b, h.err = f()

рдпрджрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕рд╛ рд╣реИ:

h:= handler(err error){
 log(...)
 return ....
} 

рддрдм рдЖрдЧреНрд░рд╣ рдерд╛

a, b, h(err) = f()

рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдФрд░ рдЖрдк рд╣реИрдВрдбрд▓рд░ рдХреЛ "рдЪрдпрди" рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рддреНрд░реБрдЯрд┐ (conitnue/рдмреНрд░реЗрдХ/рд░рд┐рдЯрд░реНрди) рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ varargs рдореБрджреНрджрд╛ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИред

@brynbellomy рдХреЗ else рд╕реБрдЭрд╛рд╡ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк:

a, b := try f() else err { /* handle error */ }

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

decorate := func(err error) error { return fmt.Errorf("foo failed: %v", err) }

try a, b := f() else decorate
try c, d := g() else decorate

рдФрд░ рд╢рд╛рдпрдж рдХреБрдЫ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рднреА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ:

decorate := fmt.DecorateErrorf("foo failed")

рдбреЗрдХреЛрд░реЗрд╢рди рдлрдВрдХреНрд╢рди рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ func(error) error рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрдВрдХреНрд╢рди рд╕реЗ рд░рд┐рдЯрд░реНрди рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ, рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ try рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ "рдбрд┐рдЬрд╝рд╛рдЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ" рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рднрд╛рд╡рдирд╛ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛:

f := try(os.Open(filename), handler)              // handler will be called in error case

рдЕрдЧрд░ рдХреЛрдИ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдпрд╛ рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп if (рдЬреИрд╕реЗ рд╡реЗ рдЖрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, https://github.com/golang/go/issues/32437#issuecomment -500949780 рдореЗрдВ @brynbellomy рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП try рдХреЗ рджреГрд╢реНрдп рд╕рдВрд░реЗрдЦрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд╣реИред

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

рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдореЗрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдпрд╣рд╛рдБ @brynbellomy рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ try рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╕рдВрд░реЗрдЦрдг рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП var рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ @thepudds рдиреЗ https://github.com/golang/go/issues рдореЗрдВ рдмрддрд╛рдпрд╛ рд╣реИред

package main

import (
    "fmt"
    "time"
)

func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
    var (
        headRef          = try(r.Head())
        parentObjOne     = try(headRef.Peel(git.ObjectCommit))
        parentObjTwo     = try(remoteBranch.Reference.Peel(git.ObjectCommit))
        parentCommitOne  = try(parentObjOne.AsCommit())
        parentCommitTwo  = try(parentObjTwo.AsCommit())
        treeOid          = try(index.WriteTree())
        tree             = try(r.LookupTree(treeOid))
        remoteBranchName = try(remoteBranch.Name())
    )

    userName, userEmail, err := r.UserIdentityFromConfig()
    if err != nil {
        userName = ""
        userEmail = ""
    }

    var (
        now       = time.Now()
        author    = &git.Signature{Name: userName, Email: userEmail, When: now}
        committer = &git.Signature{Name: userName, Email: userEmail, When: now}
        message   = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
        parents   = []*git.Commit{
            parentCommitOne,
            parentCommitTwo,
        }
    )

    _, err = r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
    return err
}

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИ рдХрд┐ try var рдмреНрд▓реЙрдХ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ var рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдкреВрд░реЗ рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рд╣реА рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрдм рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдХреНрд░рдоред

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

@thepudds

рдХреЛрд╢рд┐рд╢ рдП, рдмреА: = рдПрдл () рдФрд░ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП

рд╢рд╛рдпрдж рдпрд╣ рдореЗрд░реЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдЧрд╣рд░реА рдЬрд▓рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ a

try a, b := f() ;catch(decorate)

рдФрд░ рдПрдХ рдлрд┐рд╕рд▓рди рдврд▓рд╛рди a

a, b := f()
catch(decorate)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдХрд╣рд╛рдБ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ

    try headRef := r.Head()
    try parentObjOne := headRef.Peel(git.ObjectCommit)
    try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    try parentCommitOne := parentObjOne.AsCommit()
    try parentCommitTwo := parentObjTwo.AsCommit()
    try treeOid := index.WriteTree()
    try tree := r.LookupTree(treeOid)
    try remoteBranchName := remoteBranch.Name()

рд╕рд╛рде

    try ( 
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    parentCommitOne := parentObjOne.AsCommit()
    parentCommitTwo := parentObjTwo.AsCommit()
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
    remoteBranchName := remoteBranch.Name()
    )

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

    try(err) ( 
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    parentCommitOne := parentObjOne.AsCommit()
    parentCommitTwo := parentObjTwo.AsCommit()
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
    remoteBranchName := remoteBranch.Name()
    ); err!=nil {
      //handle the err
    }

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

рдмрд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХрд┐рд╕реА рдФрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рджреЗрдЦрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ gofmt рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЧрд▓ рд▓рд╛рдЗрди рд╕реНрд╡рд░реВрдкрдг, рдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

if f() { return nil, err }

рдХреГрдкрдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рд╣рдо рдПрдХ рдкрдВрдХреНрддрд┐ if рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдкрдВрдХреНрддрд┐ if рдмрдирд╛рдПрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

if f() then return nil, err

рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛, рдХреГрдкрдпрд╛ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдХреЛ рд╣рдЯрд╛рдХрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд▓рд╛рдж рдХреЛ рдЧрд▓реЗ рди рд▓рдЧрд╛рдПрдВ рдЬрд┐рд╕рд╕реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдХреБрдЫ рдмрд╛рддреЛрдВ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдЪрд░реНрдЪрд╛ рдХреА рдЧрд░реНрдореА рдореЗрдВ рднреВрд▓ рдЧрдП рд╣реЛрдВрдЧреЗ:

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

2) рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдЬрдм рддрдХ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕, рдпрд╛рдиреА, рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ (рдЬреИрд╕реЗ ... else err { ... } рдФрд░ рдЗрд╕реА рддрд░рд╣) рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рдЪрд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ: рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рд╕реНрдкрд╖реНрдЯ return рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рд╣реИ, рд╡рд╣ return рдХрдерди рд╕рднреА (рдЖрдорддреМрд░ рдкрд░ рд╢реВрдиреНрдп) рдкрд░рд┐рдгрд╛рдо рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирдЧреНрди рд╡рд╛рдкрд╕реА рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдЬрд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░рд┐рдЯрд░реНрди ( return nil, err , рдЖрджрд┐) рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡, рдФрд░ рдХреЛрдИ рднреА рд╡рд┐рдХрд▓реНрдк рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ return рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрд╕рд╕реЗ рджреВрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ _requires_ рдХрд┐ рдПрдХ рдирд╛рдо рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо (рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕рднреА рдкрд░рд┐рдгрд╛рдо) рддреНрд░реБрдЯрд┐ рдорд╛рди рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЛрдИ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рд╕рднреА рдкрд░рд┐рдгрд╛рдо рдорд╛рдиреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдордЬрдмреВрдд рднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреНрдп рд╕рднреА (рдЖрдорддреМрд░ рдкрд░ рд╢реВрдиреНрдп) рдкрд░рд┐рдгрд╛рдо рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрджреНрд░рд╡ рд╣реИ - рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдХреЛрдб рдХреА рд╕рдордЭ)ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд╛рдо рджреЗрдирд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рд╕рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдФрд░ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

@magical рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рд╣реА рд╕рдордп рдмрд╛рдж рдЗрд╕реЗ рджреЗрдЦрд╛ (рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рддрд╛рдХрд┐ рднреНрд░рдо рдкреИрджрд╛ рди рд╣реЛ)ред рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдЬреИрд╕рд╛ рд╣реИ, try рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдлрд┐рдХреНрд╕ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред (рдЬреИрд╕рд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА - рдЗрд╕реЗ рддрдм рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬрдм рдореИрдВрдиреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдФрд░ рдореМрдЬреВрджрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕рд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП try рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ - рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг, рдФрд░ рдЕрдзрд┐рдХрддрд░ рдмреЗрдХрд╛рд░ - try(a, b, c, handle) рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХрд╛ рд▓рд╛рднред)

try рдХреЗ рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдиреЗ рдЗрд╕реЗ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛: try(expr, handler) рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ (рдпрд╛ рд╢рд╛рдпрдж рджреЛ) рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрд╣рд▓реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрд╣реБ-рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛ рд╕рдХрддреА рд╣реИ (рдХреЗрд╡рд▓ рддрднреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓)ред рдЙрд╕ (рд╕рдВрднрд╡рддрдГ рдмрд╣реБ-рдореВрд▓реНрдпрд╡рд╛рди) рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЕрдВрддрд┐рдо рдорд╛рди error рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрд╕ рдорд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╢реВрдиреНрдп рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдЖрджрд┐ - рдмрд╛рдХреА рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

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

a, b := try(u, v, err)

рдЕрдм рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рдо рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ: рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдЬрдм рддрдХ a рдФрд░ b рдХреЛ рдкрд░рд┐рдгрд╛рдо рдирд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдпрд╣ рдХреЛрдб - рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

a, b := u, v  // we don't care if the assignment happens in case of an error
try(err)

(рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ if рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдпрд╣ рдорд╣рддреНрд╡рд╣реАрди рд▓рдЧрддрд╛ рд╣реИред

рдЙрд╕ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рд╕рднреА (рдЖрдорддреМрд░ рдкрд░ рд╢реВрдиреНрдп) рдкрд░рд┐рдгрд╛рдо рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ

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

@griesemer рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рднреА рдЗрд╕реА рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рд╣реВрдВред

рдПрдХ рдмрдпрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ try рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЯрд┐рдкреНрдкрдгреА: рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/golang/go/issues/32437#issuecomment -501035322, try рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред try рдХрдердиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореМрдЬреВрджрд╛ рдХреЛрдб if err != nil рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдирдП рдШреЛрд╖рд┐рдд рддреНрд░реБрдЯрд┐ рдЪрд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рд╕реЗ рд╡рд╣ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдореЗрдВ рдПрдХ рдирд╛рдорд╛рдВрдХрд┐рдд рд░рд┐рдЯрд░реНрди рд╡реЗрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝рдирд╛ рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдШреЛрд╖рдгрд╛/рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛ, рдФрд░ stmt рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реА рдПрдХ-рдкрдВрдХреНрддрд┐ рддреНрд░реБрдЯрд┐ рдвреВрдВрдвреЗрдВред

err := f() // followed by one of

on err, return err            // any type can be tested for non-zero
on err, return fmt.Errorf(...)
on err, fmt.Println(err)      // doesn't stop the function
on err, hname err             // handler invocation without parens
on err, ignore err            // optional ignore handler logs error if defined

if err, return err            // alternatively, use if

handle hname(err error, clr caller) { // type caller has results of runtime.Caller()
   if err == io.Bad { return err }
   fmt.Println(clr.name, err)
}

рдПрдХ try рдЙрдк-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдШрдмрд░рд╛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрднреА рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

f(try g()) // panic on error
f(try_ g()) // ignore any error

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

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

рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЭреЗ try рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдЗрд╕реЗ рдЪрдордХрд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдпрд╛ рдЪрдордХрд╛рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ:

рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

// Too hidden, it's in a crowded function with many symbols that complicate the function.

f, err := os.OpenFile(try(FileName()), os.O_APPEND|os.O_WRONLY, 0600)

// Not easy enough, the word "try" already increases horizontal complexity, and it
// being an expression only encourages more horizontal complexity.
// If this code weren't collapsed to multiple lines, it would be extremely
// hard to read and unclear as to what's executing when.

fullContents := try(io.CopyN(
    os.Stdout,
    try(net.Dial("tcp", "localhost:"+try(buf.ReadString("\n"))),
    try(strconv.Atoi(try(buf.ReadString("\n")))),
))

рдПрдХ рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

// easy to see while still not being too verbose

try name := FileName()
os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0600)

// does not allow for clever one-liners, code remains much more readable.
// also, the code reads in sequence from top-to-bottom.

try port := r.ReadString("\n")
try lengthStr := r.ReadString("\n")
try length := strconv.Atoi(lengthStr)

try con := net.Dial("tcp", "localhost:"+port)
try io.CopyN(os.Stdout, con, length)

рдЯреЗрдХрдЕрд╡реЗ

рдпрд╣ рдХреЛрдб рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реИ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЬреЛ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, try рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

  1. рднреАрдбрд╝-рднрд╛рдбрд╝ рд╡рд╛рд▓реЗ рднрд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  2. рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдорд▓реНрдЯреАрд▓рд╛рдЗрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬрд┐рдирдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

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

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

fullContents := try(io.CopyN(os.Stdout, try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))), try(strconv.Atoi(try(r.ReadString("\n"))))))

рдпрд╣ *bufio.Reader рд╕реЗ рдПрдХ рдкреЛрд░реНрдЯ рдкрдврд╝рддрд╛ рд╣реИ, рдПрдХ рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реА *bufio.Reader рд╕реЗ stdout рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрдИ рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╕рднреАред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдЦреНрдд рдХреЛрдбрд┐рдВрдЧ рд╕рдореНрдореЗрд▓рдиреЛрдВ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ gofmt рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдЦреНрдд рдХреЛрдбрд┐рдВрдЧ рд╕рдореНрдореЗрд▓рдиреЛрдВ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдЧреЛ рдореЗрдВ рдШреГрдгрд┐рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕реЗ рднрдпрд╛рдирдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ; рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рд┐рд░реНрдл рдордЬрдмреВрдд рдорд╛рдирджрдВрдб рдФрд░ рдЙрдкрдХрд░рдг рд╣реИрдВред рдЧреЛ рдХреЗ рдкрд╛рд╕ рднреА рд╣реИ goto ред

рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рдХрднреА-рдХрднреА рд▓реЛрдЧреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧреА рдордзреНрдпрд╡рд░реНрддреА рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХрдИ рдХрдердиреЛрдВ рдореЗрдВ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб try s рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░реВрдВрдЧрд╛ред

рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╣рдирд╛ рд╣реИ: рдЖрдЗрдП рднрд╛рд╖рд╛ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдХреАрдордд рдкрд░, рдЦрд░рд╛рдм рдХреЛрдб рдХреЛ рдЧреИрд░рдХрд╛рдиреВрдиреА рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рдХреЛ рд╕рд╛рдл рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рддрдВрддреНрд░ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдорд╛рдорд▓реЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рдирд╡реАрдп рдирд┐рд░реНрдгрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЧреЛ рдореЗрдВ рдШреГрдгрд┐рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕реЗ рднрдпрд╛рдирдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ; рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рд┐рд░реНрдл рдордЬрдмреВрдд рдорд╛рдирджрдВрдб рдФрд░ рдЙрдкрдХрд░рдг рд╣реИрдВред рдЧреЛ рднреА рдЧреЛрдЯреЛ рд╣реИред

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

рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╣рдирд╛ рд╣реИ: рдЖрдЗрдП рднрд╛рд╖рд╛ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдХреАрдордд рдкрд░, рдЦрд░рд╛рдм рдХреЛрдб рдХреЛ рдЧреИрд░рдХрд╛рдиреВрдиреА рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдб рдХреЛ рд╕рд╛рдл рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рддрдВрддреНрд░ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдорд╛рдорд▓реЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рдирд╡реАрдп рдирд┐рд░реНрдгрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдпрд╣ рд▓рд╛рднрдкреНрд░рдж рд╣реИред рд╣рдореЗрдВ рдХрд┐рд╕реА рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдЕрд╡реИрдз рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЦрд░рд╛рдм рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рдмреЗрд╣рддрд░ рдХреЛрдб рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @ianlancetaylor рдХреА рдЯрд┐рдкреНрдкрдгреА рддрдХ try рдХреЗ рдкреАрдЫреЗ рдХрдЪреНрдЪреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдмрд╛рдд рдирд╣реАрдВ рджреЗрдЦреА рд╣реИ (рд╕рднреА else { ... } рдХрдмрд╛рдбрд╝ рдХреЗ рдмрд┐рдирд╛), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

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

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

try (
    name := FileName()
    file := os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0600)
    port := r.ReadString("\n")
    lengthStr := r.ReadString("\n")
    length := strconv.Atoi(lengthStr)
    con := net.Dial("tcp", "localhost:"+port)
    io.CopyN(os.Stdout, con, length)
)

рдпрджрд┐ рд▓рдХреНрд╖реНрдп if err!= nil {return err} рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдерди рдкреНрд░рдпрд╛рд╕ рдЬреЛ рдХреЛрдб рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХреНрд╖рдорддрд╛ рд╣реИред

@beoran рдЙрд╕ рд╕рдордп, рдХреЛрд╢рд┐рд╢ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реЛ? рдмрд╕ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдЬрд╣рд╛рдВ рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдорд╛рди рдЧреБрдо рд╣реИ рдФрд░ рдЗрд╕реЗ рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдпрд╣ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХрдерди (рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓) рдерд╛ред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдФрд░ рднреА рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

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

@deanveloper

fullContents := try(io.CopyN(os.Stdout, try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))), try(strconv.Atoi(try(r.ReadString("\n"))))))

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

fullContents := try(io.CopyN(os.Stdout, 
                               try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))),
                                     try(strconv.Atoi(try(r.ReadString("\n"))))))

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

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

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдЗрдВрдбреЗрдВрдЯ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдЧреЛ рдПрдлрдПрдордЯреА рдХреЗ рд▓рд┐рдП рдпрд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдореИрдВ рджреЛ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрджрд╛рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрджреЛрдВ рдкрд░ рд░рдЦреВрдВрдЧрд╛ред

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

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

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

func foo() error {
    defer handleError(&err, etc)
    try(something())
}

рдпрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛:

func foo() (err error) {
    defer handleError(&err, etc)
    try(something())
}

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

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

func foo() error {
    f := func() error {
        defer handleError(&err, etc)
        try(something())
        return nil
    }
    return f()
}

рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ:

func foo() error {
    f := func() (err error) {
        defer handleError(&err, etc)
        try(something())
        return nil
    }
    return f()
}

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

try(try(os.Create(filename)).Write(data))

"рд╣рдо рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдЬреИрд╕реЗ рд░рд╕реНрдЯ" рдХреЗ рдЕрдВрддрд░реНрдЧрдд, рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдХрд╣рддреЗ рд╣реИрдВ:

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

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИред .() рдСрдкрд░реЗрдЯрд░ рддрдм рддрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдЬрдм рддрдХ рдЖрдк рдЧреЛ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдЪреИрдирд▓ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВред рдЕрдЧрд░ рд╣рдо рдПрдХ ? рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА рдЗрддрдирд╛ рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд░рд╕реНрдЯ ? рдСрдкрд░реЗрдЯрд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рдорд╛рдкрди рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рддрд░реНрдХ рд╕реВрдЪреА рд▓рдВрдмреА рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдпрд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдХреИрд╕реЗ рдПрдХ рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ ?() рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:

x := try(foo(a, b))

рдЖрдк рдХрд░реЗрдВрдЧреЗ:

x := foo?(a, b)

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

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

@ianlancetaylor рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рджрд░реНрдЬрдиреЛрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде try рдЙрдкрд╕рд░реНрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рджреЛ-рд╕реЗ-рдЪрд╛рд░ рд▓рд╛рдЗрди рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рджрд░реНрдЬрдиреЛрдВ рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд╛рди return рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрддрд╛рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, try ( else рдХреНрд▓реЙрдЬ рдХреЗ рд╕рд╛рде) рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖/рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реЛред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореВрд░реНрдд рд░реВрдк рд╕реЗ, рдкреБрди: рд╕рд╢рд░реНрдд if рднрд╛рд╡, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try -as-a-statement рд╕реЗ рдЕрдзрд┐рдХ рд▓реАрдб рдХреЛ рджрдлрди рдХрд░рддреЗ рд╣реИрдВ: рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд╢рд░реНрдд рдХреЗ рд╕рдорд╛рди рдкрдВрдХреНрддрд┐ рдкрд░ рд░рд╣рддрд╛ рд╣реИ , рд╕рд╢рд░реНрдд рд╕реНрд╡рдпрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднреАрдбрд╝-рднрд╛рдбрд╝ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЪрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдмреНрд▓реЙрдХ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдкрдХреЛ рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рдЙрди рдЪрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдПрдХ рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред

@ рдЬреЛрд╢реЗрд░рд┐рдпрди рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдЧреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЕрдХреНрд╕рд░ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдбреЗрдЯрд╛-рдЪрд╛рд▓рд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдЖрдк рднрдпрд╛рдирдХ рдЧреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕рднреНрдп рдЧреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИ)ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЦрд░рд╛рдм рдХреЛрдб рдХрд╛ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдХрд░рдг рд╣реИрдВ: рди рдХреЗрд╡рд▓ gofmt рдФрд░ go vet , рдмрд▓реНрдХрд┐ рд╣рдорд╛рд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ, рдФрд░ рд╕рдВрд╕реНрдХреГрддрд┐ рдЬрд┐рд╕реЗ рдЗрд╕ рд╕рдореБрджрд╛рдп рдиреЗ (рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ) рдЦреБрдж рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЙрди рд╕реБрдзрд╛рд░реЛрдВ рд╕реЗ рджреВрд░ рд░рд╣рдиреЗ рд╕реЗ рдирдлрд░рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд╣реАрдВ рдЦреБрдж рдХреЛ рдлреБрдЯрдЧрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@beoran рдпрд╣ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ try рдмреНрд▓реЙрдХ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдПрдХ рдЕрдирдЪрд╛рд╣реЗ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд▓реМрдЯрдирд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐: 1) рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЙрди рдирдП рдЧреЛ рдХреЛрдбрд░реНрд╕ рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЙрди рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ (рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдореЗрд░реА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИ; рдореБрдЭреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдмреБрджреНрдзрд┐ рдореЗрдВ рднрд░реЛрд╕рд╛ рд╣реИ), рдФрд░ 2) рдЗрд╕рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдореЗрдВ рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдЗрдВрдбреЗрдВрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреЛрдбрдмреЗрд╕ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореЗрд░реЗ рдХреЛрдб рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдореИрдВ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдореМрдЬреВрджрд╛ type / const / var рдмреНрд▓реЙрдХ рд╕реЗ рднреА рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рд╛рде рд╣реА, рдХреЗрд╡рд▓ рдРрд╕реЗ рдХреАрд╡рд░реНрдб рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреНрд▓реЙрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд╡реЗ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдг рдХрдерди рдирд╣реАрдВред

@yiyus рдореИрдВ рдХреАрд╡рд░реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЦреЛрдЬрдХрд░реНрддрд╛ (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ) рдЧреЛ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ try рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдЗрдВрдбреЗрдВрдЯ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рддреЛ рд╢рд╛рдпрдж рдХреЛрдИ try рдмреНрд▓реЙрдХ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ?

@rogpeppe рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕реВрдХреНрд╖реНрдо рдСрдкрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рдЙрди рдХреЙрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдХрднреА рднреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рд╡реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдШрдмрд░рд╛рдПрдВред рдпрд╛ рдХреЙрд▓ рдЬрд╣рд╛рдВ рдЖрдк рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рджреБрд░реНрд▓рдн рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВ, рддреЛ #32500 рджреЗрдЦреЗрдВред

рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ f(try g()) рдХреЛ https://github.com/golang/go/issues/32437#issuecomment -501074836 рдореЗрдВ рдПрдХ 1-рд▓рд╛рдЗрди рд╣реИрдВрдбрд▓рд┐рдВрдЧ stmt рдХреЗ рд╕рд╛рде рдШрдмрд░рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
on err, return ...

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ else рдореЗрдВ try ... else { ... } рдХреЛрдб рдХреЛ рджрд╛рдИрдВ рдУрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзрдХреНрдХрд╛ рджреЗрдЧрд╛, рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдмреНрд▓реЙрдХ рдХреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдХрдо рд╕реЗ рдХрдо 25 рд╡рд░реНрдг рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рде рд╣реА, рдЕрдм рддрдХ рдмреНрд▓реЙрдХ рдПрдХ рд╣реА рд▓рд╛рдЗрди рдкрд░ go fmt рддрдХ рдирд╣реАрдВ рд░рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ try else рдХреЗ рд▓рд┐рдП рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрди рдирдореВрдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдФрд░ рддреБрд▓рдирд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ else рдмреНрд▓реЙрдХ рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдкрд░ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдореИрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ else { рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдБред

@yiyus https://github.com/golang/go/issues/32437#issuecomment -501139662

@beoran рдЙрд╕ рд╕рдордп, рдХреЛрд╢рд┐рд╢ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реЛ? рдмрд╕ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдЬрд╣рд╛рдВ рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдорд╛рди рдЧреБрдо рд╣реИ рдФрд░ рдЗрд╕реЗ рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдпрд╣ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХрдерди (рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓) рдерд╛ред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдФрд░ рднреА рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ Go1 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА func foo() error рдХреЛ рдХреЗрд╡рд▓ foo() $ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреЙрд▓рд░ рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдореЗрдВ , error рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рджреЗрдЦреЗрдВ https://github.com/golang/go/issues/32437#issuecomment -500289410

@rogpeppe рдиреЗрд╕реНрдЯреЗрдб try рдХреЗ рд╕рд╛рде рдХреЛрд╖реНрдардХреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ: рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ try рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдкрд░ рдХреЛрдИ рд░рд╛рдп рд╣реИ? рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреА рджреЗрдЦреЗрдВред

@griesemer рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рдмрддрд╛рдП рдЧрдП рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреВрдирд░реА рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╣реБрдЖ рд╣реИ рдХрд┐ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг try рдХреЛ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдЯреБрдкрд▓ рдкрд░ рдЫрджреНрдо рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реЛрдЧрд╛:

 f := os.Open(path).try()

рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

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

рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ! . рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ рдХреБрдЫ рдкрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рд╣рдо рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреИрд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ?

for _,fp := range filepaths {
    f := os.Open(path).try(func(err error)bool{
        fmt.Printf( "Cannot open file %s\n", fp );
        continue;
    });
}

BTW, рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдмрдирд╛рдо try() рдкрд╕рдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдХрд┐ рд╢рд╛рдпрдж guard() рд▓реЗрдХрд┐рди рдореБрдЭреЗ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реЗ рдкрд╣рд▓реЗ рдирд╛рдо рдХреЛ рдмрд╛рдЗрдХ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрдирд╛рдо:

for _,fp := range filepaths {
    if f,err := os.Open(path);err!=nil{
        fmt.Printf( "Cannot open file %s\n", fp )
    }
}

?

рдореБрдЭреЗ try a,b := foo() рдХреЗ рдмрдЬрд╛рдп if err!=nil {return err} рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ if err!=nil {...} рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рдЪрд╛рд╣рд┐рдП (рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдЦреЛрдЬрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛)?

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

f, err := os.Open(path)  // normal Go \o/
on err, return fmt.Errorf("Cannot open %s, due to %v", path, err)

@networkimprov рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рднреА рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдФрд░ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╢рдмреНрдж рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реВрдВ ...

f, err := os.Open(path)
relay err { nil, fmt.Errorf("Cannot open %s, due to %v", path, err) }

// marginally shorter, doesn't trigger vertical formatting unless excessively wide
// enclosed expression restricted to a list of values that match the return args

рдпрд╛

f, err := os.Open(path)
relay(err) nil, fmt.Errorf("Cannot open %s, due to %v", path, err)

// somewhere between statement and func, prob more pleasing to type w/out completion
// trailing expression restricted to a list of values that match the return args
// maybe excessive width triggers linting noise - with a reformatter available
// providing a reformatter would make swapping old (narrow enough) code easy

@ рдбреЗрд╡рд┐рдб рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛! on err, ... рдХрд┐рд╕реА рднреА рд╕рд┐рдВрдЧрд▓-рдПрд╕рдЯреАрдПрдордЯреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

err := f() // followed by one of

on err, return err            // any type can be tested for non-zero
on err, return fmt.Errorf(...)
on err, fmt.Println(err)      // doesn't stop the function
on err, continue              // retry in a loop
on err, hname err             // named handler invocation without parens
on err, ignore err            // logs error if handle ignore() defined

handle hname(err error, clr caller) { // type caller has results of runtime.Caller()
   if err == io.Bad { return err } // non-local return
   fmt.Println(clr, err)
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: on рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЙрдзрд╛рд░ рд▓реЗрддрд╛ рд╣реИред рдореИрдВ if рдХреЛ рдУрд╡рд░рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдмреГрд╣рджрд╛рдиреНрддреНрд░?

рдореИрдВ relay рдХрд╛ рдХрд╛рдлреА рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛; рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рд░рд┐рдЯрд░реНрди-рдСрди-рдПрд░рд░?

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

*рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП , рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдФрд░ рдореИрдВ on рд╢рдмреНрдж рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдб рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдзрд╛рд░ рдФрд░ рд╕рдордЧреНрд░ рд░реВрдк рдкрд╕рдВрдж рд╣реИред

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

@eandre рдЖрдо рддреМрд░ рдкрд░, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдРрд╕реА рдЧрддрд┐рд╢реАрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХрдИ рд░реВрдк рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рдВрдЪрд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкрд░реЗрд╢рд╛рдиреА рднрд░рд╛ рд╣реИред

@networkimprov @daved рдореИрдВ рдЗрди рджреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдирд╛рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рд╡реЗ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди if err != nil { ... } рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╕реБрдзрд╛рд░ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рдпрд╣ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдпрд╛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ return рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛?

@brynbellomy рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдИ return рдирд╣реАрдВ рд╣реИред relay рдПрдХ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рд░рд┐рд▓реЗ рд╣реИ рдЬрд┐рд╕реЗ "рдпрджрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╣рд▓реЗ рд╕реЗ рдореЗрд░реЗ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

f, err := os.Open(path)
relay(err) nil, fmt.Errorf("Cannot open %s, due to %v", path, err)

рдХреБрдЫ рдРрд╕рд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

f, err := os.Open(path)
relay(err)

рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЬреЛ рд░рд┐рд▓реЗ рдХреЛ рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдпрд╛ рдирд╛рдорд┐рдд рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рднреА рдорд╛рди рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ)ред рдПрдХ рдФрд░ рд░реВрдк рдЬреЛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

wrap := func(err error, msg string) error {
    if err != nil {
        fmt.Errorf("%s: %s", msg, err)
    }
    return nil
}

// ...

f, err := os.Open(path)
relay(err, wrap(err, fmt.Sprintf("Cannot open %s", path)))

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

рдХреНрдпрд╛ _go fmt_ рдХреЛ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди if рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди case, for, else, var () рдХреА рдирд╣реАрдВ? рдореБрдЭреЗ рд╡реЗ рд╕рдм рдЪрд╛рд╣рд┐рдП, рдХреГрдкрдпрд╛ ;-)

рдЧреЛ рдЯреАрдо рдиреЗ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдПрд░рд░ рдЪреЗрдХ рдХреЗ рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

on err, return err рдХрдерди рджреЛрд╣рд░рд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕реНрдкрд╖реНрдЯ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред

@magical рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрджреНрдпрддрди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

func f() error {
  try(g())
  return nil
}

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

func f() error {
  try g()
}

( try $ -рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореБрдлреНрдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ, try -рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ: рд▓реЗрдХрд┐рди рдпрд╣ рдиреНрдпреВрдирддрдо рд╣реИ)

@jimmyfrasche try рдХреЛ рдПрдХ рдЯрд░реНрдорд┐рдиреЗрдЯрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдПрдХ рдХреАрд╡рд░реНрдб рди рд╣реЛ - рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА panic рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЙрд╕ рдмрд┐рдВрджреБ рдХреЗ рдЕрд▓рд╛рд╡рд╛, try рдПрдХ рд╕рдорд╛рдкреНрддрд┐ рдХрдерди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред

рд╕рднреА рдорд╛рдиреНрдп рдЕрдВрдХред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд╛рдкреНрддрд┐ рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ CopyFile , рдпрд╛ рдЗрд╕реЗ try(err) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдПрдХ if рдореЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ err != nil ред рд▓рд╛рдпрдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

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

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдКрдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЛрдб рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкрд╕рдВрдж рдпрд╛ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВ, рд╣рдо рдЦреБрдж рдХреЛ "рдХреНрдпрд╛ рдпрд╣ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░ рд╕рдордЭреМрддрд╛ рд╣реИ / рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ" рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд░реНрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ "рдХреЛрд╢рд┐рд╢" рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рдФрд░ рдСрд▓реНрдЯ-рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд╕реНрддреБрдирд┐рд╖реНрда рдорд╛рдирджрдВрдб рджрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  • рдХреНрдпрд╛ рдпрд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ?
  • рдкрдардиреАрдпрддрд╛
  • рднрд╛рд╖рд╛ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝реА рдЧрдИ
  • рддреНрд░реБрдЯрд┐ рдорд╛рдирдХреАрдХрд░рдг
  • рдЧреЛ-рдЗрд╢реЛ
    ...
    ...
  • рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рдпрд╛рд╕ рдФрд░ рдЬреЛрдЦрд┐рдо
    ...

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

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

рдпрджрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ , рд╣рдо рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md

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

рдорд╛рдирджрдВрдб += рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ, рдкреВрд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░

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

рдЪрд░реНрдЪрд╛ рдореВрд▓ рдореБрджреНрджреЗ рд╕реЗ рдереЛрдбрд╝реА рджреВрд░ рд╣реЛ рдЧрдИ рд╣реИред рдпрд╣ рднреА рдПрдХ рджрд░реНрдЬрди рдпрд╛ рддреЛ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкреНрд░рднреБрддреНрд╡ рдмрди рдЧрдпрд╛ рд╣реИ (рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреМрди рд╣реИрдВ) рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╣реИрд╢рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рддреЛ рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдорд┐рддреНрд░рд╡рдд рдЕрдиреБрд╕реНрдорд╛рд░рдХ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдПрдХ _specific_ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЙрдкрдиреНрдпрд╛рд╕ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ _not_ рдЕрдиреБрд░реЛрдз рд╣реИ (рдЬреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ _this_ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ)ред

рдЖрдЗрдП рдЪрд░реНрдЪрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдФрд░ рдЯреНрд░реИрдХ рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВред

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

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

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

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

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

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

рдзрдиреНрдпрд╡рд╛рджред

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

@griesemer
рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣реА рдореБрдЭреЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдпрджрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ , рд╣рдо рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md

рджреЛ рд╕рд╡рд╛рд▓:

  1. рдХреНрдпрд╛ рдЖрдк рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдпрджрд┐ рд╣рдо рдЕрдкрд╕рд╛рдЗрдб (рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХрдореА, рдкрдардиреАрдпрддрд╛, рдЖрджрд┐) рдмрдирд╛рдо рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ (рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ/рддреНрд░реБрдЯрд┐ рд░реЗрдЦрд╛ рд╕реНрд░реЛрдд рдХреА рдирд┐рдЪрд▓реА рдЯреНрд░реЗрд╕-рдХреНрд╖рдорддрд╛) рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрддреНрдпрдзрд┐рдХ рд▓рдХреНрд╖реНрдп рдП, рдмреА, рдХреБрдЫ рд╣рдж рддрдХ рд╣рд▓ рдХрд░рдирд╛ рд╣реИ c рдХреА рдорджрдж рдХрд░реЗрдВ, d, e . рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд╣реИ
    рдФрд░ рдЗрд╕рд╕реЗ "рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реИ", "рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рдХреЗ рд╕рднреА рдЕрд╡реНрдпрд╡рд╕реНрдерд╛рдУрдВ рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рддрдХрдиреАрдХреА рдореБрджреНрджреЛрдВ рдЬреИрд╕реЗ @magical рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред
    рдФрд░ "рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди XXX рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдбреА, рдИ рдмреЗрд╣рддрд░" рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рднреА рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред
  2. рдХрдИ рдЗрдирд▓рд╛рдЗрди рдкреЛрд╕реНрдЯ "рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреЗ рд╕реБрдЭрд╛рд╡" рд╣реИрдВ - рдореБрдЭреЗ рдЗрд╕рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд▓рд╛рдЗрди рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдиреНрд╣реЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдПрд▓рдПрдордХреЗрдбрдмреНрд▓реНрдпреВрд╡рд╛рдИрдЯреАред

рд╢реВрдиреНрдп рдЖрд░реНрдЧ (рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдмрд┐рд▓рд┐рди) рдХреЗ рд╕рд╛рде try() рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднреА рднреА рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИ рдпрд╛ рдЗрд╕реЗ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

@guybrand рдЕрдкрд╡реЛрдЯрд┐рдВрдЧ рдФрд░ рдбрд╛рдЙрди-рд╡реЛрдЯрд┐рдВрдЧ _sentiment_ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рд╣рдо рд╡реЛрдЯреЛрдВ рдХреА рдЧрд┐рдирддреА рдпрд╛рдиреА рд╕рд┐рд░реНрдл рднрд╛рд╡рдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдИ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЕрдЧрд░ рд╣рд░ рдХреЛрдИ - рдорд╛рди рд▓реЗрдВ рдХрд┐ 90%+ - рдХрд┐рд╕реА рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдмреБрд░рд╛ рд╕рдВрдХреЗрдд рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рд░ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдРрд╕рд╛ рд╣реЛрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЪреАрдЬреЛрдВ рдХреЛ рдЖрдЬрдорд╛рдиреЗ рд╕реЗ рдЦреБрд╢ рд╣реИрдВ, рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдкрд░ рдЪрд▓реЗ рдЧрдП рд╣реИрдВ (рдФрд░ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рди рд╣реЛрдВ)ред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рднрд╛рд╡рдирд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрднрд╡ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдПрдХ рднрд╛рд╡рдирд╛ рд╣реИред рднрд╛рд╡рдирд╛рдПрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓рддреА рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдХрд┐рд╕реА рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╡рдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ... :-)

@Goodwine рдХрд┐рд╕реА рдиреЗ рднреА try() рдХреЛ рддреНрд░реБрдЯрд┐ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ; рд╣рд╛рд▓рд╛рдВрдХрд┐ _if_ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд err рд╡реИрд░рд┐рдПрдмрд▓ рд╣реЛ рдЬреИрд╕рд╛ рдХрд┐ @rogpeppe рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)ред

рдлрд┐рд░, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЦрд╛рд░рд┐рдЬ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЪрд▓реЛ рд╡рд╣рд╛рдБ рдЪрд▓рддреЗ рд╣реИрдВ рдЕрдЧрд░ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

@griesemer
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреБрдордиреЗ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рдЧрд▓рдд рд╕рдордЭрд╛ред
рдореИрдВ рдЗрд╕ рдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╡реЛрдЯрд┐рдВрдЧ/рдбрд╛рдЙрди рд╡реЛрдЯрд┐рдВрдЧ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдЪреНрдЫреА рд╕рдордЭ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ "рдХреНрдпрд╛ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ x' рдХреЗ рдмрдЬрд╛рдп рдХрдард┐рди рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ ' рдпрд╛ 'y рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рд╣реИ'"

рдЖрдкрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ - рд╡рд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк рд╕реЛрдЪрддреЗ рд╣реИрдВ ... рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдЕрдкрд╡реЛрдЯ рдХрд░реЗрдВ:

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

@guybrand рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреНрд░реА-рд░рд┐рд▓реАрдЬрд╝ 1.14 (?) рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдФрд░ рд╣рд╛рдереЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХрддреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реИред IOW рдПрдХ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, on err, <statement> . рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП #32611 рджрд╛рдпрд░ рдХрд┐рдпрд╛

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

(рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдорддрд▓рдм рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред)

рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рдЬрд┐рд╕ рд╕реВрдЪреА рдХрд╛ рдЖрдк рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ:

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

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

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

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

рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рдЗрд╕ рдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ func(... interface{}, error) ред
рдкрд╣рд▓реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд┐рд░ рдЧреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреИрдЯрд░реНрди рдХреА рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд╣рд░ рдЬрдЧрд╣ рд╣реИред

рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИ, рдЬреИрд╕рд╛ рд╣реИред

рдпрджрд┐ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ if рдХрдерди рд╣реЛрддрд╛ рд╣реИред

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧред рдЕрдм рддрдХ рдХреА рд╢рд╛рдВрдд, рд╕рдореНрдорд╛рдирдЬрдирдХ, рд░рдЪрдирд╛рддреНрдордХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдиреЛрдЯреНрд╕ рд▓реЗрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рдФрд░ рдЕрдВрддрддрдГ рдХрд╛рдлреА рдирд┐рд░рд╛рд╢ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдереНрд░реЗрдб рдХреЗ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдпрд╛ рдЬреЛ рдХрд┐ рдЧрд┐рдЯрд╣рдм рд╢реЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдкреВрд░реНрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдпрд╣ рддреЗрдЬреА рд╕реЗ рд▓реЛрдб рднреА рд╣реЛрддрд╛ рд╣реИ!) https://swtch.com/try.html рджреЗрдЦреЗрдВред рдореИрдВ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд░рд╣реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдмреИрдЪреЛрдВ рдореЗрдВ, рдорд┐рдирдЯ-рджрд░-рдорд┐рдирдЯ рдирд╣реАрдВред (рдпрд╣ рдПрдХ рдРрд╕реА рдЪрд░реНрдЪрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ "рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рдордп" рд╕реЗ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред)

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

@ рдорд┐рд╢рд╛рдХ87 рд╣рдо рдЗрд╕реЗ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреНрдп рдмрд┐рд▓реНрдЯ-рдЗрдиреНрд╕ ( try , make , unsafe.Offsetof , рдЖрджрд┐) рд╣реИрдВ рдЬреЛ "рдЕрдирд┐рдпрдорд┐рдд" рд╣реИрдВ - рдпрд╣реА рдмрд┐рд▓реНрдЯ-рдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИрдВред

@rsc , рд╕реБрдкрд░ рдЙрдкрдпреЛрдЧреА! рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж #id рд╕рдорд╕реНрдпрд╛ рдХреЛ рд▓рд┐рдВрдХ рдХрд░реЗрдВ? рдФрд░ рдлрд╝реЙрдиреНрдЯ-рд╢реИрд▓реА рд╕реЗрдиреНрд╕-рд╕реЗрд░рд┐рдлрд╝?

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

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

user := try(getUser(userID))

рдкреНрд░рддрд┐

user, err := getUser(userID)
if err != nil {  
    // inspect error here
    return err
}

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

рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдиреЗрд╕реНрдЯреЗрдб рдХреЛрд╢рд┐рд╢() рдХреЙрд▓ рдХреЛ рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦрдирд╛ рдФрд░ рднреА рдкрд░реЗрд╢рд╛рди рд╣реЛрдЧрд╛ред

рджреВрд╕рд░реА рдУрд░, рд╕рдВрджрд░реНрдн рдпрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХреЛрдб рдЬреЛрдбрд╝рдирд╛

user := try getUser(userID)

рдХреЛрдб рдХреЗ рдмрд╛рдж рдЕрдВрдд рдореЗрдВ рдХреИрдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛

user := try getUser(userID) catch {
   // inspect error here
}

рдХрд┐рд╕реА рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╣рдЯрд╛рдирд╛ рдпрд╛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдирд╛, рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЗрди рдХреЛ рддреЛрдбрд╝рдиреЗ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

try() рдФрд░ if err != nil рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╖реНрдЯрдкреНрд░рдж IMO рд▓рдЧрддрд╛ рд╣реИред

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

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ try() рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдХреЗ рдХрд╛рдо try ... catch рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд▓реЗрдХрд┐рди рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рдореИрдВ ' d рдХреЛ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ/рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try() рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдлрд┐рд░ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП if err != nil рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рдирд╛ make() рдмрдирд╛рдо new() рдмрдирд╛рдо := рд╣реЛрдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред var ред рдпреЗ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдо рддрд░реАрдХреЗ рд╣реЛрдВ рдпрд╛ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рднреА рддрд░реАрдХрд╛ рд╣реЛ? рдмреЗрд╢рдХ рдХреЛрдИ рднреА рдХрд┐рд╕реА рдХреЛ рднреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рд▓реЛрдЧ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ! = рд╢реВрдиреНрдп рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирдП рдЪрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдХреА рддрд░рд╣ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛ рднреА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рдЙрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ/рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреЛрдбрд╝рдиреЗ/рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ try ... else рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

//cc @brynbellomy

рдзрдиреНрдпрд╡рд╛рдж, @owais , рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдмрд┐рдВрджреБ рд╣реИ (рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред try рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рджрд░рд╡рд╛рдЬрд╛ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рджреВрд╕рд░рд╛ рддрд░реНрдХ, рдЬреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ try рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ - рдХрд┐рд╕реА рдХреЛ try - catch рдпрд╛ try рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ else ред

@рдУрд╡реИрд╕

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

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

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

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

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

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрд╢рд┐рд╢ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрдЧрд╛ ()

рдпрд╣ рдПрдХ рд▓рд╛рдЗрдирд┐рдВрдЧ рдЯреВрд▓ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдИрдПрдордУ рдкрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ

рдпрд╣ рдПрдХ рд▓рд╛рдЗрдирд┐рдВрдЧ рдЯреВрд▓ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдИрдПрдордУ рдкрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ

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

@mikeschinkel рдХреНрдпрд╛ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛?

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

рдХреНрдпрд╛ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рднреВрд▓рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛?

GoLand рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВ, рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдХрд▓рди рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд▓рд┐рдВрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдХрдВрдкрд╛рдЗрд▓рд░ рдЭрдВрдбреЗ рдХреЛ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдмрджрд▓рдиреА рдЪрд╛рд╣рд┐рдПред

-nolocalimports рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ -s рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИред

рдХрдВрдкрд╛рдЗрд▓рд░ рдЭрдВрдбреЗ рдХреЛ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдмрджрд▓рдиреА рдЪрд╛рд╣рд┐рдПред

-nolocalimports рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ -s рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИред

рдирд╣реАрдВ, рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рди рдХреЗрд╡рд▓ рднрд╛рд╖рд╛ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рд╡рд╣реА рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ:

рдЗрдВрдкреЛрд░реНрдЯрдкрд╛рде рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдирд┐рд░реНрднрд░ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдкреИрдХреЗрдЬ рдХреЗ рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рднрдВрдбрд╛рд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

GoLand рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВ, рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдХрд▓рди рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд▓рд┐рдВрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

https://github.com/vmware/dispatch/wiki/Configure-GoLand-with-golint

@deanveloper

https://github.com/vmware/dispatch/wiki/Configure-GoLand-with-golint

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

рд▓рд┐рдВрдЯ рд╣рдореЗрд╢рд╛ рд╕рдВрдХрд▓рдХ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рд╢рд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ (AFAIK) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

image

рдирд╣реАрдВ, рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рди рдХреЗрд╡рд▓ рднрд╛рд╖рд╛ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рд╡рд╣реА рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ:

рдЖрдк рдкрд░рд┐рдгрд╛рдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВред рддреЛ рдореИрдВ рднреА рдРрд╕рд╛ рд╣реА рдХрд░реВрдВрдЧрд╛ред

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

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

try() рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдирд┐рд░реНрднрд░ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рдкрд╕реА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рд╣рд╛рдп рддреЛ рдмрд╕ рдбрд┐рдмрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдФрд░ рдРрд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдкреВрд░реЗ рдореБрджреНрджреЗ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд┐рдЪрд╛рд░ try() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ $#$2$# рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рднрд╛рдЧ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП try() emit рдХреНрд▓реЙрдЬ рдЬреЛрдбрд╝рдХрд░ рд╣реИред try() ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдФрд░ рдРрд╕рд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрддреНрдХрд╛рд▓ рдХреЗ рд▓рд┐рдП fmt рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рддреЛ рдореИрдВ рдЗрд╕рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛:

func writeStuff(filename string) (io.ReadCloser, error) {
    f := try(os.Open(filename))
    try(fmt.Fprintf(f, "stuff\n"))

    return f, nil
}

рдбрд┐рдмрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдпрд╛ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

func writeStuff(filename string) (io.ReadCloser, error) {
    emit err {
        fmt.Printf("something happened [%v]\n", err.Error())
        return nil, err
    }

    f := try(os.Open(filename))
    try(fmt.Fprintf(f, "stuff\n"))

    return f, nil
}

рддреЛ рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдПрдХ рдирдП рдЦреЛрдЬрд╢рдмреНрдж emit рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рдЬреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ try() рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рддрд░рд╣ рддрддреНрдХрд╛рд▓ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдерди рдпрд╛ рдПрдХ рд▓рд╛рдЗрдирд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

emit return nil, err

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

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

рдпрд╣ @mikeschinkel рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдореИрдВ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдЦрдВрдб рдореЗрдВ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореИрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рди рдХрд░реВрдВред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, @networkimprov рд╕рд╣реА рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рддрдХ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ)ред

рдХреЛрд╢рд┐рд╢ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг
@mikeschinkel

рд▓рд┐рдВрдЯ рд╣рдореЗрд╢рд╛ рд╕рдВрдХрд▓рдХ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рд╢рд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ (AFAIK) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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

(рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЬреЛ рд╡рд╣ рдореБрдЭреЗ рдиреАрдЪреЗ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рддреНрд░реБрдЯрд┐ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рднреА рдпрд╣ рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди "рд░рди рдХрд╛рдЗрдВрдб" рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИ рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░ рдЧрдпрд╛)

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

рдЖрдк рдкрд░рд┐рдгрд╛рдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВред

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

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

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

рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд▓реНрдкрдирд╛ рдореЗрдВ ImportPath рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рдФрд░ рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ [...]

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

@deanveloper

_"рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, @networkimprov рд╕рд╣реА рд╣реИ рдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рддрдм рддрдХ рд░рдЦреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ (рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ)ред

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

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

рдпрд╣рд╛рдВ:

_ "рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЧреЙрд▓рд┐рдВрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ рддреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдирд┐рдХрд╛рд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред"

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

рддреЛ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдорд╛рдВрдЧ рд░рд╣рд╛ рдерд╛, рд░реЛрд▓-рдпреЛрд░-рд╕реЙрд▓реНрдпреВрд╢рди рдирд╣реАрдВред

_ "рдЖрдк рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗред"_

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

_"рдпрд╣ рдХрд▓реНрдкрдирд╛ рдмрджрд▓рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╣реИред_"

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

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

рдЗрд╕реА рддрд░рд╣ рдпрджрд┐ go build рдЗрд╕ рд╕реНрд╡рд┐рдЪ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ рдФрд░ try() рдкрд░ рдЖрдиреЗ рдкрд░ рд░реБрдХ рдЬрд╛рдПрдЧрд╛ред рдХреЛрдИ рднрд╛рд╖рд╛ рдпреБрдХреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

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

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

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

_ "рдирд╣реАрдВ, рдореИрдВ рдирд╣реАрдВ рд╣реВрдВред рдХрдВрдкрд╛рдЗрд▓рд░ рдЭрдВрдбреЗ рдХреЛ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдмрджрд▓рдиреА рдЪрд╛рд╣рд┐рдПред"_

рдпрд╣ рдХрд╣рдирд╛ рдХрд┐ рдЖрдк рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВ рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВ рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВред

рдмрдврд╝рд┐рдпрд╛ред рдлрд┐рд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп _(рдХреБрдЫ рдРрд╕рд╛) _ build-guard рдирд╛рдордХ рдПрдХ рдирдП рд╢реАрд░реНрд╖ рд╕реНрддрд░реАрдп рдХрдорд╛рдВрдб рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╢реБрд░реБрдЖрдд try() рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рд╣реЛрддреА рд╣реИред

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


рддреЛ рдЕрдм рдЕрдЧрд░ рдЖрдк @networkimprov рд╕реЗ рд╕рдЪ рдореЗрдВ рд╕рд╣рдордд рд╣реИрдВ рддреЛ рдЕрдкрдиреЗ рдЙрддреНрддрд░ рдХреЛ рдмрд╛рдж рддрдХ рд░реЛрдХ рдХрд░ рд░рдЦреЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ред

рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдереНрдп рд╣реИрдВ :-)

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЧреЛ рдЯреАрдо рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рджреЗрдЦреА рд╣реИ ...

$ go test -bench=.
goos: linux
goarch: amd64
BenchmarkAlways2-2      20000000                72.3 ns/op
BenchmarkAlways4-2      20000000                68.1 ns/op
BenchmarkAlways6-2      20000000                68.0 ns/op

BenchmarkNever2-2       100000000               16.5 ns/op
BenchmarkNever4-2       100000000               13.1 ns/op
BenchmarkNever6-2       100000000               13.5 ns/op

рд╕реНрд░реЛрдд

package deferbench

import (
   "fmt"
   "errors"
   "testing"
)

func Always(iM, iN int) (err error) {
   defer func() {
      if err != nil {
         err = fmt.Errorf("d: %v", err)
      }
   }()
   if iN % iM == 0 {
      return errors.New("e")
   }
   return nil
}

func Never(iM, iN int) (err error) {
   if iN % iM == 0 {
      return fmt.Errorf("r: %v", errors.New("e"))
   }
   return nil
}

func BenchmarkAlways2(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e2, a) }}
func BenchmarkAlways4(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e4, a) }}
func BenchmarkAlways6(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e6, a) }}

func BenchmarkNever2(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e2, a) }}
func BenchmarkNever4(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e4, a) }}
func BenchmarkNever6(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e6, a) }}

@networkimprov

https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md#efficiency -of-defer рд╕реЗ (рдмреЛрд▓реНрдб рдореЗрдВ рдореЗрд░рд╛ рдЬреЛрд░)

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

рдпрд╛рдиреА рдбрд┐рдлрд░ рдЕрдм рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП go1.13 рдХреЗ рд▓рд┐рдП 30% рдкреНрд░рджрд░реНрд╢рди рд╕реБрдзрд╛рд░ рд╣реИ, рдФрд░ рдпрд╣ 1.14 рдореЗрдВ рдЧреИрд░-рд╕реНрдердЧрд┐рдд рдореЛрдб рдХреЗ рд╕рдорд╛рди рддреЗрдЬрд╝ рдФрд░ рдХреБрд╢рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рд╢рд╛рдпрдж рдХреЛрдИ 1.13 рдФрд░ 1.14 рд╕реАрдПрд▓ рдХреЗ рд▓рд┐рдП рдирдВрдмрд░ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдЕрдиреБрдХреВрд▓рди рд╣рдореЗрд╢рд╛ рджреБрд╢реНрдорди рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдирд╣реАрдВ рд░рд╣рддреЗ... рдПрд░, рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ред

1.13 рд╡рд┐рд▓рдВрдм рд▓рдЧрднрдЧ 30% рддреЗрдЬ рд╣реЛрдВрдЧреЗ:

name     old time/op  new time/op  delta
Defer-4  52.2ns ┬▒ 5%  36.2ns ┬▒ 3%  -30.70%  (p=0.000 n=10+10)

рдКрдкрд░ рджрд┐рдП рдЧрдП @networkimprov рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдореБрдЭреЗ рдпрд╣реА рдорд┐рд▓рддрд╛ рд╣реИ (1.12.5 рд╕реЗ рдЯрд┐рдк рддрдХ):

name       old time/op  new time/op  delta
Always2-4  59.8ns ┬▒ 1%  47.5ns ┬▒ 1%  -20.57%  (p=0.008 n=5+5)
Always4-4  57.9ns ┬▒ 2%  43.5ns ┬▒ 1%  -24.96%  (p=0.008 n=5+5)
Always6-4  57.6ns ┬▒ 2%  44.1ns ┬▒ 1%  -23.43%  (p=0.008 n=5+5)
Never2-4   13.7ns ┬▒ 8%   3.8ns ┬▒ 4%  -72.27%  (p=0.008 n=5+5)
Never4-4   10.5ns ┬▒ 6%   1.3ns ┬▒ 2%  -87.76%  (p=0.008 n=5+5)
Never6-4   10.8ns ┬▒ 6%   1.2ns ┬▒ 1%  -88.46%  (p=0.008 n=5+5)

(рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрднреА рднреА рдЗрддрдиреЗ рддреЗрдЬрд╝ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди?)

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

рдлрд┐рд░ рдЖрдкрдиреЗ рдмрд╛рдж рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рд╕реБрдЭрд╛рд╡ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛?

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


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

@griesemer рдПрдХ рдХреНрд╖реЗрддреНрд░ рдЬреЛ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ try рдХреЗ рд╕рд╛рде рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

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

рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рдЪрд░рдг

рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗрдЯ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

0. рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдирд╣реАрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдЬрд╛рд╡рдЯ рдХреЗ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛)ред
1. рд╡рд░реНрджреА рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрджреА рд╕рдЬрд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП try + defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛)ред
2. рдПрди -1 рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рд╣реИ , рд▓реЗрдХрд┐рди 1 рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБ рдореЗрдВ рдЕрд▓рдЧ рд╕рдЬрд╛рд╡рдЯ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рд╕реНрдерд╛рдпреА рд╡рд┐рд╕реНрддреГрдд рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ, рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдбреАрдмрдЧ рд▓реЙрдЧ, рдЖрджрд┐)ред
3. рд╕рднреА рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рд╣реИ , рдпрд╛ рдХреБрдЫ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИред

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

рдЪрд░рдг 0 рдФрд░ рдЪрд░рдг 1 рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдордзреБрд░ рд╕реНрдерд╛рди рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рднреА рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдЪрд░рдг 0->1 рд╕рдВрдХреНрд░рдордг рд╕реАрдзрд╛ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд░рдг 0 рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдЬрд╛рд╡рдЯ рдХреЗ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рддреЛ рдЖрдк defer fmt.HandleErrorf(&err, "foo failed with %s", arg1) рдЬреИрд╕рд╛ рдХреБрдЫ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЙрд╕ рд╕рдордп рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдмрд┐рд▓реНрдЯ-рдЗрди рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рддрд░реНрдЬ рдкрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЕрдкрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдХреА рд▓рд╛рдЧрдд рдФрд░ рдЬреЛрдЦрд┐рдо рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рджреВрд╕рд░реА рдУрд░, рдПрдХ рдЪрд░рдг 1->2 рд╕рдВрдХреНрд░рдордг рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ (рдпрд╛ "рдХрд╖реНрдЯрдкреНрд░рдж" рдЬреИрд╕рд╛ рдХрд┐ рдХреБрдЫ рдЕрдиреНрдп рдиреЗ рдХрд╣рд╛ рд╣реИ) рдпрджрд┐ рдЪрд░рдг 1 defer рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдерд╛ред рдПрдХ рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдЯ рд╕рдЬрд╛рд╡рдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ defer (рджреЛрд╣рд░реА рд╕рдЬрд╛рд╡рдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдлрд┐рд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try рдХреЛ рдбреАрд╕реБрдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд░рд┐рдЯрд░реНрди рдкреЙрдЗрдВрдЯ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, N-1 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 1 рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдЪрд░рдг 1->3 рд╕рдВрдХреНрд░рдордг рднреА рдЕрдЧрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред

рд╕рдЬрд╛рд╡рдЯ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╕рдордп рдЧрд▓рддрд┐рдпрд╛рдБ

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

        w := try(os.Create(dst))
        defer func() {
                w.Close()
                if err != nil {
                        os.Remove(dst) // only if a тАЬtryтАЭ fails
                }
        }()

рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ w := try(os.Create(dst)) рдХреА "рд╕реНрдкрд╖реНрдЯ" рдореИрдиреБрдЕрд▓ рдбрд┐рд╕реБрдЧрд░рд┐рдВрдЧ рдХреА рд╣реИ, рддреЛ рдЙрд╕ рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

        w, err := os.Create(dst)
        if err != nil {
            // do something here
            return err
        }

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

рд╕рдЬрд╛рд╡рдЯ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдВрдХреНрд░рдордг

рд╕рдордп рдХреА рд▓рд╛рдЧрдд рдФрд░ рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж gopls (рдпрд╛ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛) рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ try , рдпрд╛ рдПрдХ рдХрдорд╛рдВрдб desugar try рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ desugar рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдорд╛рдВрдб рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП func рдореЗрдВ gopls рдХрдорд╛рдВрдб рдХреЗрд╡рд▓ try рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рдЕрд▓рдЧ рдХрдорд╛рдВрдб try рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЪреАрдЬреЛрдВ рдХреЗ рдХрдо рд╕реЗ рдХрдо рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЛ рднреА рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ defer fmt.HandleErrorf(&err, "copy %s %s", src, dst) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреВрд░реНрд╡ try рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕рдорддреБрд▓реНрдп рдХреЛрдб рдореЗрдВ (рдЬреЛ рдЪрд░рдг 1->2 рдпрд╛ рдЪрд░рдг 1->3 рд╕реЗ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╕рдордп рдорджрдж рдХрд░реЗрдЧрд╛)ред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХ рдХрд┐рдпрд╛ рд╣реБрдЖ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрднрд╡ рдпрд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдпрд╛ рд╡рд░реНрддрдорд╛рди рд╕реЛрдЪ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ред

рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдкрд░рд┐рдгрд╛рдо?

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

x1, x2, x3 = try(f())

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

t1, t2, t3, te := f()  // visible temporaries
if te != nil {
        return x1, x2, x3, te
}
x1, x2, x3 = t1, t2, t3

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

рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╛рдорд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдХрд╛рд░рдг if рдФрд░ try рдХреЗ рдмреАрдЪ рд╕рдВрднрд╛рд╡рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб рдореЗрдВ рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ if рд╕реЗ try # рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдЦрдВрдб рдореЗрдВ рдЬреЛ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ _"рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЗ рджреБрд░реНрд▓рдн рд╣реИрдВред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рддреЛ if рдХрдерди рд░рдЦреЗрдВред"_)ред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП try рд╕реЗ if рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд░рддреЗ рд╕рдордп рд╡рд┐рднрд┐рдиреНрди рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рддрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред


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

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

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

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ break рдХреЗ рдмрдЬрд╛рдп return рдХрд╛ рдЙрдкрдпреЛрдЧ 1.12 рдХреЗ рд╕рд╛рде рдЪрдордХрддрд╛ рд╣реИред рдЗрд╕реЗ for range once { ... } рдмреНрд▓реЙрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ once = "1" рдХреЛрдб рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕реАрдорд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдЖрдк рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк рдЗрд╕реЗ break рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдХрд░рддреЗ рд╣реИрдВ return рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдХрд░рддреЗ рд╣реИрдВред

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

fwiw

рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП @ Randall77 рдХреЗ рдкрд░рд┐рдгрд╛рдо 1.12 рдФрд░ рдЯрд┐рдк рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП 40+ns рдкреНрд░рддрд┐ рдХреЙрд▓ рдУрд╡рд░рд╣реЗрдб рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ defer рдЕрдиреБрдХреВрд▓рди рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореВрдЯ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

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

рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реВрдВ рдХрд┐ рд╣рдо рдЬреЛ рднреА рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдХреИрд╕реЗ рдмреЗрдХрд╛рд░ рд╣реЛрдЧрд╛ред рд╡рд╣ рджрд╛рд╡рд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ?

рд╡рд╣ рджрд╛рд╡рд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ?

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП 40+ns рдкреНрд░рддрд┐ рдХреЙрд▓ рдУрд╡рд░рд╣реЗрдб рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрджрд▓рд╛ред

1.13 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╕реНрдердЧрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЕрдиреНрдп рд╕реБрдзрд╛рд░реЛрдВ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдФрд░ рдКрдкрд░ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЙрджреНрдзреГрдд рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдкреБрдирдГ swtch.com/try.html рдФрд░ https://github.com/golang/go/issues/32437#issuecomment -502192315:

@rsc , рд╕реБрдкрд░ рдЙрдкрдпреЛрдЧреА! рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж #id рд╕рдорд╕реНрдпрд╛ рдХреЛ рд▓рд┐рдВрдХ рдХрд░реЗрдВ? рдФрд░ рдлрд╝реЙрдиреНрдЯ-рд╢реИрд▓реА рд╕реЗрдиреНрд╕-рд╕реЗрд░рд┐рдлрд╝?

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

рдкреБрди: рдЕрдХреНрд╖рдо/рдкреБрдирд░реАрдХреНрд╖рдг рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ :

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

@mikeschinkel , рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдм рджреЛ рдмрд╛рд░ рдЖрдкрдиреЗ try рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ _ignoring_ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред
7 рдЬреВрди рдХреЛ рдЖрдкрдиреЗ рд╢реАрд░реНрд╖рдХ рдХреЗ рддрд╣рдд рд▓рд┐рдЦрд╛, "рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ":

рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдХреБрд▓ рджреЛрд╣рд░рд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ try() рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЧрд▓реЗ рд▓рдЧрд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдпрд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдХрднреА рднреА рдХрд┐рд╕реА рднреА рдХреЛрдб рдореЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдЦреЛрдЬреЗрдЧрд╛ред рдбреЗрд╡рд▓рдкрд░ рдЬрд╣рд╛рдЬреЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛:

f, _ := os.Open(filename)

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

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

рдФрд░ рдлрд┐рд░ 14 рдЬреВрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЖрдкрдиреЗ "рдХреЛрдб рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ред

рдпрджрд┐ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ f, _ := os.Open(filename) рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ "рдЕрдирджреЗрдЦрд╛" рдХреЗ рд░реВрдк рдореЗрдВ "рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдФрд░ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛" рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдХреЗ рдЕрддрд┐рд░рдВрдЬрдирд╛ рдХрд░ рд░рд╣реЗ рдереЗред рд▓реЗрдХрд┐рди рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ, рдкреНрд░рд╕реНрддрд╛рд╡ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрддреНрддрд░ рджрд┐рдП рдЧрдП рдХрдИ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рд╕рд╛рде рдпрд╛ рднрд╛рд╖рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЙрд╕реА рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рддреЛ рдмрд╕ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП:

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдХреБрдЫ рдХрдард┐рди рд╣реИред

рдЬрдм рдореИрдВ try() рдПрдХ рд╡реНрдпрдВрдЬрдХ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реБрдЖ рджреЗрдЦрддрд╛ рд╣реВрдВ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ?

рдЬрдм рдЖрдк try(f()) рджреЗрдЦрддреЗ рд╣реИрдВ, рдпрджрд┐ f() рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ try рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ try рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдирд╣реАрдВ, рддреНрд░реБрдЯрд┐ рдХреЛ рдХрднреА рднреА рдирдЬрд░рдЕрдВрджрд╛рдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реАред рдкрд╕рдВрдж:

{ err := f(); if err != nil { return err } }

рдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рдпрд╛ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ defer рдкрд░ рдХреВрдж рдЬрд╛рдПрдЧрд╛,

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

рдЖрд╕реНрдердЧрд┐рдд рдХрд╛рд░реНрдп " рдЙрд▓реНрдЯрд╛ рдХреНрд░рдо рдореЗрдВ рд╡реЗ рдЖрд╕реНрдердЧрд┐рдд рдереЗ" рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред

рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдЕрдВрджрд░ err рдирд╛рдордХ рдПрдХ рдЪрд░ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛, рдпрд╛ рдЗрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ _(рдореБрдЭреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ?)_ред

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

рдпрджрд┐ рдЖрдкрдХреЛ рдЖрд╕реНрдердЧрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред https://golang.org/ref/spec#Defer_statements рдореЗрдВ result рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

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

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

рдПрдХ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдкрд░рд┐рдгрд╛рдо рдЕрдЬреНрдЮрд╛рдд рд╣реЛ, рдФрд░ рднрд▓реЗ рд╣реА рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдирд╛рдо рд╣реЛ рд▓реЗрдХрд┐рди рдЫрд╛рдпрд╛рдВрдХрд┐рдд рд╣реЛред

рдФрд░ рдХреНрдпрд╛ рдпрд╣ рд╕рднреА defer s рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛? рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рдпрд╛ рдирд┐рдпрдорд┐рдд рдХреНрд░рдо рдореЗрдВ?

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

рдЖрд╕реНрдердЧрд┐рдд рдХрд╛рд░реНрдп " рдЙрд▓реНрдЯрд╛ рдХреНрд░рдо рдореЗрдВ рд╡реЗ рдЖрд╕реНрдердЧрд┐рдд рдереЗ" рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред (рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдирд┐рдпрдорд┐рдд рдСрд░реНрдбрд░ рд╣реИред)

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

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

рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдЕрдм рддрдХ рдХреА рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореБрдЭреЗ рдЕрднреА рднреА рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рдирд╣реАрдВ рдкрддрд╛ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдЙрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рдорд░реНрдердХ _"рдХрдкреНрддрд╛рди рд╕реНрдкрд╖реНрдЯ" рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рдЪреИрдВрдкрд┐рдпрди рд╣реИрдВ?

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

x, y := try(f())

рд╕рд╛рдзрди

tmp1, tmp2, tmpE := f()
if tmpE != nil {
   return ..., tmpE
}
x, y := tmp1, tmp2

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

рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ "рдЕрдирджреЗрдЦрд╛" рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

c, _ := net.Dial("tcp", "127.0.0.1:1234")
io.Copy(os.Stdout, c)

рдФрд░ рдХреЛрдб рдШрдмрд░рд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ net.Dial рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛, c рд╢реВрдиреНрдп рд╣реИ, рдФрд░ io.C рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рджреЛрд╖ рдкрдврд╝реЗрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдХреЛрдб рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:

 c := try(net.Dial("tcp", "127.0.0.1:1234"))
 io.Copy(os.Stdout, c)

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

@ damienfamed75 рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд emit рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрди рдХреЗ handle рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИред handle рдШреЛрд╖рдгрд╛ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг $ defer рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдУрд╡рд░рд▓реИрдк рдерд╛ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ emit рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

@dominikh рдиреЗ рдкреВрдЫрд╛ :

рдХреНрдпрд╛ рдПрдХреНрдореЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЯреНрд░рд╛рдИ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ?

рдХреЛрд╢рд┐рд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реИ, рд╣рд╡рд╛ рдореЗрдВ, рдЕрдЬреНрдЮрд╛рдд рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ: рдирд╣реАрдВред

@ рдЖрд░рдПрд╕рд╕реА

рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

_"рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдм рджреЛ рдмрд╛рд░ рдЖрдкрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдирджреЗрдЦреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред"_

рд╣рд╛рдВ, рдореИрдВ рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рдерд╛ред

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

_ "рдЬрдм рдЖрдк try(f()) рджреЗрдЦрддреЗ рд╣реИрдВ, рдпрджрд┐ f() рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдпрд╛рд╕ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ рдФрд░ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред"_

рдпрд╣ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдПрдХ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИред

рдФрд░ рдпрд╣ рджреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рджреБрдЦреА рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░рдг:

  1. рдпрд╣ рд╕рдЬрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХрд╛ рдорд╛рд░реНрдЧ рдмрдирд╛ рджреЗрдЧрд╛ - рдмрд╣реБрдд рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ - рдФрд░ рдХрдИ рд▓реЛрдЧ рдЙрд╕ рдХреЛрдб рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрдо рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХреЛрдб рдХрдо рдордЬрдмреВрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди / рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ .

  2. рдореЗрд░реЗ рдЬреИрд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ break рдФрд░ continue рдХрд╛ рдЙрдкрдпреЛрдЧ return рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдкреИрдЯрд░реНрди рдЬреЛ рдмрджрд▓рддреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИ - рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рднреА рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ try() , рддрдм рднреА рдЬрдм рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рди рд╣реЛред

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

_ "рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╛рда рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реВрдВрдЧрд╛, рди рдХрд┐ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрд╕ рдкрд╛рда рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред"_

рдлрд┐рд░ рд╕реЗ, рд╡рд╣ рдкреНрд░рд╢реНрди рдПрдХ рд╕рдкреНрддрд╛рд╣ рдкрд╣рд▓реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдЕрдм рдореБрдЭреЗ рдмреЗрд╣рддрд░ рд╕рдордЭ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП, defer рдХрд╛ рдмрдВрдж рд╣реЛрдирд╛ рд╣реИ, рд╣реИ рдирд╛? рдпрджрд┐ рдЖрдк рдЙрд╕ рдмрдВрдж рд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ - рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЧрд▓рдд рди рд╕рдордЭреВрдВ - рдпрд╣ рди рдХреЗрд╡рд▓ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛ рдмрд▓реНрдХрд┐ func рд╕реЗ рднреА рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рд╣реИ рдирд╛? _(рдЕрдЧрд░ рд╣рд╛рдВ рддреЛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред)_

func example() {
    defer func(err) {
       return err // returns from both defer and example()
    }
    try(SomethingThatReturnsAnError)    
} 

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

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


BTW, рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рддрд░рд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ _(рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ .Extend() рдЬреЛрдбрд╝рд╛ рд╣реИ):_

f := try os.Open(filename) else err {
    err.Extend("Cannot open file %s",filename)
    //break, continue or return err   
}

рдпрд╛

try f := os.Open(filename) else err {
    err.Extend("Cannot open file %s",filename)
    //break, continue or return err    
}

рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реЛрдВ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рдХрд┐рд╕реА рднреА рдкрд╛рддреНрд░ рдХреЛ рдирд╣реАрдВ рдмрдЪрд╛рддрд╛ рд╣реИ:

f,err := os.Open(filename)
if err != nil {
    err.Extend("Cannot open file %s",filename)
    //break, continue or return err    
}

рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрд▓реЛрдЪрдирд╛ рдЧрд╛рдпрдм рд╣реИ рдХрд┐ рдпрд╣ 5 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ 4 рд▓рд╛рдЗрдиреЛрдВ рддрдХ рдЬрд╛рддреА рд╣реИ, рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд╛рди рдореЗрдВ рдХрдореА рдФрд░ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдкрдХреЛ func рдореЗрдВ рдРрд╕реЗ рдХрдИ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛ рдЬреЛ 40% рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд╛рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ _ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛): _

try f := os.Open(filename) 
    else err().Extend("Cannot open file %s",filename)
    end //break, continue or return err    

#fwiw


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

рд▓рдХреНрд╖реНрдп

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

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

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

рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рддреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЖрдЬ рдХреА рддрд░рд╣ рд╡реИрдз рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЛ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдСрдкрд░реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред"

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

@mikeschinkel ,

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП, defer рдХрд╛ рдмрдВрдж рд╣реЛрдирд╛ рд╣реИ, рд╣реИ рдирд╛? рдпрджрд┐ рдЖрдк рдЙрд╕ рдмрдВрдж рд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ - рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЧрд▓рдд рди рд╕рдордЭреВрдВ - рдпрд╣ рди рдХреЗрд╡рд▓ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛ рдмрд▓реНрдХрд┐ func рд╕реЗ рднреА рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рд╣реИ рдирд╛? _(рдЕрдЧрд░ рд╣рд╛рдВ рддреЛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред)_

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

func (d *Data) Op() int {
    d.mu.Lock()
    defer d.mu.Unlock()

     ... code to implement Op ...
}

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

рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЬрд╛рдирд╛:

func example() {
    defer func(err) {
       return err // returns from both defer and example()
    }
    try(SomethingThatReturnsAnError)    
} 

рдХрдо рд╕реЗ рдХрдо рд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рдкрд╛рдВрдбрд┐рддреНрдпрдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рд╡рд┐рд╡рд░рдг рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╡реИрдз рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ:

func example() (err error) {
    defer func() {
        if err != nil {
            println("FAILED:", err.Error())
        }
    }()

    try(funcReturningError())
    return nil
}

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

рддреЛ, рдирд╣реАрдВ, return err рд▓рд┐рдЦрдирд╛ рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд░реНрде рдореЗрдВ рд╕реНрдердЧрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рджреЛрдиреЛрдВ рд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

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

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

@brynbellomy рдХреЛ рдЙрдирдХреА рдХрдИ рдЕрдЪреНрдЫреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ try-else рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд╣рд╛рдБ, рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

func doSomething() (int, error) {
    // Inline error handler
    a, b := try SomeFunc() else err {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    // Named error handlers
    handler logAndContinue err {
        log.Errorf("non-critical error: %v", err)
    }
    handler annotateAndReturn err {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    c, d := try SomeFunc() else logAndContinue
    e, f := try OtherFunc() else annotateAndReturn

    // ...

    return 123, nil
}

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

func doSomething() (int, error) {
    a, b, err := SomeFunc()
    if err != nil {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    // Named error handlers
    logAndContinue := func(err error) {
        log.Errorf("non-critical error: %v", err)
    }
    annotate:= func(err error) (int, error) {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    c, d, err := SomeFunc()
    if err != nil {
        logAndContinue(err)
    }
    e, f, err := SomeFunc()
    if err != nil {
        return annotate(err)
    }

    // ...

    return 123, nil
}

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

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ try рд╕рд░рд▓ рд╢рдмреНрджрд╛рд░реНрде if err != nil { return ..., err } рддрдХ рд╕реАрдорд┐рдд рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ: рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреЛ рдЫреЛрдЯрд╛ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВред рдЬрдм рдХреЛрдИ рдЗрдл рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдпрд╛ рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рди рдЙрдкрдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЛрдЧ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред

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

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

_(FWIW рдореБрдЭреЗ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдо рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ func рдореЗрдВ рдкреАрдЫреЗ рдХреА рдУрд░ рдХреВрджрдиреЗ рдХреЗ рдХрд╛рд░рдгред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЙрд╕ рдХреЛрдб рдХреЛ рдЕрдВрдд рдореЗрдВ рд░рдЦреЗрдВ func рдХреЗ рдмрд╛рдж for range once{...} рдореЗрд░рд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб break рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред)_

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

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

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

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

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

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

if рдХрдердиреЛрдВ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @rsc ред

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

рдореИрдВ рдЗрди рджрд╛рд╡реЛрдВ рдХрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ 3 рд╕реЗ 1 рддрдХ рдХрдо рдХрд░рдирд╛ рдХрд╛рдлреА рд╣рд▓реНрдХрд╛ рд╣реИред рдХреНрдпрд╛ gofmt рдХреЛ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 3 рдХреЗ рдмрдЬрд╛рдп 9 (рдпрд╛ 5) рдиреНрдпреВрд▓рд╛рдЗрдиреНрд╕ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИрд╡реАрд╡реЗрдЯ рд╣реЛрдВрдЧреЗ? рдпрд╣ рдХрдореА/рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдПрдХ рд╣реА рдХрд╛рд░рдХ (рд░рд╛рд╢рд┐) рд╣реИред рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдореЗрдВ рдпрд╣ рд╕рдЯреАрдХ рд╡реНрдпрд╛рдкрд╛рд░-рдмрдВрдж рд╣реИ, рдФрд░ try рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ if рдХрдерди рдЬрд┐рддрдирд╛ рд╣реА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

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

рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, gofmt рд╕реБрдЭрд╛рд╡ try рд╕реЗ рднреА рдЕрдзрд┐рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдХрджрдо рдЙрдард╛рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ try рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рди рд╣реЛред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рдЗрд╕ рдкрд░ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛/рдкреНрд░рд╕реНрддрд╛рд╡ рдЦреЛрд▓реВрдВрдЧрд╛ред :+1:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ 3 рд╕реЗ 1 рддрдХ рдХрдо рдХрд░рдирд╛ рдХрд╛рдлреА рд╣рд▓реНрдХрд╛ рд╣реИред

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

n, err := src.Read(buf)
if err == io.EOF {
    return nil
} else if err != nil {
    return err
}

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

n, err := src.Read(buf)
if err == io.EOF { return nil }
else if err != nil { return err }

рдмрдЬрд╛рдпред рдЕрдЧрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ, рддреЛ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЕрднреА рд╣реИрдВред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдкреГрд╖реНрда рдкрд░ рдкреВрд░реНрд╡ рд╣рд▓реНрдХрд╛ рд╡рдЬрди рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХрд┐рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЖрдк рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрддреНрд░ рдХреЛ рдкрдврд╝реЗ рдмрд┐рдирд╛ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ if-else рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рддреАрди рдХрдердиреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рд╕рдШрди рд╕рдВрд╕реНрдХрд░рдг рдмрддрд╛рдирд╛ рдХрдард┐рди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред

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

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

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ ?

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ?

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

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

рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ:

(рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореБрдЭреЗ рдореВрд▓ рдХрд╣рд╛рдирд┐рдпрд╛рдВ рдЧрд▓рдд рд▓рдЧреАрдВ!)

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

рдореБрдЭреЗ рдпрд╣ рдЙрджрд╛рд╣рд░рдг @brynbellomy рд╡рд┐рдЪрд╛рд░реЛрддреНрддреЗрдЬрдХ рджреНрд╡рд╛рд░рд╛ рдорд┐рд▓рд╛:

headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := try(parentObjOne.AsCommit())
parentCommitTwo := try(parentObjTwo.AsCommit())
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))

// vs

try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
try parentCommitOne := parentObjOne.AsCommit()
try parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)

// vs

try (
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    parentCommitOne := parentObjOne.AsCommit()
    parentCommitTwo := parentObjTwo.AsCommit()
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
)

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

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ @ianlancetaylor рдиреЗ рджреЗрдЦрд╛ , "рдХреЛрд╢рд┐рд╢ рдиреЗ рдиреЗрддреГрддреНрд╡ рдХреЛ рджрдлрди рдХрд░ рджрд┐рдпрд╛ред рдХреЛрдб рдХреЛрд╢рд┐рд╢ рдмрдпрд╛рдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред"

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

рдорд╛рди рд▓реАрдЬрд┐рдП рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХрд┐ AsCommit рдХрднреА рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:

headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))

// vs

try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)

// vs

try (
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try (
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
)

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

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЪрд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ:

headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))

// vs

headRef := try r.Head()
parentObjOne := try headRef.Peel(git.ObjectCommit)
parentObjTwo := try remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try index.WriteTree()
tree := try r.LookupTree(treeOid)

// vs

headRef := r.Head()?
parentObjOne := headRef.Peel(git.ObjectCommit)?
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)?
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()?
tree := r.LookupTree(treeOid)?

// vs

headRef := r.Head?()
parentObjOne := headRef.Peel?(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel?(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree?()
tree := r.LookupTree?(treeOid)

рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рдКрдкрд░ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдЙрди рд╕рднреА рдХреЗ рдЕрдкрдиреЗ рдЕрдЪреНрдЫреЗ рдФрд░ рдмреБрд░реЗ рдмрд┐рдВрджреБ рд╣реИрдВред рдмрд┐рд▓реНрдЯрд┐рди рдлреЙрд░реНрдо рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐:

(1) рд╕рдЯреАрдХ рд╕рдВрдХрд╛рд░реНрдп рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрд╕рд░реНрдЧ-рд╕рдВрдЪрд╛рд▓рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ try x.y().z() ред
(2) рдЙрдкрдХрд░рдг рдЬрд┐рдиреНрд╣реЗрдВ try рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдЗрд╕реЗ рдПрдХ рд╕рд╛рджреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП goimports рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╛рдпреЛрдЬрди рдХреЗ рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░
(3) рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╕рдорд╛рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрдЧрд╣ рд╣реИред

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

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

$#$ err $#$ рдХреЗ рдмрдЬрд╛рдп recover() рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ? рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

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

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

@flibustenet , рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП https://swtch.com/try.html#named рднреА рджреЗрдЦреЗрдВред
(рдЙрди рд╕рднреА рдХрд╛ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реБрдП: рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдирд╛рдорд┐рдд рдкрд░рд┐рдгрд╛рдо рджрд┐рдП рдЧрдП рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рддрдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореМрдЬреВрджрд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред)

try() рдХрд╛ рдПрдХ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ _go fmt_ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИрдВред рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреАрдордд рдХреЗ try() рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рд▓рд╛рдн рд╣реИрдВред рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИ; рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореИрдВ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ, рдФрд░ рд╕рднреА рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ try() рдирд╣реАрдВ рд╣реИред

@networkimprov , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рдХреНрд╖рд┐рдд рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХрд╛ рд╕рдВрджреЗрд╢ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдореЗрдВ рдЕрдзрд┐рдХ рдпреЛрдЧрджрд╛рди рджреЗрдЧрд╛ рдпрджрд┐ рдЗрд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╡рд░рдг рдпрд╛ рд▓рд┐рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЖрдкрдХреА рдмрд╛рдд рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭ рд╕рдХреЗрдВред

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

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

@rsc , рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛, рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП "рдирд╣реАрдВ" рдкрдХреНрд╖ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ - рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдмрдпрд╛рди рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╕рд╢рд░реНрдд рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдореЗрдВ рдЕрд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмрд╛рдд рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреВрдВред рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рдмрдпрд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ try ред рддреЛ рдЖрдкрдХрд╛ рдЕрдВрддрд┐рдо рдкреНрд░рдпрд╛рд╕ рдмреНрд▓реЙрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛:

try (
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
        parentCommitOne := parentObjOne.AsCommit()
        parentCommitTwo := parentObjTwo.AsCommit()
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
)

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

рддреБрдордиреЗ рдХрд╣рд╛ рдерд╛

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдореВрд▓ рддрд░реНрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛! рдЬреЛ рддрдереНрдп рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдХреЗрд╡рд▓ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИред рдореИрдВ рдПрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рд┐рд╡рд╛рдп рдЬрдм рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред

рдХреБрдЫ рдФрд░ рдмрд┐рдВрджреБ рдЬреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд▓реА рдХреЗ рднреАрддрд░ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ рд╣реИред рдпрд╣ рдЙрд╕ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕рдЪ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред
  2. рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ try(try(foo(try(bar)).fum()) рдЬреИрд╕реЗ рднрд╛рд╡реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдпреЛрдЧ рдкрд░ рдард╣рд╛рдХрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдРрд╕реЗ рдЙрдкрдпреЛрдЧреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░рдиреА рдкрдбрд╝рддреА рд╣реИ рдФрд░ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рд╕реНрддрд░ рдкрд░ рд╕рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдирд┐рдЪреЛрдбрд╝рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
  3. рдореИрдВ $#$ try $#$ рдХреЗ рдмрдЬрд╛рдп return-on-error рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред рдмреНрд▓реЙрдХ рд╕реНрддрд░ рдкрд░ рдирд┐рдЧрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ!
  4. рджреВрд╕рд░реА рддрд░рдл рдХреЛрдИ рднреА рд▓рдВрдмрд╛ рдХреАрд╡рд░реНрдб рдЪреАрдЬреЛрдВ рдХреЛ рдХрдо рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдЕрднреА рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред

@ рдЖрд░рдПрд╕рд╕реА

[...]
рдореБрдЦреНрдп рдПрдХ рдпрд╣ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ рдЬрдЯрд┐рд▓, рдЕрдкрдардиреАрдп рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдРрд╕рд╛ рдХреЛрдб рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ @josarian рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рдЧреЛ рдореЗрдВ рдШреГрдгрд┐рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред"
[...]

headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := try(parentObjOne.AsCommit())
parentCommitTwo := try(parentObjTwo.AsCommit())

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ "рдЦрд░рд╛рдм рдХреЛрдб" рдкрд░ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЖрдЬ рдирд┐рдореНрди рдмреНрд▓реЙрдХ рдХреА рддрд░рд╣ рднрдпрд╛рдирдХ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

рдиреЗрд╕реНрдЯреЗрдб try рдХреЙрд▓ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдкрд░ рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЧрд▓рддреА рд╕реЗ рдЦрд░рд╛рдм рдХреЛрдб рди рд▓рд┐рдЦ рд╕рдХреЗрдВ?

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

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

try рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдХреЗ рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред try рдПрдХ рдмрдпрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред

@rsc , рдЖрдкрдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП,

рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХрд╛ рдореЗрд░рд╛ рдкреИрдХреЗрдЬ-рд╕реНрддрд░реАрдп рд╣реИрдВрдбрд▓рд░ - рдЬрдм рддреНрд░реБрдЯрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ:

func quit(err error) {
   fmt.Fprintf(os.Stderr, "quit after %s\n", err)
   debug.PrintStack()      // because panic(err) produces a pile of noise
   os.Exit(3)
}

рдкреНрд░рд╕рдВрдЧ: рдореИрдВ os.File рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ (рдЬрд╣рд╛рдВ рдореБрдЭреЗ рджреЛ рдмрдЧ рдорд┐рд▓реЗ рд╣реИрдВ: #26650 рдФрд░ #32088)

рдореВрд▓ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ-рд╕реНрддрд░реАрдп рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ caller рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдПрдХ рдЙрддреНрдкрдиреНрди рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдХреЙрд▓рд░ ()ред

рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ _go fmt_ рдкреБрдирд░реНрд▓реЗрдЦрдХ рдореМрдЬреВрджрд╛ рд╕реНрд╡рд░реВрдкрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдпрд╛ рдЖрдкрдХреЛ рдкреНрд░рддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рд░реВрдкрдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рджреЗрдЧрд╛ред рдореИрдВ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реВрдБред

try() рдХреА рд▓рд╛рдЧрдд (рдЕрд░реНрдерд╛рдд рдХрдорд┐рдпрд╛рдВ) рдКрдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИрдВред

рдореБрдЭреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЯреАрдо рдиреЗ рд╣рдореЗрдВ рдкрд╣рд▓реЗ check/handle (рдкрд░реЛрдкрдХрд╛рд░реА рд░реВрдк рд╕реЗ, рдПрдХ рдЙрдкрдиреНрдпрд╛рд╕ рд╡рд┐рдЪрд╛рд░), рдФрд░ рдлрд┐рд░ рдЯрд░реНрдирд░реАрд╕реНрдХ try() рдХреА рдкреЗрд╢рдХрд╢ рдХреАред рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдкрдиреЗ RFP рд░реА рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЬрд╛рд░реА рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХреА, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд░ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдЯрд┐рдкреНрдкрдгреА рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ (рджреЗрдЦреЗрдВ #29860)ред рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЬреНрдЮрд╛рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ!

@ рдЖрд░рдПрд╕рд╕реА

рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ:

try {error} {optional wrap func} {optional return args in brackets}

f, err := os.Open(file)
try err wrap { a, b }

... рдФрд░, рдЖрдИрдПрдордУ, рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ (рдЕрдиреБрдкреНрд░рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдФрд░ рд╕рд╛рде рд╣реА рдЕрд░реНрде рд╕рдЯреАрдХрддрд╛:

f, err := os.Open(file)
relay err

рдпрд╛

f, err := os.Open(file)
relay err wrap

рдпрд╛

f, err := os.Open(file)
relay err wrap { a, b }

рдпрд╛

f, err := os.Open(file)
relay err { a, b }

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

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдХреЛрд╢рд┐рд╢ рдХрд╛ рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - 1. рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рд╡рд┐рд╖рдпрдЧрдд рд░реВрдк рд╕реЗ рдЖрдВрдХрдирд╛ 2. рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдирд┐рд╖реНрдкрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ 3. рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ 4. рдХрдИ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣реЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдЬреЛ рдмрд╛рдзрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдПрдХ рдЕрд╡рд░реЛрдзрди рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред

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

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

рдЬрд╛рд╡рд╛ рдФрд░ рдкрд╛рдпрдерди рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдХреА рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЧреЛ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдХреМрди рд╕реА рдирд╣реАрдВред рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд try рдХреА рдЦреВрдмреА рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рд░рд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@Goodwine рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рдХреБрд░реВрдкрддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рднреА:

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

... рдЬреЛ рдЖрдк рдЕрдХреНрд╕рд░ рдЯреНрд░рд╛рдИ-рдХреИрдЪ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрд╕рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ

parentCommitOne := r.Head().Peel(git.ObjectCommit).AsCommit()
parentCommitTwo := remoteBranch.Reference.Peel(git.ObjectCommit).AsCommit()

... рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрднреА рднреА рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЛрдб рдХреЗ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдореЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреМрди рд╕реЗ рдирд╣реАрдВред

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

рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдЯреВрд▓ рд▓рд┐рдЦрд╛ рд╣реИ: tryhard (рдЬреЛ рдЗрд╕ рд╕рдордп рдмрд╣реБрдд рдХрдард┐рди рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдлрд╝рд╛рдЗрд▓-рджрд░-рдлрд╝рд╛рдЗрд▓ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ try рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдПрдПрд╕рдЯреА рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝реЗрдВред

рдЯрд┐рдк рд░рд┐рдкреЛрд░реНрдЯ рдкрд░ рдЗрд╕реЗ $GOROOT/src рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ > try рдХреЗ рд▓рд┐рдП 5000 (!) рдЕрд╡рд╕рд░ред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЭреВрдареЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рд╛рде рд╕реЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдирдореВрдиреЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрд╡рд╕рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВред

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

( рд╕рд╛рд╡рдзрд╛рдиреА: рдкреБрдирд░реНрд▓реЗрдЦрди рд╕реБрд╡рд┐рдзрд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдЧреА! рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред )

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдареЛрд╕ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдХреЛрдб try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдмреЗрдХрд╛рд░ рдФрд░ рдЕрдиреБрддреНрдкрд╛рджрдХ рдЕрдЯрдХрд▓реЛрдВ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рджреЗрддрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЖрдирдВрдж рд▓реЗрдВред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ "рдЦрд░рд╛рдм рдХреЛрдб" рдкрд░ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЖрдЬ рдирд┐рдореНрди рдмреНрд▓реЙрдХ рдХреА рддрд░рд╣ рднрдпрд╛рдирдХ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

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

рдиреЗрд╕реНрдЯреЗрдб try рдХреЙрд▓ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдкрд░ рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЧрд▓рддреА рд╕реЗ рдЦрд░рд╛рдм рдХреЛрдб рди рд▓рд┐рдЦ рд╕рдХреЗрдВ?

рдЧреЛ рдХреА рд╕рд╛рджрдЧреА рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЪрдпрди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдмрдВрдз рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд░реВрдврд╝рд┐рд╡рд╛рджрд┐рддрд╛, рд░рдЪрдирд╛рд╢реАрд▓рддрд╛, рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рд░рд▓рддрд╛ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИред

рдЖрдЬ, рдпрд╣ рдПрдХ рдирд┐рдпрдо рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕:

x := expression
y := f(x)

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

y := f(expression)

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

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

рдореИрдВрдиреЗ рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ https://github.com/golang/go/issues/18130#issuecomment -264195616 (рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ) рдкрд░ рдПрдХ рд▓рдВрдмреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд▓рд┐рдЦреА рдереА рдЬреЛ рдпрд╣рд╛рдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред

@рдмрдХреБрд▓ ,

рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмрд╛рдд рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреВрдВред рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рдмрдпрд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ рдЬреЛ _don't need_ try ред

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

рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирдирд╛ рд╣реИ рдХрд┐ рдЪреЗрдХ рдХрд╣рд╛рдВ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:

try {
    s = canThrowErrors()
    t = cannotThrowErrors()
    u = canThrowErrors() // a second call
} catch {
    // how many ways can you get here?
}

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

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

do {
    let s = try canThrowErrors()
    let t = cannotThrowErrors()
    let u = try canThrowErrors() // a second call
} catch {
    handle error from try above
}

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

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: @velovix рдХреА рдЯрд┐рдкреНрдкрдгреА рддреАрди рдКрдкрд░ рднреА рджреЗрдЦреЗрдВ, рдЬреЛ рддрдм рдЖрдИ рдЬрдм рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред

@ рдбреЗрд╡рд┐рдб , рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ "рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рд░рд┐рд▓реЗ" рд╕рд╛рджреГрд╢реНрдп рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд░реНрдХрд┐рдЯ рдирд╣реАрдВ рд╣реИрдВред

рдХрд┐рд╕реА рднреА рд╢рдмреНрдж рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
"рдмреНрд░реЗрдХ" рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред
"рдЬрд╛рд░реА рд░рдЦреЗрдВ" рд╕рд╛рдорд╛рдиреНрдп рдХреА рддрд░рд╣ рдЕрдЧрд▓реЗ рдХрдерди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред
"рдЧреЛрдЯреЛ" ... рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рд╕рдордЭрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред :-)

https://www.google.com/search?q=define+try рдХрд╣рддрд╛ рд╣реИ "рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдпрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ" рдФрд░ "рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдзреАрди"ред рд╡реЗ рджреЛрдиреЛрдВ "f: = try(os.Open(file))" рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ os.Open рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ (рдпрд╛, рдпрд╣ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдзреАрди рдХрд░рддрд╛ рд╣реИ), рдФрд░ рдпрджрд┐ рдкреНрд░рдпрд╛рд╕ (рдпрд╛ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо) рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЕрдЧрд╕реНрдд рдореЗрдВ рдЪреЗрдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╢рдмреНрдж рдерд╛ред рд╣рдордиреЗ C++/Java/Python рдХреЗ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд╕рд╛рдорд╛рди рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ try рдХрд╛ рд╡рд░реНрддрдорд╛рди рдЕрд░реНрде рд╕реНрд╡рд┐рдлреНрдЯ рдХреА рдХреЛрд╢рд┐рд╢ (рдЖрд╕рдкрд╛рд╕ рдХреЗ рдбреВ-рдХреИрдЪ рдХреЗ рдмрд┐рдирд╛) рдФрд░ рд░рд╕реНрдЯ рдХреЗ рдореВрд▓ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдЕрд░реНрде рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ! . рдпрд╣ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЪреЗрдХ рд╕рд╣реА рд╢рдмреНрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдирд╛рдо рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣рд╛рдВ $#$1 github.com/josharian/pct #$ рд╕реЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк tryhard рдЧрд▓рдд рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИред рдореИрдВ рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЗрд╕рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдХреНрдпреЛрдВрдХрд┐:

  • рдпрд╣ рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд try рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ
  • рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ if err != nil рдХреА рджреГрд╢реНрдп рд▓рд╛рдЧрдд рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд▓реЛрдЧ (рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ) рдЕрдкрдиреЗ рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ try рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдкрд╣рд▓реЗ:

var err error
switch {
case *flagCumulative:
    _, err = fmt.Fprintf(w, "% 6.2f%% % 6.2f%%% 6d %s\n", p, f*float64(runtot), line.n, line.s)
case *flagQuiet:
    _, err = fmt.Fprintln(w, line.s)
default:
    _, err = fmt.Fprintf(w, "% 6.2f%%% 6d %s\n", p, line.n, line.s)
}
if err != nil {
    return err
}

рдХреЗ рдмрд╛рдж (рдореИрдиреБрдЕрд▓ рдкреБрдирд░реНрд▓реЗрдЦрди):

switch {
case *flagCumulative:
    try(fmt.Fprintf(w, "% 6.2f%% % 6.2f%%% 6d %s\n", p, f*float64(runtot), line.n, line.s))
case *flagQuiet:
    try(fmt.Fprintln(w, line.s))
default:
    try(fmt.Fprintf(w, "% 6.2f%%% 6d %s\n", p, line.n, line.s))
}

рдмрджрд▓реЗрдВ https://golang.org/cl/182717 рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ: src: apply tryhard -r $GOROOT/src

рдПрд╕рдЯреАрдбреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ try рдХреЗ рджреГрд╢реНрдп рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, CL 182717 рдкрд░ рдЬрд╛рдПрдВред

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

"рдмреНрд░реЗрдХ" рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред
"рдЬрд╛рд░реА рд░рдЦреЗрдВ" рд╕рд╛рдорд╛рдиреНрдп рдХреА рддрд░рд╣ рдЕрдЧрд▓реЗ рдХрдерди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред
"рдЧреЛрдЯреЛ" ... рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рд╕рдордЭрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред :-)

break рд▓реВрдк рддреЛрдбрд╝рддрд╛ рд╣реИред continue рд▓реВрдк рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ, рдФрд░ goto рд╕рдВрдХреЗрддрд┐рдд рдЧрдВрддрд╡реНрдп рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╕реБрдирддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЕрдзрд┐рдХрддрд░ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░реЛрд▓рдмреИрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХреЛрд╢рд┐рд╢/рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ check рдХрд╣реАрдВ рдмреЗрд╣рддрд░ рд╣реИ ("рдкрд░реАрдХреНрд╖рд╛" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдкреНрд░рдЧрддрд┐ рдХреЛ рд░реЛрдХрдирд╛" рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ)ред

рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ, рдореИрдВ рдХреЛрд╢рд┐рд╢/рдЬрд╛рдВрдЪ рдХреЗ рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреЗрд╢ рдХрд┐рдпрд╛ рдерд╛ред
try {error} {optional wrap func} {optional return args in brackets}

f, err := os.Open(file)
try err wrap { a, b }

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

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

рдореИрдВ рдХреЛрд╢рд┐рд╢/рдЬрд╛рдВрдЪ рдХреЗ рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреЗрд╢ рдХрд┐рдпрд╛ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлреЙрд░реНрдо рдореМрдЬреВрджрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

@networkimprov , рдкреБрдирдГ https://github.com/golang/go/issues/32437#issuecomment -502879351

рдореБрдЭреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЯреАрдо рдиреЗ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЪреЗрдХ/рд╣реИрдВрдбрд▓ (рдзрд░реНрдорд╛рд░реНрде, рдПрдХ рдЙрдкрдиреНрдпрд╛рд╕ рд╡рд┐рдЪрд╛рд░) рдХреА рдкреЗрд╢рдХрд╢ рдХреА, рдФрд░ рдлрд┐рд░ рдЯрд░реНрдирд░реАрд╕реНрдХ рдХреЛрд╢рд┐рд╢ ()ред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдкрдиреЗ RFP рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреНрдпреЛрдВ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдкрд░ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдЯрд┐рдкреНрдкрдгреА рдПрдХрддреНрд░ рдХрд░реЗрдВ (рджреЗрдЦреЗрдВ #29860)ред рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЬреНрдЮрд╛рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ!

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

рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдпрд╣ рджрд╛рд╡рд╛ рди рдХрд░реЗрдВ рдХрд┐ рд╣рдордиреЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рдорд╛рдВрдЧреА рдпрд╛ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрд╣ рдмрд╕ рд╕рдЪ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ "рдЯрд░реНрдиреЗрд░реАрд╕реНрдХ" рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рднреА рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ред

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

@rsc , рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрдХрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ!
рдореИрдВрдиреЗ https://github.com/golang/go/issues/32437#issuecomment -502840914 рдореЗрдВ рдкреИрдХреЗрдЬ-рд╕реНрддрд░реАрдп рд╣реИрдВрдбрд▓рд░ рдЙрдард╛рдП
рдФрд░ https://github.com/golang/go/issues/32437#issuecomment -502879351 рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛

рдореИрдВ рдкреИрдХреЗрдЬ-рд╕реНрддрд░реАрдп рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рд▓рдЧрднрдЧ рд╣рд░ рдХреЛрдИ рдкреАрдЫреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ {} рдХреИрдЪ {} рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЕрдзрд┐рдХ рдкрд╣рд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рди рдХрд░реЗрдВ

рдХреГрдкрдпрд╛ {} рдХреИрдЪ {} рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЕрдзрд┐рдХ рдкрд╣рд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рди рдХрд░реЗрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреЗрд╣рддрд░ рдкрд╣рд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдЬрдм рдЕрдиреНрдп рд▓реЛрдЧ рдЬреЛ рдкрд╣рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ

@jimwei

рдЕрдкрд╡рд╛рдж-рдЖрдзрд╛рд░рд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдкрд╣рд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╣реИрдВред рдореВрд▓ рдорд╕реМрджрд╛ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

https://github.com/golang/go/issues/32437#issuecomment -502837008 рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ ( рдПрдХ рдмрдпрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ try рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @rsc рдХреА рдЯрд┐рдкреНрдкрдгреА)

рдЖрдк рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рдЙрдард╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдЙрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛: https://github.com/golang/go/issues/32437#issuecomment -502871889

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

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

рдЕрдкрдирд╛ рдЙрджрд╛рд╣рд░рдг рдЙрдзрд╛рд░ рд▓реЗрдирд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреЗрд╡рд▓ 2 рдХреЙрд▓ рдХреЙрд▓ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд░рдирд╛ рдХрд╛рдлреА рдШреГрдгрд┐рдд рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╡реЗ рдХреЛрдб рд╕рдореАрдХреНрд╖рдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

parentCommitOne := try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit()
parentCommitTwo := try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit()
tree := try(r.LookupTree(try(index.WriteTree())))

рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреЗрд╡рд▓ 2-рдЧрд╣рд░реА) рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдХрд╛рдлреА рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред рдиреЗрд╕реНрдЯреЗрдб try рдХреЙрд▓ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ "рдбреАрдмрдЧрдмрд┐рд▓рд┐рдЯреА" рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднреА рдорджрдж рдорд┐рд▓реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ try рдХреЛ if рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рд╣рд░ рд╣реИред

рджреЛрдмрд╛рд░рд╛, рдореИрдВ рд▓рдЧрднрдЧ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рдЙрдк-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ try рдХреЛ golint рджреНрд╡рд╛рд░рд╛ рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рдЦреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлреНрд▓реИрдЧ рдХреЛрдб рднреА рд╣реЛрдЧрд╛, рдЬреЛ рдореЗрд░реА рдирдЬрд░ рдореЗрдВ рдареАрдХ рд╣реИ:

x := 5 + try(strconv.Atoi(input))

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

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

@ рдЖрд░рдПрд╕рд╕реА

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ try() - рдмрдирд╛рдо try рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрдпрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдорд╛рд░рд╛ - рдпрд╣ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдШреЛрдВрд╕рд▓реЗ рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдорд╛рди рдерд╛ рдФрд░ рдлрд┐рд░ рднреА try() рдФрд░ рдЯрд░реНрдирд░реА рдХреЗ рдЦрд┐рд▓рд╛рдл рддрд░реНрдХреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреИрд╕реЗ рдерд╛ рдереЗ _(рдкреИрд░рд╛рдлреНрд░реЗрд╢реЗрдб):_

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

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

_ "рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрднреА рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрд╛ рд╣реИ? : рдЬрд┐рд╕реЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдХрд░ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯ рд░рд╣рд╛ рд╣реИред)"_

рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдореИрдВ рдЕрдХреНрд╕рд░ рдПрдХ if рд╕реЗ рдПрдХ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдХрд░ рдмрдпрд╛рдиреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕реЗ рдореИрдВрдиреЗ рдЖрдЬ PHP рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛:

return isset( $_COOKIE[ CookieNames::CART_ID ] )
    ? intval( $_COOKIE[ CookieNames::CART_ID ] )
    : null;

рд╕реЗ рддреБрд▓рдирд╛:

if ( isset( $_COOKIE[ CookieNames::CART_ID ] ) ) {
    return intval( $_COOKIE[ CookieNames::CART_ID ] );
} else { 
    return null;
}

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореЗрд░рд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдореЗрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИред

fwiw

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

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

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

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

@rsc , рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрдХрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ!
рдореИрдВрдиреЗ #32437 рдореЗрдВ рдкреИрдХреЗрдЬ-рд╕реНрддрд░реАрдп рд╣реИрдВрдбрд▓рд░ рдЙрдард╛рдП (рдЯрд┐рдкреНрдкрдгреА)
рдФрд░ #32437 рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ (рдЯрд┐рдкреНрдкрдгреА)

рдореИрдВ рдкреИрдХреЗрдЬ-рд╕реНрддрд░реАрдп рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рд▓рдЧрднрдЧ рд╣рд░ рдХреЛрдИ рдкреАрдЫреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

@beoran рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рд╕реБрдзрд╛рд░ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред try(..., func(err) error) , рдпрд╛ tryf(..., "context of my error: %w") рдХреЗ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдкрд░ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рддрд░рд╣?

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

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

https://github.com/golang/go/issues/32437#issuecomment -502975437

рдЗрд╕рдХреЗ рдмрд╛рдж рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реИрд▓рд┐рдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдерд╛ред рдпрджрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рддреЛ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ if рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рд╕реБрд╕рдВрдЧрдд рд╣реИ рдФрд░ "рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ" рдХрд╛ рд▓рд╛рдн рдерд╛ред

@beoran рд╕рд╣рдорддред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рд╣рдо try рдХреАрд╡рд░реНрдб ( try рдФрд░ try / else ) рдХреЗ рддрд╣рдд рддреНрд░реБрдЯрд┐ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдВред рднрд▓реЗ рд╣реА try / else рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ if err != nil рд╢реИрд▓реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рд▓рдВрдмрд╛рдИ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ try рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ else ) рдорд╛рдорд▓рд╛ред рдЙрди рджреЛ рдорд╛рдорд▓реЛрдВ (рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ) рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ try рдХреЗ рдмрд┐рд▓реНрдЯрд┐рди рдиреЛ-рд╡рд░реНрдЬрди рдХреЗ рд╡рд┐рд░реЛрдз рдореЗрдВ рд░рдЦрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реМрдЯрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред

рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

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

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

@deanveloper рдиреЗ рд▓рд┐рдЦрд╛:

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

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб try рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╣реА рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ try рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ golint рдХреЛ рдЗрд╕реЗ рдХреНрдпреЛрдВ рдордирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@brynbellomy рдиреЗ рд▓рд┐рдЦрд╛:

рднрд▓реЗ рд╣реА рдХреЛрд╢рд┐рд╢/рдЕрдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рдореЗрдВ рдХреЛрдб рд▓рдВрдмрд╛рдИ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдореМрдЬреВрджрд╛ рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп рд╢реИрд▓реА, рдпрд╣ рд╣рдореЗрдВ рдХреЛрд╢рд┐рд╢ (рдХреЛрдИ рдФрд░ рдирд╣реАрдВ) рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рддрд╛ рджреЗрддрд╛ рд╣реИред

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

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

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд╣рд╛рдВ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдФрд░ "рдкреНрд░рдЧрддрд┐" рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрдЪрд┐рддреНрдп рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЯреВрдЯрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдкрд╕рдВрдж рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд░реНрд╢рди рдХрд╛ рдмрд╣реБрдд рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред

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

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

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

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

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

рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЯреВрдЯрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдкрд╕рдВрдж рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд░реНрд╢рди рдХрд╛ рдмрд╣реБрдд рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред

рдмрд┐рд▓ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИред

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

@ ardan-bkennedy, рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

рдЖрдк рдЕрдХреЗрд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕реА рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП https://swtch.com/try.html#nonissue рджреЗрдЦреЗрдВред рд╣рдордиреЗ рдЙрди рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдЖрдзрд╛рд░реЛрдВ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рд╣реИред рд░реЙрдмрд░реНрдЯ рдХреЗ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдерд╛ рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдХреНрдпрд╛ рдкрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧреА рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╛рд░реНрдердХ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдиреБрдорд╛рди рд╣реИ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдпрд╣ рдареАрдХ рд╣реИред рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдЙрди рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдирд╛ рд╣реИред

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

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

@ ardan-bkennedy, рджреВрд╕рд░реЗ рдлреЙрд▓реЛрдЕрдк рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

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

рдЗрд╕ рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рджреЛ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдкрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

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

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

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

рдЙрдкрдХрд░рдг tryhard рдмрд╣реБрдд рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╣реИ!
рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЕрдХреНрд╕рд░ return ...,err рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ ( pkg/errors рдХреЗ рд╕рд╛рде), рдЬреНрдпрд╛рджрд╛рддрд░ http рд╣реИрдВрдбрд▓рд░ рдореЗрдВред рдореИрдВ рдХреЛрдб рдХреА рдХрдо рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдкрдардиреАрдпрддрд╛ рдореЗрдВ рдЬреАрддрддрд╛ рд╣реВрдВред
рдлрд┐рд░ рд╢реЛрдз рдореЗрдВ http рд╣реИрдВрдбрд▓рд░ рдореИрдВ рдПрдХ defer fmt.HandleErrorf(&err, "handler xyz") рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реВрдВрдЧрд╛ред

рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╛рдорд▓реЗ рднреА рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ fmt.Printf рдФрд░ рдореИрдВ рдЗрд╕реЗ try рдХреЗ рд╕рд╛рде рдХрд░реВрдБрдЧрд╛ред
рдХреНрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП defer try(f.Close()) рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

рддреЛ, рд╢рд╛рдпрдж try рдЕрдВрдд рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╡рд┐рдкрд░реАрдд рдХреЗ рдмрдЬрд╛рдп рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдЕрд╕рд▓реА рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзреАрд░ рд╣реВрдБ!

@flibustenet рдЬреИрд╕рд╛ рд╣реИ рдкреНрд░рд╕реНрддрд╛рд╡ defer try(f()) рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ ( рддрд░реНрдХ рджреЗрдЦреЗрдВ)ред рдЗрд╕рдореЗрдВ рддрдорд╛рдо рддрд░рд╣ рдХреА рджрд┐рдХреНрдХрддреЗрдВ рд╣реИрдВред

рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ tryhard рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреНрдпрд╛ рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ if err != nil рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреА рддреБрд▓рдирд╛ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдкрд╛рд╕ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ?

рдореЗрд░реА рд╕реЛрдЪ рдпрд╣ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╡рд┐рд╢рд╛рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ 1000 рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреА рд╣реИ рдЬрд╣рд╛рдВ try() рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рд▓реЗрдХрд┐рди 10000 if err != nil рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА 1000 рд╡рд┐рд╢рд╛рд▓ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдкреВрд░реА рдЪреАрдЬ рдХрд╛ рдХреЗрд╡рд▓ 10% рд╣реИ .

@ рдЧреБрдбрд╡рд╛рдЗрди рд╣рд╛рдБред рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░ рдкрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЛрдб рдмрд╣реБрдд рд╕реАрдзрд╛ рдФрд░ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рд╣реИред рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ), рдХреНрд▓реЛрди рдХрд░реЗрдВ, рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВред

рдХреНрдпрд╛ defer try(f()) рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛

defer func() error {
    if err:= f(); err != nil { return err }
    return nil
}()

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

рдореИрдВрдиреЗ рддрд░реНрдХ рдкрдврд╝рд╛ рд╣реИ рдЬреЛ defer try(f) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ defer try(f()) ред рдПрдХ рдЯрд╛рдЗрдкреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

go try(f()) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИ

go func() error {
    if err:= f(); err != nil { return err }
    return nil
}()

рдпрд╣рд╛рдВ try рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рд╣рд╛рдирд┐рд░рд╣рд┐рдд рд╣реИред

@ ardan-bkennedy рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдкреВрд░реЗ рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХрдИ рдирд┐рд░рд╛рдзрд╛рд░ рджрд╛рд╡реЗ рдХрд┐рдП рд╣реИрдВ ред

рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @rsc рдиреЗ рдкрд╣рд▓реЗ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ:

  • рд╣рдордиреЗ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЯреВрдЯ рдЧрдпрд╛ рд╣реИред рдбрд┐рдЬрд╛рдЗрди рдЕрд╡рд▓реЛрдХрди (рдЧреЛ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛!) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдмреЛрдЬрд╝ - рдпрд╣ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рдЖрдзрд╛рд░ рд╣реИред

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

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

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

рдзрдиреНрдпрд╡рд╛рджред

return isset( $_COOKIE[ CookieNames::CART_ID ] )
    ? intval( $_COOKIE[ CookieNames::CART_ID ] )
    : null;

рдмрд╣реБрдд рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ return intval( $_COOKIE[ CookieNames::CART_ID ] ) ?? null; FWIW рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ

@ рдмрд╛рдХреБрд▓ рдХреНрдпреЛрдВрдХрд┐ рддрд░реНрдХреЛрдВ рдХрд╛ рддреБрд░рдВрдд рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рдмрд░рд╛рдмрд░ рд╣реИ:

<result list> := f()
defer try(<result list>)

рдпрд╣ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ f() рдХреЛ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред go try(f()) рдкрд░ рднреА рдпрд╣реА рдмрд╛рдд рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред

@ рдмрд╛рдХреБрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ defer try(f) ( defer try(f()) рдХреЗ рдмрдЬрд╛рдп) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ try рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (рдЖрдк try(err) рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ err рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ error )ред рддреЛ рдЯрд╛рдЗрдкреЛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ред f рдХреЗрд╡рд▓ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдмреБрд▓рд╛рдирд╛ред

@deanveloper , @griesemer рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ :-) рдзрдиреНрдпрд╡рд╛рджред

@carl-mastrangelo

_"рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ return intval( $_COOKIE[ CookieNames::CART_ID ] ) ?? null; _ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдЖрдк PHP 7.x рдорд╛рди рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЖрдкрдХреЗ рдХрд░реНрдХрд╢ рдЪреЗрд╣рд░реЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдмрд╛рдд рдирд╣реАрдВ рдереАред :рдЖрдБрдЦ рдорд╛рд░рдирд╛:

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

рдРрд╕рд╛ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмреИрдардХ рдХреА рдереА рдФрд░ рджреЛ рдкреИрдЯрд░реНрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдереА:

  1. рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ mystruct рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реБрдП рддреНрд░реБрдЯрд┐ рд╕рдВрд░рдЪрдирд╛ рдмрдврд╝рд╛рдПрдБред рддреНрд░реБрдЯрд┐ ()
  2. рддреНрд░реБрдЯрд┐ рдХреЛ рдпрд╛ рддреЛ рдлрд╝реАрд▓реНрдб рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдирд╛рдо рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ
type ExtErr struct{
  error
  someOtherField string
}  

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

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

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

@mikeschinkel рдореИрдВ рд╡рд╣ рдХрд╛рд░реНрд▓ рдирд╣реАрдВ рд╣реВрдВ рдЬрд┐рд╕реЗ рдЖрдк рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВред

@ рдбреЗрд╡рд┐рдб , рдлрд┐рд░ рд╕реЗ:

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

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

рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрдЧ

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

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

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВред рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг os.Open рд╣реИред рдЧреЛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ " рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдПрдВрдб рдЧреЛ " рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:

рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рддреНрд░реБрдЯрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред
os.Open рд╕реНрд╡рд░реВрдкреЛрдВ рджреНрд╡рд╛рд░рд╛ "рдЦреБрд▓реА/рдЖрджрд┐/рдкрд╛рд╕рд╡рд╛рд░реНрдб: рдЕрдиреБрдорддрд┐ рдЕрд╕реНрд╡реАрдХреГрдд" рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐, рди рдХрд┐ рдХреЗрд╡рд▓ "рдЕрдиреБрдорддрд┐ рдЕрд╕реНрд╡реАрдХреГрдд"ред

рдПрд░рд░реНрд╕ рдкрд░ рдЗрдлреЗрдХреНрдЯрд┐рд╡ рдЧреЛ рдХрд╛ рд╕реЗрдХреНрд╢рди рднреА рджреЗрдЦреЗрдВред

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

рдЖрдЬ рдЧреЛ рд╕рдореНрдореЗрд▓рди рдХреЗ рдмрд╛рдж рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдкрд░реАрдд рд╕рдореНрдореЗрд▓рди рдХреЛ рдорд╛рдирддреЗ рд╣реБрдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рднреА рд╣реИрдВред рдХреЛрдб рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрдо рд╣реИ рдЬреИрд╕реЗ:

f, err := os.Open(file)
if err != nil {
    log.Fatalf("opening %s: %v", file, err)
}

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

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

рдЧреЛрдлрд░рдХреЙрди рдЪреЗрдХ/рд╣реИрдВрдбрд▓ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ:

func CopyFile(src, dst string) error {
    handle err {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    ...
}

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдиреЗ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рд╡рд╣реА рд╣реИ:

func CopyFile(src, dst string) (err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("copy %s %s: %v", src, dst, err)
        }
    }()

    r := try(os.Open(src))
    defer r.Close()

    w := try(os.Create(dst))
    ...
}

рдФрд░ рд╣рдо рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреА рддрдХ рдЕрдЬреНрдЮрд╛рдд рд╕рд╣рд╛рдпрдХ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

func CopyFile(src, dst string) (err error) {
    defer HelperToBeNamedLater(&err, "copy %s %s", src, dst)

    r := try(os.Open(src))
    defer r.Close()

    w := try(os.Create(dst))
    ...
}

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░реНрдХрд╕рдВрдЧрддрддрд╛ рдФрд░ рд╕рдлрд▓рддрд╛ рдЗрди рдорд╛рдиреНрдпрддрд╛рдУрдВ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдХрджрдореЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ:

  1. рд▓реЛрдЧреЛрдВ рдХреЛ рдмрддрд╛рдП рдЧрдП рдЧреЛ рд╕рдореНрдореЗрд▓рди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП "рдХреИрд▓реА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИред"
  2. рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рд╕рдордЧреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдлрд╝рдВрдХреНрд╢рди-рд╕реНрддрд░реАрдп рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
    рдСрдкрд░реЗрд╢рди, рди рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдк-рдЯреБрдХрдбрд╝рд╛ рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ (рд╡рд╣ рдЙрдк-рдЯреБрдХрдбрд╝рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрд╡рдпрдВ-рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред
  3. рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЛ рдХреЛрдб рдЖрдЬ рдлрд╝рдВрдХреНрд╢рди-рд╕реНрддрд░реАрдп рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╣реИред
  4. рдлрд╝рдВрдХреНрд╢рди-рд╕реНрддрд░реАрдп рд╕рдВрджрд░реНрдн рдХреЛ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рдЗрд╕рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛ рдЬрд╛рдПрдЧреА рдХрд┐
    рдбреЗрд╡рд▓рдкрд░реНрд╕ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред
  5. рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд╕рдореНрдореЗрд▓рди рдХреЗ рдмрд╛рдж рдФрд░ рдЙрдкрдпреБрдХреНрдд рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЧреЛ рдХреЛрдб рд╣реЛрдЧрд╛ред

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

рдзрдиреНрдпрд╡рд╛рджред

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

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

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

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

func AddNewGuy(name string) (guy Guy, err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("adding guy %v: %v", name, err)
        }
    }()

    guy = Guy{name: name}
    guy.Team = ChooseRandomTeam()
    try(guy.Team.Add(guy))
    try(AddToLeague(guy))
    return guy, nil
}

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЧрд▓рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ guy.Team.Add(guy) рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди AddToLeague(guy) рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдЯреАрдо рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдорд╛рдиреНрдп рдЧрд╛рдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛ рдЬреЛ рд▓реАрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд╕рд╣реА рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛, рдЬрд╣рд╛рдВ рд╣рдо guy.Team.Add(guy) рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдм try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func AddNewGuy(name string) (guy Guy, err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("adding guy %v: %v", name, err)
        }
    }()

    guy = Guy{name: name}
    guy.Team = ChooseRandomTeam()
    try(guy.Team.Add(guy))
    if err := AddToLeague(guy); err != nil {
        guy.Team.Remove(guy)
        return Guy{}, err
    }
    return guy, nil
}

рдпрд╛, рдпрджрд┐ рд╣рдо рдЧреИрд░-рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо return Guy{}, err рдХреЛ try(err) рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рднрд▓реЗ рд╣реА, defer -ed рдлрд╝рдВрдХреНрд╢рди рдЕрднреА рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИред

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

рдЖрдк рдЕрдХреЗрд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕реА рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП https://swtch.com/try.html#nonissue рджреЗрдЦреЗрдВред рд╣рдордиреЗ рдЙрди рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@rsc рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рддреНрд░реБрдЯрд┐ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рддреЛ, рдХреГрдкрдпрд╛, рдореБрдЭреЗ рдЧрд┐рдиреЗрдВред

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

рдореИрдВрдиреЗ https://go-review.googlesource.com/c/go/+/182717/1/src/cmd/link/internal/ld/macho_combine_dwarf.go рджреЗрдЦрд╛ рдФрд░ рдореБрдЭреЗ рдкреБрд░рд╛рдирд╛ рдХреЛрдб рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ, рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рд░рд╛рдп рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИред

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

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

рд╣рдореЗрдВ рдпрд╣ рднреА рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ/рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджреЗрдВрдЧреЗред рдХреБрдЫ рдЬрд░реВрд░ рд╣реЛрдВрдЧреЗред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП gofmt рдХреЛ рдмрджрд▓рдирд╛ рдкрдбрд╝реЗред рдРрд╕реЗ "рджреБрд╖реНрдЯ" рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирдП рдкреНрд░рдпрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ gofmt рдРрд╕рд╛ рдХрд░ рд╕рдХреЗ?

рдЬрдм рд▓реЛрдЧ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП go1.13 рдФрд░ рдкрд╣рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ?

рдореБрдЭреЗ рд╢рд╛рдпрдж рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдпрд╣ рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рд▓рд╛рдпрдХ рд╣реИ? рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдорд╛рдирддрд╛ред

рдПрд▓реЗрдХреНрд╕

@griesemer
97 рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рднреА рдкрдХрдбрд╝рд╛ рдирд╣реАрдВ рдЧрдпрд╛, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ 2 рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
1 :

    if err := updateItem(tx, fields, entityView.DataBinding, entityInstance); err != nil {
        tx.Rollback()
        return nil, err
    }

рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ tx.Rollback() рдЧрд▓рддреА рдХреЗ рдмреАрдЪ := рдФрд░ рд░рд┐рдЯрд░реНрди рд▓рд╛рдЗрди,
рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ defer рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдФрд░ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рднреА рдкрдереЛрдВ рдХреЛ tx.Rollback() рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ ?

  1. рдпрд╣ рднреА рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ:
if err := db.Error; err != nil {
        return nil, err
    } else if itemDb, err := GetItem(c, entity, entityView, ItemRequest{recNo}); err != nil {
        return nil, err
    } else {
        return itemDb, nil
    }

рдпрд╛

    if err := db.Error; err != nil {
        return nil, err
    } else {
            if itemDb, err := GetItem(c, entity, entityView, ItemRequest{recNo}); err != nil {
                return nil, err
            } else {
                return itemDb, nil
            }
        return result, nil
    }

рдХреНрдпрд╛ рдпрд╣ рд╢реИрдбреЛрдЗрдВрдЧ рдпрд╛ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рдпрд╛рд╕ рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрд╡рд╛рдж рд╣реЛрдЧрд╛? рдЕрд░реНрде - рдХреНрдпрд╛ рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдХреЛ рдЧрд▓рддреА рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: = ... рд╡рд╛рдкрд╕реА рдЧрд▓рддреА?

@guybrand рдкреБрди: рдЖрдкрдХреЛ рдорд┐рд▓реЗ рджреЛ рдкреИрдЯрд░реНрди:

1) рд╣рд╛рдБ, tryhard рдмрд╣реБрдд рдореЗрд╣рдирдд рдирд╣реАрдВ рдХрд░рддрд╛ред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ tx.Rollback() рд╕рднреА рдкрдереЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ defer рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, if рд░рдЦрдирд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

2) рдпрд╣рд╛рдВ рд╡рд╣реА: tryhard рдЗрд╕ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреИрдЯрд░реНрди рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж рд╣реЛ рд╕рдХреЗред

рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдХреБрдЫ рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЙрдкрдХрд░рдг рд╣реИред рдЗрд╕реЗ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@alexbrainman

рдЬрдм рд▓реЛрдЧ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП go1.13 рдФрд░ рдкрд╣рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ?

рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реА рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХреЛрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП go рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ go.mod рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрди-рдлрд╝реНрд▓рд╛рдЗрдЯ go.mod рдкреНрд░рд▓реЗрдЦрди go рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ:

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

рдпрджрд┐ рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ try рдЬреИрд╕рд╛ рдХреБрдЫ рдЧреЛ 1.15 рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рд▓реИрдВрдб рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рд╕рдордп рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬрд┐рд╕рдХреА go.mod рдлрд╝рд╛рдЗрд▓ go 1.12 рдкрдврд╝рддреА рд╣реИ, рдЙрд╕ рдирдП try рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреА go.mod рдореЗрдВ рдШреЛрд╖рд┐рдд рдЧреЛ рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ go 1.12 рд╕реЗ рдмрджрд▓рдХрд░ go 1.15 рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред try рдХреА 1.15 рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ред

рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдб рд╣реИ рдЬреЛ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣ рдХреЛрдб рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА go.mod рдлрд╝рд╛рдЗрд▓ рдЕрдкрдиреЗ рдЧреЛ рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ go 1.15 рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХреЛрдИ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЧреЛ 1.12 рдЯреВрд▓рдЪреЗрди рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ, рдЙрд╕ рд╕рдордп рдЧреЛ 1.12 рдЯреВрд▓рдЪреЗрди рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЧреЛ 1.12 рдЯреВрд▓рдЪреЗрди try рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджреЗрд╢ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рдХреЛрдб go.mod рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧреЛ 1.15 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИред . рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдЬ рдХреЗ рдЧреЛ 1.12 рдЯреВрд▓рдЪреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

.\hello.go:3:16: undefined: try
note: module requires Go 1.15

Go2 рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди рдкреНрд░рд╕реНрддрд╛рд╡ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЗрд╕рдХрд╛ рд╕рдЯреАрдХ рд╡рд┐рд╡рд░рдг рдХрд╣реАрдВ рдФрд░ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж # 30791 рдореЗрдВ, рдпрд╛ рдпрд╣ рд╣рд╛рд▓рд┐рдпрд╛ рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдереНрд░реЗрдб )ред

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

рдХреБрд▓ = рдХреЛрдб рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
$find /path/to/repo -name '*.go' -exec cat {} \; | wc -l
рддреНрд░реБрдЯрд┐ = рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛: = (рдпрд╣ рд╢рд╛рдпрдж рдЧрд▓рддреА =, рдФрд░ рдорд╛рдпрд░: = рдпрд╛рдж рдЖрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИ)
$find /path/to/repo -name '*.go' -exec cat {} \; | grep "err :=" | wc -l
рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб = рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдорд┐рд▓реА рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛

рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ рд▓реМрдЯрд╛:
рдХреБрд▓ = 5106
рддреНрд░реБрдЯрд┐рдпрд╛рдБ = 111
рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб = 16

рдмрдбрд╝рд╛ рдХреЛрдб рдЖрдзрд╛рд░
рдХреБрд▓ = 131777
рддреНрд░реБрдЯрд┐рдпрд╛рдБ = 3289
рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб = 265

рдпрджрд┐ рдпрд╣ рдкреНрд░рд╛рд░реВрдк рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рддреЛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдлреЗрдВрдХ рджреЗрдирд╛ рд╕рд╣реА рдкреНрд░рд╛рд░реВрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛
рд╕рд╛рде рд╣реА, рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рддреНрд╡рд░рд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЧрд┐рдирддреА рдХрд░реЗрдВ, рдЧрд▓рддреА рдХреЗ рдЕрд╡рд╕рд░: = (рдФрд░ рд╢рд╛рдпрдж рдЧрд▓рддреА =, рдХреЛрдб рдЖрдзрд╛рд░ рдкрд░ рдХреЗрд╡рд▓ 4 рдореИрдВрдиреЗ рд╕реАрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА)

рдзрдиреНрдпрд╡рд╛рджред

https://github.com/golang/go/issues/32437#issuecomment -503276339 рдореЗрдВ @griesemer рд╕реЗ

рдореИрдВ рдЖрдкрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВред

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

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

  1. рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ outf.Close() рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВред
  2. рд╡рд╛рдкрд╕реА рдорд╛рди рдХреЛ рдирд╛рдо рджреЗрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд▓рдВрдм рдЬреЛрдбрд╝реЗрдВ, рдпрджрд┐ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ред рдЬреИрд╕реЗ
func foo() (err error) {
    outf := try(os.Create())
    defer func() {
        cerr := outf.Close()
        if err == nil {
            err = cerr
        }
    }()

    ...
}
  1. "рдбрдмрд▓ рдХреНрд▓реЛрдЬ" рдкреИрдЯрд░реНрди рдЬрд╣рд╛рдВ рдХреЛрдИ рд╕рдВрд╕рд╛рдзрди рд╕рдлрд╛рдИ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП defer outf.Close() рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ try(outf.Close()) рдХрд░рддрд╛ рд╣реИред
  2. рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдлреИрдХреНрдЯрд░ рдкрде рдХреЗ рдмрдЬрд╛рдп рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рд▓реЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЙрд▓рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХреЗ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реИред рдЬреИрд╕реЗ
func foo() error {
    outf := try(os.Create())
    if err := helper(outf); err != nil {
        outf.Close()
        return err
    }
    try(outf.Close())
    return nil
}

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

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдпреЛрдЧреА рдерд╛ред

рдпрджрд┐ рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реВрдк рд╕реЗ рдирдпрд╛ try рдЬреИрд╕рд╛ рдХреБрдЫ рдЧреЛ 1.15 рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднреВрдорд┐ рд╣реИ, рддреЛ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬрд┐рд╕рдХреА go.mod рдлрд╝рд╛рдЗрд▓ go 1.12 рдкрдврд╝рддреА рд╣реИ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреА

@thepudds рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд▓реЗрдХрд┐рди рдореИрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред рддреЛ рдЖрдкрдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдореЗрд░реЗ рд╕рд┐рд░ рдкрд░ рд╣реИред

рдПрд▓реЗрдХреНрд╕

@alexbrainman

рдЬрдм рд▓реЛрдЧ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП go1.13 рдФрд░ рдкрд╣рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ?

рдпрджрд┐ try рдХреЛ рдЧреЛ 1.15 рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрддрд░рдирд╛ рдерд╛, рддреЛ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ try рдХреЗ рд╕рд╛рде рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Go 1.13 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

.\hello.go:3:16: undefined: try
note: module requires Go 1.15

(рдХрдо рд╕реЗ рдХрдо рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдХреНрд░рдордг рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ)ред

@alexbrainman рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ "рдпрд╣ рдЧреЛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддреА", рдпрд╛ "рдЧреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛", рдпрд╛ "рдореИрдВ рдпрд╣рд╛рдБ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ" рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВред рдпрд╣ рд╕рдм рд╕рд╣реА рд╣реИ, _рдореМрдЬреВрджрд╛_ рдЧреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред

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

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

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

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

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

https://github.com/golang/go/issues/32437#issuecomment -503297387 рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рдкреЗрдЯ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЧрд▓рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдмреАрдЪ, рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

        if err := gen.Execute(tmp, s); err != nil {
                return fmt.Errorf("template error: %v", err)
        }

        if err := tmp.Close(); err != nil {
                return fmt.Errorf("cannot write temp file: %v", err)
        }
        closed = true

        if err := os.Rename(tmp.Name(), *genOutput); err != nil {
                return fmt.Errorf("cannot finalize file: %v", err)
        }
        removed = true

( closed рдФрд░ removed рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдЙрдкрдпреБрдХреНрдд рд╣реЛ)

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

processing path/to/dir: template: gen:42:17: executing "gen" at <.Broken>: can't evaluate field Broken in type main.state

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП

processing path/to/dir: rename /tmp/blahDs3x42aD commands.gen.go: No such file or directory

_why_ рдХреЗ рдХреБрдЫ рд╕реБрд░рд╛рдЧ рдХреЗ рдмрд┐рдирд╛ рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрд╕ рдирд╛рдо рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреНрдпрд╛ рд╣реИ, рдЗрд░рд╛рджрд╛ рдХреНрдпрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ "рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛:" рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЬреЛрдбрд╝рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдпреЗ рдЙрджрд╛рд╣рд░рдг рдЖрдкрдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдРрдк рд╕реЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:

processing path/to/dir: open /some/path/here: No such file or directory

рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдореИрдВ рдПрдХ рдХрд╛рд░рдг рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдРрдк рдиреЗ рд╡рд╣рд╛рдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ (рдЖрдкрдХреЛ рдпрд╣ рднреА рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рдирд┐рд░реНрдорд╛рдг рдерд╛, рди рдХрд┐ рдХреЗрд╡рд▓ os.Open! рдпрд╣ ENOENT рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкрде рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред)ред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ _every_ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рддреЛ рдореБрдЭреЗ рдХреНрдпрд╛ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рдореИрдВ "рдЗрд╕реЗ рдЧрд▓рдд рдкрдХрдбрд╝ рд░рд╣рд╛ рд╣реВрдБ"? рдХреНрдпрд╛ рдореБрдЭреЗ рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЫреЛрдЯреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдзрдХреЗрд▓рдирд╛ рд╣реИ рдЬреЛ рд╕рднреА рдЕрдкрдиреА рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ?

@guybrand рдЗрди рдирдВрдмрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреБрдЫ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ tryhard рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╡реЗ рдХреНрдпреЛрдВ рд╣реИрдВред рд╢рд╛рдпрдж рдмрд╣реБрдд рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдЪрд▓ рд░рд╣реА рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ if рдХрдерди рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред

рдЬрдм рдореИрдВ рдЗрд╕ рдЯреВрд▓ рддрдХ рдкрд╣реБрдВрдЪреВрдВрдЧрд╛ рддреЛ рдореИрдВ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж, @zeebo рдЖрдкрдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдПред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ outf рдПрдХ loadCmdReader (рдкрдВрдХреНрддрд┐ 173) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд▓рд╛рдЗрди 204 рдкрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ outf рдмрдВрдж рдирд╣реАрдВ рд╣реИред (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдпрд╣ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрд╛)ред

@ tv42 рдЖрдкрдХреЗ https://github.com/golang/go/issues/32437#issuecomment -503340426 рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдк рдЗрд╕реЗ "рдЧрд▓рдд" рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ рдЕрдЧрд░ рдЙрди рд╕рднреА рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред try рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ defer рдХреЗрд╡рд▓ рдЗрд╕реЗ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ (рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреЛ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ if рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ

@griesemer рддрдм рдореИрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдФрд░ @rsc рдЕрд╕рд╣рдордд рд╣реИрдВред рдпрд╛ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ", рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

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

рдЯрд╛рд▓рдирд╛

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

func CopyFile(src, dst string) (err error) {
    defer HelperToBeNamedLater(&err, "copy %s %s", src, dst)

    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    ...
}

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

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

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

  3. _рд╕реНрд╡рдпрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░реЗрдВред_ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдлрд┐рд░ рд╕реЗ рдПрдХ рднрд╛рд╖рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдЬрддрд╛рдИ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдбреНрд░реЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреА рддрд░рд╣, рдбрд┐рдлрд░ рдПрдХ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдВрддрддрдГ рд╕реАрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред defer f.Close() рдФрд░ defer l.mu.Unlock() рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдорд╛рдирдХ рдореБрд╣рд╛рд╡рд░реЗ рдЗрддрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ рдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ рдХреЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ defer рд╕реЗ рдмрдЪрдиреЗ рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

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

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

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

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

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

func CopyFile(src, dst string) (err error) {
    defer errd.Add(&err, "copy %s %s", src, dst)

    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    ...
}

рдЕрдЧрд░ рд╣рдо CopyFile рдХреЛ рдбрд┐рдмрдЧ рдХрд░ рд░рд╣реЗ рдереЗ рдФрд░ рдХрд┐рд╕реА рднреА рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ (рдбреАрдмрдЧ рдкреНрд░рд┐рдВрдЯ рдбрд╛рд▓рдиреЗ рдХреЗ рд╕рдорд╛рди) рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рдереЗ:

func CopyFile(src, dst string) (err error) {
    defer errd.Trace(&err)
    defer errd.Add(&err, "copy %s %s", src, dst)

    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    ...
}

рдФрд░ рдЗрд╕реА рддрд░рд╣ред

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

рдХреНрдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛? рд╣рдо рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

рд▓реЛрдЧ if err != nil рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП рдЖрдЬ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдбрд┐рдлрд░ рд╣реЗрд▓реНрдкрд░реНрд╕ рдХреЛ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдЙрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдЖрдкрдиреЗ рдХреНрдпрд╛ рд╕реАрдЦрд╛ред

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

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

@griesemer defer рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ ред рдореИрдВ рдЙрд╕ emit рдпрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ handle рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рдпрджрд┐ err рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ рддреЛ emit/handle рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдЕрдВрдд рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рдХреНрд╖рдг рдореЗрдВ рдЖрд░рдВрдн рдХрд░реЗрдВрдЧреЗред рдбрд┐рдлрд░ рдХреЛ рдЕрдВрдд рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред emit/handle рдЕрдЧрд░ err рд╢реВрдиреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рддреЛ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдЯрд╛рд▓рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдХреБрдЫ рдЖрдВрдХрдбрд╝реЗ:

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

рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдХреНрд░реЗрддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, ~620k+ LOC рдореЗрдВ рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ 1600 рдирдЧреНрди рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рд╣реИрдВред рдЬрд┐рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╣рдо рдЪреБрдирддреЗ рд╣реИрдВ, рд╡реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рдорд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдзрд╛рд░реНрдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдЬрд╛рддреЗ рд╣реИрдВред

@rsc рдЕрдЧрд░, рдмрд╛рдж рдореЗрдВ, рд╣реИрдВрдбрд▓рд░ рдХреЛ try рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ func Wrap(msg string) func(error) error рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рддреНрд░реБрдЯрд┐/рддреНрд░реБрдЯрд┐ рдкреИрдХреЗрдЬ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк try(f(), errc.Wrap("f failed")) рдХрд░ рд╕рдХреЗрдВ?

@ damienfamed75 рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рддреЛ emit рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм try рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИред

рдЖрдк рдпрд╣ рднреА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ рддреЛ emit рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛, рди рдХрд┐ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕рдВрднрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдХрд╣рд╛рдБ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ? рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ try рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рд╕рд╛рде (рдЕрдиреНрдпрдерд╛ рдореИрдВ emit рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рдХреНрдпрд╛ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ $#$ try $#$ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ if рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛? emit рдпрд╛ handle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдХреНрдпреЛрдВрдХрд┐ emit рдХреНрд▓реЙрдЬ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЗ (рд╕рдВрднрд╡рддрдГ рдкрд╣рд▓реЗ) рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред (рдЙрд╕ рдиреЛрдЯ рдкрд░, рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ emit рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдпрджрд┐ рдХреЛрдИ emit рдирд╣реАрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд╛рди рдкреНрд░рд╢реНрди рдЬреЛ рдореВрд▓ check рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ handle рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрдиред)

рдХреЗрд╡рд▓ рдЕрдЧрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдХрд╛рдо рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп w/o рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ try рдФрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдФрд░ рд╡рд╣ рд╣реИрдВрдбрд▓рд░ рддрдВрддреНрд░, рдЬреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА defer рдореЗрдВ рдореМрдЬреВрдж рд╣реИред

@guybrand (рдФрд░ @griesemer) рдЖрдкрдХреЗ рджреВрд╕рд░реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рдкреИрдЯрд░реНрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рджреЗрдЦреЗрдВ https://github.com/griesemer/tryhard/issues/2

@ рдбреЗрд╡рд┐рдб

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

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

рддреЛ рдХрдо рд╕реЗ рдХрдо рдЙрдореНрдореАрдж рддреЛ рд╣реИред :)

tryhard рдЖрдЬрд╝рдорд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЙрдкрдХрд░рдг рдореЗрдВ рдХреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдмрд▓реНрдХрд┐ err != nil рдХреЗ рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП grep рднреА рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдпрд╣ рдЕрдХреЗрд▓рд╛ рдХреНрдпрд╛ рдЫреЛрдбрд╝ рдЧрдпрд╛, рдФрд░ рдХреНрдпреЛрдВред

(рдФрд░ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ https://github.com/griesemer/tryhard/ рдкрд░ рдХреБрдЫ рдореБрджреНрджреЗ рдФрд░ рдкреАрдЖрд░ рд╣реИрдВред)

@rsc рдпрд╣рд╛рдБ рдореЗрд░реА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ defer HandleFunc(&err, ...) рдкреИрдЯрд░реНрди рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдпрд╛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдпрд╣ рд╕рд┐рд░реНрдл "рдЪрддреБрд░" рд▓рдЧрддрд╛ рд╣реИред

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

func myFunction() (i int, err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("wrapping the error: %s", err)
        }
    }()

    // ...
    return 0, err

    // ...
    return someInt, nil
}

рдХрдо рд╕реЗ рдХрдо рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдерд╛ рдЬрдм рдореИрдВрдиреЗ defer рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЕрдм рдЗрд╕реЗ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ "рдЪрд╛рд▓рд╛рдХ" рдФрд░ "рд╣реИрдХреА" рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдФрд░, рдХрдо рд╕реЗ рдХрдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВ рд▓рд╛рддрд╛ рд╣реВрдВ, рдпрд╣ рдЧреЛ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ fmt.HandleErrorf рдЬреИрд╕реЗ рдХрд┐рд╕реА рдЙрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рд╕реЗ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЕрднреА рднреА рдЗрд╕рдХреЗ рдкреНрд░рддрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдБред

рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рдкрд╕рдВрдж рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдХреЛрдИ return ..., err рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ err рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореВрд▓реНрдп рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ return рд╣рдореЗрд╢рд╛ рдЧреЛ рдореЗрдВ рдПрдХ "рдкрд╡рд┐рддреНрд░" рдСрдкрд░реЗрд╢рди рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рд╕рдВрдЦреНрдпрд╛рдПрдВ рдФрд░ рдбреЗрдЯрд╛ рддреЛ рдпрд╣ рд╣реИред :)

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреА рдХрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдкрд░ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреА, рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ loccount рдФрд░ grep 'if err' рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдХреАред рдореБрдЭреЗ рдХреНрд░рдо рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗ loccount / grep 'if err' | рдбрдмреНрд▓реНрдпреВрд╕реА / рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб:

1382/64/14
108554 / 66 / 5
58401 / 22 / 5
2052/247/39
12024/1655/1

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

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

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдпрд╣ рднреА рдкрд╛рдпрд╛ рдХрд┐ if err != nil { return err } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ try() рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ, рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рдпрд╣ рдЖрдо рд╣реИред рдкреВрд░реЗ рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдбрд┐рдЬрд╝рд╛рдЗрдирд░, рдЬреЛ рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЕрдиреНрдп рдХреЛрдб рдмреЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ try() рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХ рд░рд╣реЗ рд╣реИрдВред

@beoran tryhard рдЗрд╕ рд╕рдордп рдмрд╣реБрдд рдкреНрд░рд╛рдердорд┐рдХ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдгреЛрдВ рдХреА рд╕рдордЭ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ try рджреБрд░реНрд▓рдн рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рддреЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рдХреБрдЫ рдФрд░?

@rsc , @griesemer

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рджреЛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирдореВрдиреЗ рджрд┐рдП, рдЬреЛ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдЪреВрдХ рдЧрдП, рдПрдХ рд╢рд╛рдпрдж "рдЕрдЧрд░ рдПрд░рд░: =" рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣реЗрдЧрд╛, рддреЛ рджреВрд╕рд░рд╛ рд╣рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдореЗрдВ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рджреЛ рдЖрд╡рд░реНрддреА рдкреИрдЯрд░реНрди рд╣реИрдВ (рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рд░рдЦрд╛ рд╣реИ):

if v, err := someFunction(vars...) ; err != nil {
        return fmt.Errorf("extra data to help with where did error occur and params are %s , %d , err : %v",
            strParam, intParam, err)
    } else if v2, err := passToAnotherFunc(v,vars ...);err != nil {
        extraData := DoSomethingAccordingTo(v2,err)
        return formatError(err,extraData)
    } else {

    }

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

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

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ "рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ" рдореЗрдВ рдкреНрд░рдпрд╛рд╕() рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдореИрдВ рд░рдирдиреЗрдмрд▓реНрд╕ ("рдРрдкреНрд╕") рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ libs рдХреА рдХреБрд▓/рддреНрд░реБрдЯрд┐рдпреЛрдВ/tryHard рддреБрд▓рдирд╛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ https://github.com/golang/go/issues/32437#issuecomment -503297387 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдареАрдХ рдкрд╛рдпрд╛
рдХреБрдЫ рд╕реНрддрд░ рдореЗрдВ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ, рдореИрдВ рдЗрд╕реЗ try рд╕реЗ рдирд╣реАрдВ рдмрджрд▓реВрдВрдЧрд╛, рдпрд╣ if err!=nil рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИред
рджреВрд╕рд░реЗ рд╕реНрддрд░ рдкрд░ рдореИрдВ рд╕рд┐рд░реНрдл return err рд╕рднреА рд░рд┐рдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рджрд░реНрдж рд╣реИ, рдлрд┐рд░ рдореИрдВ try рдФрд░ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдореИрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓реЙрдЧрд░ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░реЗ рд▓рд┐рдП try рдФрд░ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдЬрд╛рд╡рдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдХрд╡рд╛рд╕ рд╣реИред

@thepudds

рдпрджрд┐ try рдХреЛ рдЧреЛ 1.15 рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрддрд░рдирд╛ рдерд╛, рддреЛ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЧреЛ 1.13 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдЧреЛ 1.13 рдЕрднреА рднреА рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдФрд░, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореЗрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЧреЛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЧреЛ 1.13 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдирд╣реАрдВ рдХрд░ рдкрд╛рдКрдВрдЧрд╛ред (рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЧреЛ 1.13 рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛ рдЧреЛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)

try рдХреЗ рд╕рд╛рде рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

.\hello.go:3:16: undefined: try
note: module requires Go 1.15

(рдХрдо рд╕реЗ рдХрдо рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдХреНрд░рдордг рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ)ред

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

рдЕрдЧрд░ рдХреЛрд╢рд┐рд╢ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП grep рдХрд░реВрдВрдЧрд╛ред рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рддрдм рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ note: module requires Go 1.15 рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдорджрдж рд╣реИред module рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВ Go 1.15 ?

@griesemer

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

рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЬреЗрдирд░рд┐рдХ рдкрд░ рд╕рдордп рдмрд┐рддрд╛рдПрдВ, рдмрд▓реНрдХрд┐ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рд╣реЛрдиреЗ рд╕реЗ рдлрд╛рдпрджрд╛ рд╣реЛред

рд▓реЗрдХрд┐рди рдЕрдкрдиреА рдмрд╛рдд рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ: рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рдХреИрд╕реЗ рдорд╣рд╕реВрд╕ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреА рдЖрджрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред ...

рдореИрдВ рдЖрдкрдХреА рд╕рднреА рдмрд╛рддреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рд▓реЗрдХрд┐рди рд╣рдо if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдлреЙрд░реНрдо рдХреЛ try рдлрдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЙрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИ рдЬреЛ рд╕рд╛рджрдЧреА рдФрд░ рд░реВрдврд╝рд┐рд╡рд╛рджрд┐рддрд╛ рдкрд░ рдЧрд░реНрд╡ рдХрд░рддреА рд╣реИред рдореБрдЭреЗ рд╣рд░ рдЪреАрдЬ рдХреА рдЖрджрдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдд рдХреНрдпрд╛ рд╣реИ? рдХреЛрдб рдХреА рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП?

рдпрд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдЗрдореЗрдЬрд┐рди рдЧреЛ рдХреЗ рдкрд╛рд╕ рдХреЛрдИ defer рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдирд╣реАрдВ рдерд╛ рдФрд░ рдЕрдм рдХреЛрдИ defer рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдорд╛рдорд▓рд╛ рдмрдирд╛рддрд╛ рд╣реИред defer рднрд╛рд╖рд╛ рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреА рддрд░рд╣ рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВ рд╣реИ, рдирдИ рднрд╛рд╖рд╛ рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдХрд┐ рдкреВрд░реНрд╡- defer рдЕрдм рдФрд░ рдЬрд╛рдПрдВред рдлрд┐рд░ рднреА, рдПрдХ рджрд╢рдХ рддрдХ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рдЧреЛ-рд▓рд╛рдЗрдХ" рд▓рдЧрддрд╛ рд╣реИред

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

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

рдореИрдВрдиреЗ рдЕрдкрдиреА рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА (рдХреЛрдб рдХреА рд▓рдЧрднрдЧ 1200 рд▓рд╛рдЗрдиреЗрдВ)ред рдФрд░ рдпрд╣ https://go-review.googlesource.com/c/go/+/182717/1/src/cmd/link/internal/ld/macho_combine_dwarf.go рдкрд░ рдЖрдкрдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдореБрдЭреЗ рдореЗрд░реА рд░рд╛рдп рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ рдПрдХ рд╣рдлреНрддреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВред рдореЗрд░рд╛ рдорди рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рдЪреАрдЬ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рднреВрд▓ рдЬрд╛рдКрдВрдЧрд╛ред

... рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЬрд▓реНрджреА рд╣реИ, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдХреЗрд╡рд▓ рджреЛ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, ...

рдФрд░ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдереНрд░реЗрдб рдкрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 504 рд╕рдВрджреЗрд╢ рд╣реИрдВред рдЕрдЧрд░ рдореБрдЭреЗ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА, рддреЛ рдореБрдЭреЗ рдпрд╣ рд╕рдм рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдкреНрддрд╛рд╣ рдирд╣реАрдВ рддреЛ рджрд┐рди рд▓рдЧреЗрдВрдЧреЗред рдореИрдВ рдЖрдкрдХреА рдиреМрдХрд░реА рд╕реЗ рдИрд░реНрд╖реНрдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред

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

рдПрд▓реЗрдХреНрд╕

@griesemer рдЕрджреНрднреБрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИред рдореИрдВ рднреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

@rsc рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЙрдкрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзрд╛рдЧреЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ @beoran рджреНрд╡рд╛рд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдореБрдЭреЗ рдардВрдбрд╛ рджреЗрдВ

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

рдкрд╣рд▓реЗ рдХрдИ bad written code рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЧрд╡рд╛рд╣реА рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмреБрд░рд╛ рд╕рдкрдирд╛ рд╣реИред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди A рдкрд╕рдВрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ AA , AB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рддреЛ рдЗрд╕рдХреА рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

To my surprise, people already think the code below is cool ... рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ it's an abomination рдкреВрд░реЗ рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдХреЛ рднреА рдЖрд╣рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ред

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

рдЬрдм рддрдХ рдЖрдк AsCommit рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд▓реЗрддреЗ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВ

func AsCommit() error(){
    return try(try(try(tail()).find()).auth())
}

рдкрд╛рдЧрд▓рдкрди рдЬрд╛рд░реА рд╣реИ рдФрд░ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдореИрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ @robpike simplicity is complicated (рд╣рд╛рд╕реНрдп) рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ

@rsc рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░

// Example 1
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))

// Example 2 
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)

// Example 3 
try (
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try (
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
)

рдереЛрдбрд╝рд╛ рд╕рд╛ else $ рдХреЗ рд╕рд╛рде Example 2 рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

  • рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ
  • рдХрдо рд╕реЗ рдХрдо abomination рдореЗрдВ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ
  • try рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реИред go if $ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ try tree := r.LookupTree(treeOid) else { рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ
  • рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмрд╣реБрдд рдорд╣рдВрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкрд╛рд░рдВрдкрд░рд┐рдХ try рдФрд░ catch рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ред
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)

parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()

try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid) else { 
    // Heal the world 
   // I may return with return keyword 
   // I may not return but set some values to 0 
   // I may remember I need to log only this 
   // I may send a mail to let the cute monkeys know the server is on fire 
}

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдореИрдВ рдереЛрдбрд╝рд╛ рд╕реНрд╡рд╛рд░реНрдереА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

@ рдЬреЛрд╢реЗрд░рд┐рдпрди рдореИрдВ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрд╛рд░рдг рдХрд╛рдлреА рд╡рд┐рд╡рд┐рдз рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рднреА рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рде рд╣реА, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо if err := foo() ; err != nil { /* various handling*/ ; return err } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрджрд┐ try() рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓рд╛ рдХрджрдо tryhard рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореМрдЬреВрджрд╛ рдХреЛрдб рдмреЗрд╕ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@griesemer рдореИрдВ рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЖрдкрдХреА рд╕рднреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдиреЗ рдкреВрдЫрд╛ рдХрд┐ рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рдВ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ emit / handle рдХреНрд▓реЙрдЬ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдПрдЧрд╛ рдпрд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓реЗрдЧрд╛, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рд╡рд╣реАрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдПрдХ рдкрд╛рдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рдпрд╛ рдХреБрдЫ рд╕рд░рд▓ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╣рдо EOF рддрдХ рдкрд╣реБрдБрдЪ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЙрд╕ рдкрд░ рд╣рд┐рдЯ рдХрд░рдиреЗ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рддреНрд╡рд░рд┐рдд рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

func findDelimiter(r io.Reader) ([]byte, error) {
    emit err {
        // if this doesn't return then continue from where we left off
        // at the try function that was called last.
        if err != io.EOF {
            return nil, err
        }
    }

    bufReader := bufio.NewReader(r)

    token := try(bufReader.ReadSlice('|'))

    return token, nil
}

рдпрд╛ рдЗрд╕реЗ рдФрд░ рднреА рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func findDelimiter(r io.Reader) ([]byte, error) {
    emit err != io.EOF {
        return nil, err
    }

    bufReader := bufio.NewReader(r)

    token := try(bufReader.ReadSlice('|'))

    return token, nil
}

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

func writeStuff(filename string) (io.ReadCloser, error) {
    emit err {
        return nil, err
    }

    f := try(os.Open(filename))

    try(fmt.Fprintf(f, "stuff\n"))

    return f, nil
}

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ:

func writeStuff(filename string) (io.ReadCloser, error) {
    // when not defining a handler then try's default handler kicks in to
    // return nil valued then error as usual.

    f := try(os.Open(filename))

    try(fmt.Fprintf(f, "stuff\n"))

    return f, nil
}

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

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

@velovix , рдлрд┐рд░ рд╕реЗ https://github.com/golang/go/issues/32437#issuecomment -503314834:

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

рдЗрд╕реЗ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

@olekukonko , рдлрд┐рд░ рд╕реЗ https://github.com/golang/go/issues/32437#issuecomment -503508478:

To my surprise, people already think the code below is cool ... рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ it's an abomination рдкреВрд░реЗ рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдХреЛ рднреА рдЖрд╣рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ред

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

рдЧреНрд░реАрдкрд┐рдВрдЧ https://swtch.com/try.html , рд╡рд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рддреАрди рдмрд╛рд░ рд╣реБрдИ рд╣реИред
@goodwine рдиреЗ рдЗрд╕реЗ рдЦрд░рд╛рдм рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдпрд╛, рдореИрдВ рд╕рд╣рдордд рд╣реЛ рдЧрдпрд╛, рдФрд░ @velovix рдиреЗ рдХрд╣рд╛ "рдЗрд╕рдХреА рдХреБрд░реВрдкрддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж ... рдЖрдк рдЕрдХреНрд╕рд░ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ ... рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрднреА рднреА рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХреЗ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдбрд╛рдпрд╡рд░реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдЬреЛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред"

рдХрд┐рд╕реА рдиреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рдпрд╣ "рдЕрдЪреНрдЫрд╛" рдерд╛ рдпрд╛ рдорд╣рд╛рди рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдФрд░ рдерд╛ред рджреЛрдмрд╛рд░рд╛, рдЦрд░рд╛рдм рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рд╣реИ ред

рдореИрдВ рднреА рдмрд╕ рдлрд┐рд░ рд╕реЗ рдХрд╣реВрдВрдЧрд╛

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

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

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

@thepudds рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдореЗрдВ go.mod рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 'go 1.15' рд▓рд╛рдЗрди рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рд░реБрджреНрдз рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рдж рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рдЧреЛ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдЕрдиреБрдкрдпреЛрдЧреА рд╕рдВрджреЗрд╢ рдЧреЛ рдХрд╛ рдмрд╣реБрдд рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡реЗрдм рдЦреЛрдЬреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рд╕рдВрджреЗрд╢ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рдпрд╛рд╕ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЕрдЪреНрдЫрд╛; рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╡реЗрдм рдЦреЛрдЬреЗрдВ рд╡реИрд╕реЗ рднреА рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡реА рд▓рдЧрддреА рд╣реИрдВред

@guybrand , рдлрд┐рд░ рд╕реЗ https://github.com/golang/go/issues/32437#issuecomment -503287670 рдФрд░ рдЖрдкрдХреА рдореБрд▓рд╛рдХрд╛рдд рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджреЗрд░ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ рдХреЗ рд╕рд╛рде:

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

func f() (int, *MyError)
func g() (int, error) { x, err := f(); return x, err }

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

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

func g() (int, error) {
    return try(f()), nil
}

рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдЖрдк рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ

func g() (int, error) {
    return f()
}

рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

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

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

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

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

рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рд▓рдВрдмрд┐рдд рдкреЛрд╕реНрдЯ рдЬрдорд╛ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ рд▓рдЧрднрдЧ 1p PDT/4p EDT (рдЕрдм рд╕реЗ рд▓рдЧрднрдЧ 3 рдШрдВрдЯреЗ рдореЗрдВ) рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо 1 рдЬреБрд▓рд╛рдИ рдХреЛ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВрдЧреЗред

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

рд╡рд╣ рд╡рд┐рдХреА рдкреГрд╖реНрда рдЬрд╛рдВрдЪ/рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рдкреЗрдЬ рд╢реБрд░реВ рдХрд░реЗрдВред

рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдХреА рдореЗрдВ рдмрд╛рдЧрд╡рд╛рдиреА рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@networkimprov , рдмрд╛рдЧрд╡рд╛рдиреА рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback рдореЗрдВ рдПрдХ рдирдпрд╛ рд╢реАрд░реНрд╖ рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдирдП рдкреЗрдЬ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рд▓реЙрдХ рдХреЗ рд▓рд┐рдП рд░реЙрдмрд░реНрдЯ рдХреЗ 1p PDT / 4p EDT рдиреЛрдЯ рдХреЛ рднреА рдпрд╛рдж рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрд▓реНрджреА рд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ред рдпрд╣ рдлрд┐рд░ рд╕реЗ рдЦреБрд▓рд╛ рд╣реИ, рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдПред

рдореИрдВ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рдерд╛, рдФрд░ рд▓реЙрдХ рдбрд╛рдЙрди рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╕ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

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

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

рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдб рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рди рдХреЛ рдереВрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдЬрд╛рдиреЗ/рдПрдиреЛрдЯреЗрдЯрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдареАрдХ рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗред

рджреЗрдЦреЛ:
https://github.com/ugorji/go-ndb/blob/master/ndb/ndb.go#L331
https://github.com/ugorji/go-serverapp/blob/master/app/baseapp.go#L129
https://github.com/ugorji/go-serverapp/blob/master/app/webrouter.go#L180

рдЬреЛ рд╕рднреА errorutil.OnError(*error) рдХрд╣рддреЗ рд╣реИрдВ

https://github.com/ugorji/go-common/blob/master/errorutil/errors.go#L193

рдпрд╣ рд╕реНрдердЧрд┐рдд рд╕рд╣рд╛рдпрдХреЛрдВ рдХреА рддрд░реНрдЬ рдкрд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ Russ/Robert рдиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ред

рдпрд╣ рдПрдХ рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВред рдпрд╣ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ IMHO рдЬреИрд╕рд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдЙрддреНрдХреГрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдкрд░ рд╡рд┐рд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдЬреЛ рдХреБрдЫ рднреА рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдЬрд╛рджреВ рд╣реИред

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

рдпрд╣рд╛рдВ 2 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЛрдб рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ:

  • рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдмрд▓ рд▓реЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
  • рдкреНрд░рдкрддреНрд░ func(рддреНрд░реБрдЯрд┐) рддреНрд░реБрдЯрд┐ рдХрд╛ рд╣реИрдВрдбрд▓рд░ рд▓реЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ extend

рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдПрдХ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдВ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рджрд┐рд╢рд╛ рд▓реЗрдиреА рд╣реИред рдирддреАрдЬрддрди, рдкрд╣рд▓реА рджрд┐рд╢рд╛ "рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп {рд╡рд╛рдкрд╕реА рдЧрд▓рддреА}" рд╕реНрдЯрдЯрд░ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдШреГрдгрд╛ рдХреА рд╣реИ рд▓реЗрдХрд┐рди рдЬрд╛рдиреЗ рдореЗрдВ рд╡реНрдпрд╡рд╕рд╛рдп рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рд╣реИред

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

var u User = db.loadUser(try(strconv.Atoi(stringId)))

рд╡рд┐рд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ:

var id int // i have to define this on its own if err is already defined in an enclosing block
id, err = strconv.Atoi(stringId)
if err != nil {
  return
}
var u User = db.loadUser(id)

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

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

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

рдЖрдЗрдП рдЧреЛ рдХреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ - рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧреЛ рдХреА рдУрд░реНрдереЛрдЧреЛрдирд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ (рд╕реНрдердЧрд┐рдд, рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ) рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореБрдЦреНрдп рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ
рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ рдпрд╛рдиреА рдЕрдЧрд░ рдЧрд▓рддреА рдХреЛ рдХрдо рдХрд░рдирд╛/рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛! = рд╢реВрдиреНрдп {рд╡рд╛рдкрд╕реА рдЧрд▓рддреА} рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯред рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореБрджреНрджрд╛ рд╣реИред рдЧреЛ рдЯреАрдо рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореБрджреНрджрд╛ рд╣реИред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреА рддреЗрдЬ рдЖрд╡рд╛рдЬ рдЧреЛ рдЯреАрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдмрд┐рдЧрд╛рдбрд╝ рд░рд╣реА рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╢реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирд┐рд╣рд┐рдд рдЧреЛрдЯреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдпред

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

рдЖрдкрдХреЗ рдиреЛрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, @ugorjiред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╢реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирд┐рд╣рд┐рдд рдЧреЛрдЯреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдпред

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

рд╣рд╛рдБ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реАред #26058 рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'рдХреЛрд╢рд┐рд╢-рдЧреЛрдЯреЛ' рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрдо рд╕реЗ рдХрдо рддреАрди рд╣рдорд▓реЗ рд╣реИрдВ:
(1) рдЖрдкрдХреЛ рдЕрд╕рдВрдмрджреНрдз рдЪрд░реЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ рд╣реИ,
(2) рдЖрдк рд╕реНрдЯреИрдХ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛, рдЬрд┐рд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЖрдк рдЕрднреА рднреА рд░рд┐рдЯрд░реНрди + рдбрд┐рдлрд░ рдХреЗрд╕ рдореЗрдВ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░
(3) рд╣рд░ рдХреЛрдИ рдЧреЛрдЯреЛ рд╕реЗ рдирдлрд░рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдВ, try рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ try рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛ред
рдкреИрдЪ - https://github.com/ascheglov/go/pull/1
рд░реЗрдбрд┐рдЯ рдкрд░ рд╡рд┐рд╖рдп - https://www.reddit.com/r/golang/comments/6vt3el/the_try_keyword_proofofconcept/

@griesemer

https://github.com/golang/go/issues/32825#issuecomment -507120860 рд╕реЗ рдЬрд╛рд░реА ...

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

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

рдореИрдиреБрдЕрд▓ рдбрд╛рдпрд░реЗрдХреНрдЯ, рдФрд░ рдСрдЯреЛрдореИрдЯрд┐рдХ рдбрд╛рдпрд░реЗрдХреНрдЯ рдореЛрдб рд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдЧрддреЗ рд╣реИрдВ:

wrap := func(err error) error {
  return fmt.Errorf("failed to process %s: %v", filename, err)
}

f, err := os.Open(filename)
if err != nil {
    return nil, wrap(err)
}
defer f.Close()

info, err := f.Stat()
if err != nil {
    return nil, wrap(err)
}
// in errors, named better, and optimized
WrapfFunc := func(format string, args ...interface{}) func(error) error {
  return func(err error) error {
    if err == nil {
      return nil
    }
    s := fmt.Sprintf(format, args...)
    return errors.Errorf(s+": %w", err)
  }
}

```рдЬрд╛рдУ
рд▓рдкреЗрдЯреЛ: = рддреНрд░реБрдЯрд┐рдпрд╛рдБред WrapfFunc ("% s рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓", рдлрд╝рд╛рдЗрд▓ рдирд╛рдо)

рдПрдл, рдЧрд▓рддреА: = рдУрдПрд╕ рдУрдкрди (рдлрд╝рд╛рдЗрд▓ рдирд╛рдо)
рдХреЛрд╢рд┐рд╢ рдХрд░реЛ (рд▓рдкреЗрдЯреЛ (рдЧрд▓рддреА))
рд╕реНрдердЧрд┐рдд рдПрдлред рдмрдВрдж рдХрд░реЗрдВ ()

рдЬрд╛рдирдХрд╛рд░реА, рддреНрд░реБрдЯрд┐: = f.Stat ()
рдХреЛрд╢рд┐рд╢ рдХрд░реЛ (рд▓рдкреЗрдЯреЛ (рдЧрд▓рддреА))

Manual Pass-through, and Automatic Pass-through modes are also simple enough to be agreeable (despite often being a code smell):
```go
f, err := os.Open(filename)
if err != nil {
    return nil, err
}
defer f.Close()

info, err := f.Stat()
if err != nil {
    return nil, err
}
f := try(os.Open(filename))
defer f.Close()

info := try(f.Stat())

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реВрдХреНрд╖реНрдо рдЧрд▓рддрд┐рдпреЛрдВ рдХреА рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдХрд╛рд░рдг рдореИрдиреНрдпреБрдЕрд▓ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдореЛрдб рджреЛрдиреЛрдВ рдХрд╛рдлреА рдЕрд╕рд╣рдиреАрдп рд╣реИрдВ:

defer errd.Wrap(&err, "failed to do X for %s", filename)

var f *os.File
f, err = os.Open(filename)
if err != nil {
    return
}
defer f.Close()

var info os.FileInfo
info, err = f.Stat()
if err != nil {
    return
}
defer errd.Wrap(&err, "failed to do X for %s", filename)

f := try(os.Open(filename))
defer f.Close()

info := try(f.Stat())

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

рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рд╢рд╛рдкрд┐рдд рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

info := try(try(os.Open(filename)).Stat())

рдлрд╝рд╛рдЗрд▓ рд░рд┐рд╕рд╛рд╡ред

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ try рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдФрд░ рдпрд╣ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдЧрддрддрд╛ рдореБрджреНрджреЗ рд╣реИрдВред

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

рдЖрдЗрдП рдЗрд╕рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ - рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рднреА рдХрдИ рдмрд╛рд░ рд╕реБрдирд╛ рд╣реИ

"рдпрд╣ рдмрд╣реБрдд рдЙрдмрд╛рдК рд╣реИ, рдЪрд▓реЛ рдЗрд╕рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ"

рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдПрдирд╛рд▓реЙрдЧ рд╣реИ:

- рдЖрдкрдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рддрдереНрдпреЛрдВ рдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИ!
- рддрдереНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрджрддрд░!

рд╣реЗрдЧреЗрд▓ рджреНрд╡рд╛рд░рд╛

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдФрд░ рдЙрд╕ рдкрд░ рдмрджрд╕реВрд░рдд рддрд░реАрдХрд╛ред

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

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

рдЪреВрдБрдХрд┐ рдпрд╣рд╛рдБ рдмрд╣рд╕ рдмреЗрд░реЛрдХрдЯреЛрдХ рдЬрд╛рд░реА рд╣реИ, рдореИрдВ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдБ:

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

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

рдзрдиреНрдпрд╡рд╛рджред

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

рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, "рдЗрд╕реЗ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрдВ" рдзрд╛рдЧрд╛ 1322 рд╡реЛрдЯ рдКрдкрд░ рдФрд░ 158 рдиреАрдЪреЗ рд╣реИред рдпрд╣ рдзрд╛рдЧрд╛ 158 рдКрдкрд░ рдФрд░ 255 рдиреАрдЪреЗ рд╣реИред рдЕрдЧрд░ рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкрд░ рдЗрд╕ рдзрд╛рдЧреЗ рдХрд╛ рд╕реАрдзрд╛ рдЕрдВрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдХрдо рд╕реЗ рдХрдо, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╡рд┐рдлрд▓ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

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

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

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

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

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

рд▓реЛрдЧ рдЪреБрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рднреА рдЧреЛ 2 рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдФрд░ рдмрд╛рдХреА рдЧреЛ 2 рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реВрдВред рдЧреЛ 1 рдПрдХ рдорд╣рд╛рди рднрд╛рд╖рд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЧреЛ 2 рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛ред

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

рдкреБрдирд╢реНрдЪ: рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЬрдм рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрдЧрд╛ рддреЛ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рд╡рд┐рд░реЛрдз рд╣реЛрдЧрд╛ред

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

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

var file= try(parse())

func parse()(err, result) {
}

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

func Foo() (err error) {
    var file, ferr = os.Open("file1.txt")
    if ferr == nil {
               defer file.Close()
        var parsed, perr = parseFile(file)
        if perr != nil {
            return
        }
        fmt.Printf("%s", parsed)
    }
    return nil
}

рдХреЛрд╢рд┐рд╢ () рдХреЗ рд╕рд╛рде, рдХреЛрдб рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп, рд╕реБрд╕рдВрдЧрдд рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ:

func Foo() (err error) {
    var file = try(os.Open("file.txt"))
        defer file.Close()
    var parsed = try(parseFile(file))
    fmt.Printf(parsed)
    return
}

рдореИрдВрдиреЗ рд╣реЗрд░реЛрдХреВ рдХреЗ рд╕рднреА рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рдЧреЛ рднрдВрдбрд╛рд░реЛрдВ (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА) рдкрд░ @lpar рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдкреНрд░рдпреЛрдЧ рдХрд┐рдПред

рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рд╕рд╛рд░ рдореЗрдВ рд╣реИрдВ: https://gist.github.com/freeformz/55abbe5da61a28ab94dbb662bfc7f763

cc @davecheney

@ubikenobi рдЖрдкрдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдп ~ рд╣реИ ~ рд▓реАрдХ рд╣реЛ рд░рд╣рд╛ рдерд╛ред

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

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

@ рдбреЗрд╡рд┐рдб

рд░рд┐рд╕рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ defer.Close() рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдпрд╛ред (рдЕрдм рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред

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

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

  • рдореИрдВ рдПрдХ рдмрдбрд╝реЗ рдЧреЛ рдПрдкреАрдЖрдИ рдХреЗ рдЦрд┐рд▓рд╛рдл tryhard рднрд╛рдЧрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдЪрд╛рд░ рдЕрдиреНрдп рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреА рдПрдХ рдЯреАрдо рдХреЗ рд╕рд╛рде рдкреВрд░реНрдгрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реВрдВред рдЧреЛ рдХреЛрдб рдХреА 45580 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ, tryhard рдиреЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП 301 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА (рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдПрдХ +301/-903 рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛), рдпрд╛ рдХреЛрдб рдХреЗ рд▓рдЧрднрдЧ 2% рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд▓рдЧрднрдЧ 3 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕, рдЖрдпрд╛рдд рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдЬреЛ рдореБрдЭреЗ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧрддрд╛ рд╣реИред
  • рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдХреЗ рд▓рд╛рдЗрди рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ try рдореЗрд░реЗ рдХрд╛рдо рдХреЛ рдХреИрд╕реЗ рдмрджрд▓реЗрдЧрд╛, рдФрд░ рд╡рд┐рд╖рдпрдЧрдд рд░реВрдк рд╕реЗ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрд╣рддрд╛ рд╣реИ! рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдпрд╛рд╕ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХреЙрдореНрдкреИрдХреНрдЯ рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ if err != nil рд▓рд┐рдЦрдиреЗ рдХреА рдмрд╣реБрдд рдЖрджрдд рд╣реИ, рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрджрд▓рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред рддреНрд░реБрдЯрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдЦрд╛рд▓реА рдЪрд░ рдХреЛ рд▓рд┐рдЦрдирд╛ рдФрд░ рдкреБрди: рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛ (рдЕрд░реНрдерд╛рдд рдЦрд╛рд▓реА рдЯреБрдХрдбрд╝рд╛/рдорд╛рдирдЪрд┐рддреНрд░/рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдЪрд░ рдмрдирд╛рдирд╛) рд╕рдВрднрд╡рддрдГ err рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред
  • рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рднреА рдзрд╛рдЧреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рд░реИрдкрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ try рднрд┐рдиреНрди рдерд╛ рдпрджрд┐ рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ try(json.Unmarshal(b, &accountBalance), "failed to decode bank account info for user %s", user) ред рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдмрд┐рдВрджреБ рд╢рд╛рдпрдж рд╡рд┐рд╖рдп рд╕реЗ рджреВрд░ рд╣реИ; рдЧреИрд░-рдХреЛрд╢рд┐рд╢ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ред
  • рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдФрд░ рджреЗрдЦрднрд╛рд▓ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ! рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬ рддрдХ рдХрд╛ Go 2 рдкреНрд░рдпрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣рдЬ рд░рд╣рд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

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

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

@kingishb рдЧреИрд░-рдореБрдЦреНрдп рдкреИрдХреЗрдЬреЛрдВ рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрд┐рддрдиреЗ _try_ рд╕реНрдкреЙрдЯ рдкрд╛рдП рдЧрдП рд╣реИрдВ? рдЖрдо рддреМрд░ рдкрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреИрдХреЗрдЬ-рдореВрд▓ (рдпрд╛рдиреА рд▓рд┐рдкрдЯреЗ рдпрд╛ рд╕рдЬрд╛рдП рдЧрдП) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ....

@networkimprov рдпрд╣ рдореЗрд░реА рд╕рдВрд╡реЗрджрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд▓реАрдХреГрдд рд╕реВрддреНрд░ рд╣реИред рдЬрд╣рд╛рдВ рдпрд╣ рд╕рд╣реА рд╣реИ рд╡рд╣ рдПрдкреАрдЖрдИ рд╕рддрд╣реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИред рд╕рдВрджрд░реНрдн рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рди рдХрд┐ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ред

рдХрдИ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╡рд░реНрддрдорд╛рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрдЭрд╛рдИ рдЧрдИ рдкреНрд░рдерд╛рдУрдВ (https://blog.golang.org/errors-are-values) рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЪреВрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? try рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдРрд╕реА рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ рдФрд░, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, рд╡реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рд▓рдХреНрд╖реНрдп рд╣реИрдВ (рд╢рд╛рдпрдж рдПрдХрдорд╛рддреНрд░ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ)ред рддреЛ, рдлрд┐рд░ рд╕реЗ, рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рдкрд░рд┐рд╢реНрд░рдо рдХреЗ рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ рд╕реНрд░реЛрдд рдХреЛ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдХрд░рдирд╛ рд╡реНрдпрд░реНрде рд▓рдЧрддрд╛ рд╣реИред

рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @ubikenobi , @freeformz , рдФрд░ @kingishb рдзрдиреНрдпрд╡рд╛рдж, рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА! рдПрдХ рддрд░рдл, рдпрджрд┐ рдЖрдк tryhard рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде -err="" рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдЪрд░ рдХреЛ err рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ e )ред рдпрд╣ рдХреЛрдб рдЖрдзрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдФрд░ рдорд╛рдорд▓реЗ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рднреА рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ)ред

@griesemer рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдмрд┐рдВрджреБрдУрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реА рджреЛ рдорд╛рдЗрдХреНрд░реЛ-рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз tryhard рдЪрд▓рд╛рдпрд╛ рд╣реИ:

рдХреНрд▓реЙрдХ рд╡реА 1.82 / рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб
13280 рдЧреЛ рдХреЛрдб рд▓рд╛рдЗрдиреНрд╕ / 148 рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдиреЗ рдЧрдП (1%)

рдПрдХ рдФрд░ рд╕реЗрд╡рд╛:
9768 рдЧреЛ рдХреЛрдб рд▓рд╛рдЗрдиреНрд╕ / 50 рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдиреЗ рдЧрдП (0.5%)

рдЗрд╕рдХреЗ рдмрд╛рдж tryhard рдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реВрдХреНрд╖реНрдо рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╡реНрдпрд╛рдкрдХ рд╕реЗрдЯ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛:

314343 рдЧреЛ рдХреЛрдб рд▓рд╛рдЗрдиреНрд╕ / 1563 рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдиреЗ рдЧрдП (0.5%)

рддреНрд╡рд░рд┐рдд рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкреИрдХреЗрдЬ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЬреЛ try рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдПрдбреЗрдкреНрдЯрд░/рд╕рд░реНрд╡рд┐рд╕ рд░реИрдкрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ (рдЬреАрдЖрд░рдкреАрд╕реА) рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╕реЗрд╡рд╛ рд╕реЗ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

  • err var defer рдХреЗ рд▓рд┐рдП рдХрдм рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ? "рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЗ рдмреЗрд╣рддрд░ рд╕реНрдкрд╖реНрдЯ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
  • рд╣рдо рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рдЖрдкрдХреЛ рддреБрд░рдВрдд рдПрдХ рдареАрдХ рд╡рд╣реА рдЬрдЧрд╣ рдвреВрдВрдврдиреА рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдорд┐рд▓ рдЧрдИ рд╣реЛред рдХреНрдпрд╛ рдФрд░ рдХрд╣рд╛рдВ рдЧрд▓рдд рд╣реБрдЖ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред defer рдмрд╣реБрдд рдмрджрд╕реВрд░рдд рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рдХреЛрдб рдмрдирд╛рдПрдЧрд╛ред
  • @davecheney рдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдорд╣рд╛рди рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрд╛ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣рд░ рдЪреАрдЬ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИред
  • рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рдЖрдк os.Exit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреАред

рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдПрдХ рдкреИрдХреЗрдЬ (рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреЗ рд╕рд╛рде) рдкрд░ tryhard рдЪрд▓рд╛рдпрд╛ рдФрд░ рдЗрд╕рдиреЗ 2478 рдХреА рд╕реВрдЪрдирд╛ рджреА, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рд╕рдВрдЦреНрдпрд╛ 873934 рд╕реЗ 851178 рд╣реЛ рдЧрдИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реЗ рдХрд┐рддрдирд╛ рдУрд╡рд░-рд░реИрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реИ (stdlib рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ-рдЯреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдХрдореА рд╣реИ) рдпрд╛ рдЙрд╕ рдХреЛрдб рдХрд╛ рдХрд┐рддрдирд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдореИрдВрдиреЗ рдХреЙрдкреА-рдкрд╛рд╕реНрддрд╛ рдЬреИрд╕реЗ if err != nil { return nil } рдФрд░ error: cannot process ....file: cannot parse ...file: cannot open ...file рдЬреИрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╢рд░реНрдордирд╛рдХ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ред

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

рдореИрдВ рдЕрдкреАрд▓-рдЯреВ-рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рднреА рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдирд╣реАрдВ рд▓реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╡рд╣реА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдирдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЙрдирдХреА рдЕрдкрдиреА рдЕрдЬреНрдЮрд╛рдирддрд╛ рдФрд░/рдпрд╛ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
\

рд╣рдордиреЗ tryhard -err="" рдЕрдкрдиреА рд╕рдмрд╕реЗ рдмрдбрд╝реА (рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕рд╣рд┐рдд рдХреЛрдб рдХреА ┬▒163k рд▓рд╛рдЗрди) рд╕реЗрд╡рд╛ рдкрд░ рдЪрд▓рд╛рдпрд╛ - рдЗрд╕рдореЗрдВ 566 рдШрдЯрдирд╛рдПрдВ рдорд┐рд▓реА рд╣реИрдВред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдХреЛрдб if err != nil рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд░реЛрдм рдкрд╛рдЗрдХ рдХреА "рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореВрд▓реНрдп рд╣реИрдВ" рд▓реЗрдЦ рджреЛрд╣рд░рд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ)ред

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

@griesemer рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдорд┐рд▓рд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛:

a) рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЙрд▓ рд╕рд╛рдЗрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
рдмреА) рд╕рд┐рдВрдЧрд▓-рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ if err != nil [&& ...] рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ ( on err #32611 рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░)
рдЧ) рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ ( defer #32676 рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░)
d) err рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ ( try() рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░)
рдИ) рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛ рдЧреИрд░-рдореБрдЦреНрдп рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╣реИрдВ (рд╕рдВрднрд╛рд╡рд┐рдд рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ)

рдХреБрд▓ рдПрд▓рдУрд╕реА рдХреА рддреБрд▓рдирд╛ return err рд╕реЙрд░реНрдЯрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдХрд░рдиреЗ рдкрд░ рд╕рдВрджрд░реНрдн рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ, рдЖрдИрдПрдордУред

@networkimprov рд╕рд╣рдордд - рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕реБрдЭрд╛рд╡ рдкрд╣рд▓реЗ рднреА рд▓рд╛рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рджрд┐рдиреЛрдВ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рд╣рдорд╛рд░реЗ рдЖрдВрддрд░рд┐рдХ рдХреЛрдбрдмреЗрд╕ рдкрд░ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ (рдХреЗрд╡рд▓ рд╣рдорд╛рд░рд╛ рдХреЛрдб, рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ):

рдкрд╣рд▓реЗ:

  • 882 .go рдлрд╝рд╛рдЗрд▓реЗрдВ
  • 352434 рд╕реНрдерд╛рди
  • 329909 рдЧреИрд░-рд░рд┐рдХреНрдд рд╕реНрдерд╛рди

рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдХреЗ рдмрд╛рдж:

  • 2701 рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди (рдФрд╕рдд 3.1 рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди / рдлрд╝рд╛рдЗрд▓)
  • 345364 рд▓реЛрдХреЗрд╢рди (-2.0%)
  • 322838 рдЧреИрд░-рд░рд┐рдХреНрдд рд╕реНрдерд╛рди (-2.1%)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЕрдм рдЬрдм @griesemer рдиреЗ рд╕рд╛рд░рд╛рдВрд╢ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдБ рдХреБрдЫ рдФрд░ рд╣реИрдВ:

  • if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ 39.2% if <err> != nil рд╣реИ
  • рдЗрдирдореЗрдВ рд╕реЗ 69.6% try рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВ

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

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

func (req *Request) Decode(r Reader) error {
    typ, err := readByte(r)
    if err != nil {
        return err
    }
    req.Type = typ
    req.Body, err = readString(r)
    if err != nil {
        return unexpected(err)
    }

    req.ID, err = readID(r)
    if err != nil {
        return unexpected(err)
    }
    n, err := binary.ReadUvarint(r)
    if err != nil {
        return unexpected(err)
    }
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i], err = readID(r)
        if err != nil {
            return unexpected(err)
        }
    }
    return nil
}

// unexpected turns any io.EOF into an io.ErrUnexpectedEOF.
func unexpected(err error) error {
    if err == io.EOF {
        return io.ErrUnexpectedEOF
    }
    return err
}

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

func (req *Request) Decode(r Reader) (err error) {
    defer func() { err = unexpected(err) }()

    req.Type = try(readByte(r))
    req.Body = try(readString(r))
    req.ID = try(readID(r))

    n := try(binary.ReadUvarint(r))
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i] = try(readID(r))
    }
    return nil
}

@cespare рд╢рд╛рдирджрд╛рд░ рд░рд┐рдкреЛрд░реНрдЯ!

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдирд┐рдкреЗрдЯ рдЖрдо рддреМрд░ рдкрд░ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрд╖реНрдардХ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИрдВ, рдФрд░ рд▓реВрдк рдХреЗ рднреАрддрд░ try рдЙрддрдирд╛ рд╣реА рдЦрд░рд╛рдм рд╣реИ рдЬрд┐рддрдирд╛ рдореИрдВрдиреЗ рдЙрдореНрдореАрдж рдХреА рдереАред

рдПрдХ рдХреАрд╡рд░реНрдб рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ рдФрд░ рдпрд╣ рдереЛрдбрд╝рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХрдИ рдЕрдиреНрдп рднрд┐рдиреНрди рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдардиреАрдп рд╣реИ рдФрд░ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрднреА рднреА рд▓рдВрдмреЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░/рдпрд╛ рдмрд╣реБрдд рдШреЛрдВрд╕рд▓реЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ):

func (req *Request) Decode(r Reader) (err error) {
    defer func() { err = wrapEOF(err) }()

    req.Type = try readByte(r)
    req.Body = try readString(r)
    req.ID = try readID(r)

    n := try binary.ReadUvarint(r)
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i], err = readID(r)
        try err
    }
    return nil
}

*рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╖реНрдкрдХреНрд╖ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╕реНрддреЗ рд▓рд┐рдкрд╕реНрдЯрд┐рдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдХреЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИ?

рдпрджрд┐ рдЖрдк unexpected() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдФрд░ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

try рдмреЗрд╣рддрд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЦрд░рд╛рдм рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@cespare рдПрдХ рдбрд┐рдХреЛрдбрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ err == nil рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдмреВрд▓рд┐рдпрди рдареАрдХ рд▓реМрдЯрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рдеред

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

@makhov "рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдХреЛрдб" рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХреЛрдб рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЖрдк рдРрд╕рд╛ рдХреЛрдб рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

a, b, c, err := someFn()
if err != nil {
  return ..., errors.Wrap(err, ...)
}

рдФрд░ рдЗрд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рд╕рдорд╛рди [1] рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджреЗрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

a, b, c, err := someFn()
try(errors.Wrap(err, ...))

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

(рдЖрдкрдХреА рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгреА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдпрд╛ рдЫрджреНрдо рдХреЛрдб рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреЗ рдореВрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд)

рдореИрдВрдиреЗ 54K LOC рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдкрд░ tryhard рдЪрд▓рд╛рдпрд╛, 1116 рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рдЧрдПред
рдореИрдВрдиреЗ рдЕрдВрддрд░ рджреЗрдЦрд╛, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрддрдирд╛ рдХрдо рдирд┐рд░реНрдорд╛рдг рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рд╕реЗ рдмрд╣реБрдд рд▓рд╛рдн рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд▓рдЧрднрдЧ if err != nil рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдореЗрд░рд╛ рдкреВрд░рд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд┐рдВрдЧрд▓-рд▓реЗрд╡рд▓ рдмреНрд▓реЙрдХ рд╣реИ рдЬреЛ рд╕рд┐рд░реНрдл рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ try рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ try рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рджреЗрддрд╛ рд╣реИ:

  • рдХрдо рдЯрд╛рдЗрдкрд┐рдВрдЧ (рдкреНрд░рддрд┐ рдШрдЯрдирд╛ рдореЗрдВ ~30 рд╡рд░реНрдгреЛрдВ рдХреА рднрд╛рд░реА рдХрдореА, рдЬрд┐рд╕реЗ рдиреАрдЪреЗ "**" рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)
-       **if err := **json.NewEncoder(&buf).Encode(in)**; err != nil {**
-               **return err**
-       **}**
+       try(json.NewEncoder(&buf).Encode(in))

рдЬрдмрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ:

  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛
  • рдирд┐рд╖реНрдкрд╛рджрди рдкрде рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рд▓рд╛рдкрддрд╛ рджреГрд╢реНрдп рдХреНрдпреВ

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдореИрдВ try рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдХреЛрдб рдкрд░ рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ $.02

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

рдмрд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░...

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

рдЖрдЗрдП рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ try рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ рдореБрд╣рд╛рд╡рд░рд╛ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛
рд╡рд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛? рдорд╛рдирддреЗ рд╣реБрдП:

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

рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рдХреЛрд╢рд┐рд╢ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред

рдПрдо рдЯреЗрд░, 2 рдбреЗ рдЬреБрд▓рд╛рдИ рдбреЗ 2019 18:06, рдЬреИрд╕рд╛ рдХрд┐ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com escreveu:

@cespare https://github.com/cespare рдПрдХ рдбрд┐рдХреЛрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░, рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде == nil рдкрд╣рд▓реЗ
рд╣рд░ рдСрдкрд░реЗрд╢рди рдФрд░ рдПрдХ рдмреВрд▓рд┐рдпрди рдУрдХреЗ рд▓реМрдЯрд╛рдирд╛ред

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

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=AAT5WM3YDDRZXVXOLDQXKH3P5O7L5A5A5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFWSG43VMVBX#HZ78PGODMVXH
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAT5WMYXLLO74CIM6H4Y2RLP5O7L5ANCNFSM4HTGCZ7Q
.

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рднрд╛рдЬрди рдХрд╣рд╛рдВ рд╣реБрдЖ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреБрдЫ рддрдВрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП Xerror/Is рдареАрдХ рд░рд╣реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдПрдХ ErrNotExists рд╣реИ рддреЛ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдУрдкрди рдкрд░ рд╣реБрдЖ рдерд╛), рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП - рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕рд╣рд┐рдд - рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡рддрдГ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╛рди рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╕рдВрднрд╡рддрдГ, рдЗрд╕реЗ рд╕рд╕реНрддрд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрд╢рд┐рд╢ () рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рдбрд┐рдмрдЧред рдХреЛрд╢рд┐рд╢ () рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдбрд┐рдмрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ? рдЗрд╕ рддрд░рд╣ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ() рдкреБрд░рд╛рдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрддрдирд╛ рд╣реА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдПред

рд╡рд┐рдХрд▓реНрдк рдХреЛрд╢рд┐рд╢ () рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдФрд░ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рд╕рд╛рде рдпрд╣ рд╣реБрдЖ рдХрд┐ рд╕рдВрдХрд▓рдХ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдпрд╛рд╕() рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЖрд╕реНрдердЧрд┐рдд рдХрдерди "рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐" рдХреЗ рд╕рдорд╛рди рдЗрд╕ рд╕рдВрджрд░реНрдн-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ

@lestrrat рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЕрдкрдиреА рд░рд╛рдп рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИ рдХрд┐ "рдХреЛрд╢рд┐рд╢" рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреИрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддреА рд╣реИ, рддреЛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдХрдерди рдореЗрдВ рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдЯреЛрдХрди рд▓рд┐рдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдПрдХ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ 200 рд╢рд░реНрддреЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

if try(foo()) == 1 && try(bar()) == 2 {
  // err
}
n1, err := foo()
if err != nil {
  // err
}
n2, err := bar()
if err != nil {
  // err
}
if n1 == 1 && n2 == 2 {
  // err
}

@mattn рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╛рдд рд╣реИ, _theoretically_ рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдо рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ try рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдЕрднреА рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо _I_ рдХреЛ рдРрд╕реЗ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рд▓рдЧрднрдЧ рдХреЛрдИ рдШрдЯрдирд╛ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ рдЬреЛ _my code_ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗред

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореИрдВ рджреБрдирд┐рдпрд╛ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдкреАрдУрд╕реА рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдЭрдВрдХрд╛рд░ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ, рдХрд┐ рд╣рдордореЗрдВ рд╕реЗ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try рдХреА рд╢реБрд░реВрдЖрдд рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЕрднреА рднреА рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЖрдкрдХреА рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦреВрдВрдЧрд╛

n1 := try(foo())
n2 := try(bar())
if n1 == 1 && n2 == 2 {
   return errors.New(`boo`)
}

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрднреА рднреА рдЙрди n1/n2/.... n (n) s рдХреЗ рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рд╕рдорд╛рди рдорд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрдЪрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдПрдХ рдХреАрд╡рд░реНрдб (рдпрд╛ рдлрд╝рдВрдХреНрд╢рди) рдмрд┐рд▓реНрдХреБрд▓ рдХреНрдпреЛрдВ рд╣реИ?

рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рд╕рдВрджрд░реНрдн n+1 рдорд╛рдиреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реИред

рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рд╕рдВрджрд░реНрдн n рдорд╛рдиреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдпрд╛рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

(рдпрд╣ рдПрди = 1 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рд╕рднреА рднрдпрд╛рдирдХ рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рдЖрддреА рд╣реИред)

рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдирджреЗрдЦрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реИ; рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рд╕рдВрдХреЗрдд рджреЗрдирд╛ рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ред

@balasanjay рд╣рд╛рдВ, рд░реИрдкрд┐рдВрдЧ рдПрд░рд░ рдорд╛рдорд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЙрдЧрд┐рдВрдЧ рднреА рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ (рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЪрд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП sql.NoRows ?), рдкрдардиреАрдп рдХреЛрдб рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд╣рдо рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж defer f.Close() рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╣рдо рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рддреБрд░рдВрдд рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ " рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдп рд╣реИрдВ " рдирд┐рдпрдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЧреЛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реАрдзреЗ рдирд┐рдпрдо рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рддрд╛ рд╣реИред

try(errors.Wrap(err, ...)) рднрдпрд╛рдирдХ рдХреЛрдб рдХрд╛ рдПрдХ рдФрд░ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЧреЛ рдбрд┐рдЬрд╛рдЗрди рджреЛрдиреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред

рдореИрдВ @lestrarat . рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ
рдЖрдорддреМрд░ рдкрд░ foo() рдФрд░ bar() рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдВ:
SomeFunctionWithGoodName (Parm1, Parms2)

рддреЛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ @mattn рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛрдЧрд╛:

if  try(SomeFunctionWithGoodName(Parm1, Parms2)) == 1 && try(package.SomeOtherFunction(Parm1, Parms2,Parm3))) == 2 {


} 

рдкрдардиреАрдпрддрд╛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛрдЧреАред

рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
someRetVal, err := SomeFunctionWithGoodName(Parm1, Parms2)
1 рдпрд╛ 2 рдЬреИрд╕реЗ рдХреЙрдиреНрд╕реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ рдФрд░ рдпрд╣ рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдбрдмрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

if  a := try(SomeFunctionWithGoodName(Parm1, Parms2)) && b:= try(package.SomeOtherFunction(Parm1, Parms2,Parm3))) {


} 

рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП ("рдЯреНрд░рд╛рдИрд╣рд╛рд░реНрдб рдиреЗ рдореЗрд░реА рдХрд┐рддрдиреА рдорджрдж рдХреА"):

  1. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЗ рдмреАрдЪ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рджреЗрдЦреЗрдВрдЧреЗ, рджреВрд╕рд░реЛрдВ рд╕реЗ рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдЕрдВрддрд░ рднреА рдорд┐рд▓рддрд╛ рд╣реИ
  2. рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ% рд╕реЗрд╡ рдХреА рддреБрд▓рдирд╛ рди рдХрд░реЗрдВ, рдмрд▓реНрдХрд┐ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдо рд░рд┐рдлреИрдХреНрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред
    (рдЗрд╕ рдкрд░ рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛
    $find /path/to/repo -name '*.go' -exec cat {} \; | grep "err :=" | wc -l
    )

@рдордЦреЛрд╡

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд┐рдпрдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ "рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореВрд▓реНрдп рд╣реИрдВ"

рдЬрд╝рд░реБрд░реА рдирд╣реАрдВред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрднреА рднреА рдорд╛рди рд╣реИрдВред try() if err != nil { return ...,err } рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрдХрдЯ рдмрдирдХрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг error рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рддрд░рд╣ "рд╡рд┐рд╢реЗрд╖" рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬреЛ error рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреВрд░рдХ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдзрд╛рд░рдг рдирд╣реАрдВ рд╣реИред

@ngrily рд╕рд░рд▓реАрдХрд░рдг ? рдХреИрд╕реЗ?

func (req *Request) Decode(r Reader) error {
    defer func() { err = unexpected(err) }()

    req.Type = try(readByte(r))
    req.Body = try(readString(r))
    req.ID = try(readID(r))

    n := try(binary.ReadUvarint(r))
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i] = try(readID(r))
    }
    return nil
}

рдореБрдЭреЗ рдХреИрд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рджреА рдЧрдИ рдереА? рдЗрд╕реЗ err var рдХреЛ рдХреНрдпреЛрдВ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, foo рдХреЛ рдирд╣реАрдВ?
рдХреНрдпрд╛ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдФрд░ рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ?

@ рдбреЗрд╡рд┐рдб

рдХреЛрд╖реНрдардХ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИрдВ [...] рдПрдХ рдХреАрд╡рд░реНрдб рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ рдФрд░ рдпрд╣ рдереЛрдбрд╝рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХрдИ рдЕрдиреНрдп рднрд┐рдиреНрди рд╣реИрдВред

рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рдФрд░ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдирд╛ рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рд╕реМрдВрджрд░реНрдп рдФрд░ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдореБрджреНрджрд╛ рд╣реИред рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИред

рдкреБрдирд╢реНрдЪ: рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрдд рд╣реЛрдиреЗ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реЛрдиреЗ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реИред рдХреАрд╡рд░реНрдб рдХрд╛ рд▓рд╛рдн рд╣реИ... рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдФрд░ try рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ "рд╡рд┐рд╢реЗрд╖" рд╣реИред

@рдордЦреЛрд╡

рд╕рд░рд▓реАрдХрд░рдг?

рдареАрдХред рд╕рд╣реА рд╢рдмреНрдж "рдЫреЛрдЯрд╛ рдХрд░рдирд╛" рд╣реИред

try() рдмрд┐рд▓реНрдЯ-рдЗрди try() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдкреИрдЯрд░реНрди if err != nil { return ..., err } рдХреЛ рдмрджрд▓рдХрд░ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рдЖрд╡рд░реНрддреА рдкреИрдЯрд░реНрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЗрд╕реЗ рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреЗрдВрдб () рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╣рд░ рдмрд╛рд░ "рдПрдХреНрд╕рдЯреЗрдиреНрд╕реЛ рдореЗрдВ" рдХреЛрдб рд▓рд┐рдЦрдХрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рднреА рд╣рдореЗрдВ рдХрд┐рд╕реА рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рд╣рд░ рд╕рдордп рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХреАрдХреГрдд рдерд╛ред try() рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдХреИрд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рджреА рдЧрдИ рдереА?

рд▓реВрдк рдореЗрдВ try() рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░, рдмрд╛рдХреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ try() рдХреА рддрд░рд╣ рд╣реА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ readID() рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рд╕рдЬрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж)ред

рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ var рдХреЛ рдХреНрдпреЛрдВ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, foo рдХреЛ рдирд╣реАрдВ?

рдореБрдЭреЗ рдЖрдкрдХреЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдИ foo рдЪрд░ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ ...

@makhov рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдирд┐рдкреЗрдЯ рдЕрдзреВрд░рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИ (рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрд╛ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдирд╛рдо err рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрджрд┐ рдХреЛрдИ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ)ред

рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдПрдХ рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

func (req *Request) Decode(r Reader) (err error) {
    defer func() { err = unexpected(err) }()

    req.Type = try(readByte(r))
    req.Body = try(readString(r))
    req.ID = try(readID(r))

    n := try(binary.ReadUvarint(r))
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i] = try(readID(r))
    }
    return nil
}

@pierrec рд╢рд╛рдпрдж рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ recover() рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?
defer func() {err = unexpected(tryError())}

@makhov рдЖрдк рдЗрд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func (req *Request) Decode(r Reader) error {
    req.Type, err := readByte(r)
        try(err) // or add annotation like try(annotate(err, ...))
    req.Body, err := readString(r)
        try(err)
    req.ID, err := readID(r)
        try(err)

    n, err := binary.ReadUvarint(r)
        try(err)
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i], err := readID(r)
                try(err)
    }
    return nil
}

@pierrec рдареАрдХ рд╣реИ, рдЪрд▓рд┐рдП рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ:

func (req *Request) Decode(r Reader) error {
        var errOne, errTwo error
    defer func() { err = unexpected(???) }()

    req.Type = try(readByte(r))
    тАж
}

@reusee рдФрд░ рдпрд╣ рдЗрд╕рд╕реЗ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИ?

func (req *Request) Decode(r Reader) error {
    req.Type, err := readByte(r)
        if err != nil { return err }
        тАж
}

рд╣рдо рд╕рднреА рдиреЗ рдХрд┐рд╕ рдХреНрд╖рдг рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рд▓рдШреБрддрд╛ рдкрдардиреАрдпрддрд╛ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ?

@flibustenet рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ "рд╕реБрдзрд╛рд░" рдХреЗ рд▓рд┐рдП рдЯреВрдЯреА рд╣реБрдИ рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдЧреЛ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрдорд╛рдг рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ:

package main

func main() {
    // ...
   try("a", "b")
    // ...
}

func try(a, b string) {
    // ...
}

@ рдордЦреЛрд╡ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдЪрд░ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ? рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рд╣реЛрдЧрд╛ред
рд╢рд╛рдпрдж рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рдореИрдВрдиреЗ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдпрд╛рдж рдХрд┐рдпрд╛?

@flibustenet рд╣рд╛рдБ рдпрд╣ рдХреЛрд╢рд┐рд╢() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╡рдХреВрдл рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

@cespare рдЖрдкрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ defer рдореЗрдВ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕рдВрд╢реЛрдзрди try рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

https://play.golang.com/p/ZMauFmt9ezJ

(рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреА рдмрд╛рдд рдХрд╛ рдЧрд▓рдд рдЕрд░реНрде рдирд┐рдХрд╛рд▓рд╛ рд╣реЛ)

@ jan-g https://github.com/golang/go/issues/32437#issuecomment -507961463 рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдЕрджреГрд╢реНрдп рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрдИ рдмрд╛рд░ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдирд┐рд╣рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдПрдХ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдЬреЛрдбрд╝ рд░рд╣реА рд╣реИ рдЬрд┐рд╕рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдЪреБрдкрдЪрд╛рдк рдФрд░ рдЕрджреГрд╢реНрдп рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рддреЛ рд╣рдо рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЧреЛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдирд┐рд╣рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рдЙрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред

@griesemer

рдореИрдВрдиреЗ рдЕрдкрдиреА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ (https://github.com/komuw/meli) рдкрд░ tryhand рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЗрд╕рдиреЗ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

gobin github.com/griesemer/tryhard
     Installed github.com/griesemer/[email protected] to ~/go/bin/tryhard

`` `рдмрд╛рд╢
~/go/bin/tryhard -err "" -r
0

most of my err handling looks like;
```Go
import "github.com/pkg/errors"

func CreateDockerVolume(volName string) (string, error) {
    volume, err := VolumeCreate(volName)
    if err != nil {
        return "", errors.Wrapf(err, "unable to create docker volume %v", volName)
    }
    return volume.Name, nil
}

@komuw рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ tryhard , рдЬреИрд╕рд╛ рдХрд┐ рдореЗрдВ рд╣реИ

tryhard -err="" -r .  // <<< note the dot
tryhard -err="" -r filename

рд╕рд╛рде рд╣реА, рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЖрдкрдХреЗ рдЬреИрд╕реЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ if рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ tryhard рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдкрдврд╝реЗрдВ рдХрд┐ рдпрд╣ рдХрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

func CreateDockerVolume(volName string) (string, error) {
    volume, err := VolumeCreate(volName)
    if err != nil {
        return "", errors.Wrapf(err, "unable to create docker volume %v", volName)
    }
    return volume.Name, nil
}

рдпрд╣ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╕рдордп рдореЗрд░реА рдкрд╣рд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╣ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдереА рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╣рдХрд▓рд╛рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ:

unable to create docker volume: VolumeName: could not create volume VolumeName: actual problem

рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ VolumeCreate рдлрд╝рдВрдХреНрд╢рди (рдПрдХ рдЕрд▓рдЧ рд░реЗрдкреЛ рд╕реЗ) рд╣реИ:

func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) {
        var volume types.Volume
        resp, err := cli.post(ctx, "/volumes/create", nil, options, nil)
        defer ensureReaderClosed(resp)
        if err != nil {
                return volume, err
        }
        err = json.NewDecoder(resp.body).Decode(&volume)
        return volume, err
}

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдЬрд╛рд╡рдЯ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдЬрд╛рдпрд╛ рдирд╣реАрдВ рд╣реИред рдЙрд╕ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ try рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╢рд╛рдпрдж VolumeCreate рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ CreateDockerVolume рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдЬрд╛рд╡рдЯ рдЬреЛрдбрд╝рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

@рдиреАрд▓реНрдб
рднрд▓реЗ рд╣реА VolumeCreate рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдПрдЧрд╛, рдлрд┐рд░ рднреА рд╣рдореЗрдВ рдЗрд╕рдХреА рд╕рдЬрд╛рд╡рдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП CreateDockerVolume рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ VolumeCreate рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреБрдЫ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ (рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ log) рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рдлрд▓ рд╣реБрдЖ - рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ CreateDockerVolume рд╣реИ,
рдлрд┐рд░ рднреА, VolumeCreate рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП APIclient рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рд╡рд╣реА рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ - os.Open рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдЖрджрд┐ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
func ReadConfigFile(...
func WriteDataFile(...
рдЖрджрд┐ - рдХреЙрд▓ рдХрд░рдирд╛ os.Open рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдлрд▓ рднрд╛рдЧ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ, рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рди рдХреЗрд╡рд▓ рдЙрддреНрдкрд╛рджрди env рдореЗрдВред

@ рдиреАрд▓ рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдЯрд░реА рд╕реЗ рдирд╣реАрдВ рдЙрддрд╛рд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди...

рд╢рд╛рдпрдж VolumeCreate рдлрдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред
рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐
CreateDockerVolume рдлрд╝рдВрдХреНрд╢рди
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдЬрд╛рд╡рдЯ рдЬреЛрдбрд╝рдиреА рдЪрд╛рд╣рд┐рдП,

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ CreateDockerVolume рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛
рдЬрд╛рдиреЗрдВ рдХрд┐ рдХреНрдпрд╛ VolumeCreate рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдпрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореИрдВ
рдореБрдЭреЗ рд╕рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╣реИ, рддреЛ рд╡реЗ рдЕрдкрдиреЗ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдВред рдФрд░ рдЪреВрдВрдХрд┐ рд╡рд╣ рдкрд░рд┐рд╡рд░реНрддрди рдПрдкреАрдЖрдИ рдирд╣реАрдВ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рд╡реЗ
рдЗрд╕реЗ рдкреИрдЪ/рдорд╛рдореВрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ рдФрд░ рдЕрдм рдореЗрд░рд╛ рдХрд╛рд░реНрдп рдЬреЛ рдерд╛
рд╕рдЬрд╛рдП рдЧрдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ рдЙрдирдХреЗ рдХрд╛рд░реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рд╕рднреА рдирд╣реАрдВ рд╣реИ
рдЬрд╛рдирдХрд╛рд░реА рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдПред
рддреЛ рдЖрдо рддреМрд░ рдкрд░ рдореИрдВ рдЦреБрдж рдХреЛ рд╕рдЬрд╛рддрд╛/рд▓рдкреЗрдЯрддрд╛ рд╣реБрдЖ рдкрд╛рддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реВрдВ
рдХреЙрд▓рд┐рдВрдЧ рдкрд╣рд▓реЗ рд╣реА рд▓рдкреЗрдЯреА рдЬрд╛ рдЪреБрдХреА рд╣реИред

рдПрдХ рд╕рд╣рдХрд░реНрдореА рдХреЗ рд╕рд╛рде try рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рдореЗрд░реЗ рдорди рдореЗрдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ try рдХреЗрд╡рд▓ 1.14 рдореЗрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред @crawshaw рдФрд░ @jimmyfrasche рджреЛрдиреЛрдВ рдиреЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рддреНрд╡рд░рд┐рдд рджреМрд░рд╛ рдХрд┐рдпрд╛ рдФрд░ рдХреБрдЫ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрдЧрд╛ред

рдЗрд╕рд╕реЗ рдЧреЛ рдЯреАрдо рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рд╕рдореБрджрд╛рдп рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд┐рддрдиреА рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдХрд┐рддрдиреА рдмрд╛рд░ defer рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдпрд╣ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ tryhard рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЖрджрд┐ред

рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рднрд╛рд╡рдирд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реИ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрддрд╛ рд╣реИ рдЬреЛ рдирд┐рдпрдорд┐рдд рдЧреЛ рдХреЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рджреЗрддрд╛ рд╣реИ рдХрд┐ try рдореМрдЬреВрджрд╛ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╕реЛрдЪрд╛ рд╣реИ; рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рджреЗрдЦрд╛ред

@jonbodner https://go-review.googlesource.com/c/go/+/182717 рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рднреВрд▓ рдЧрдпрд╛: рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд┐рдпрд╛, рдпрд╣ рдирд╣реАрдВред

рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рднреВрд▓рдирд╛ рдЕрд╕рдВрднрд╡ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

@jonbodner https://go-review.googlesource.com/c/go/+/182717 рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ:

  1. 1 рдкрдВрдХреНрддрд┐ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ 4 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИ ( if ... { return err } рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП 2 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)
  2. рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдХреЗрд╡рд▓ рдЕрд╕рдлрд▓ рдкрде рдкрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд▓рдЧрднрдЧ 6,000 рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд╢рд╛рдпрдж рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдпрджрд┐ рдореИрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВред)

рдХреНрдпрд╛ рдореИрдВ, рдПрдХ рдЕрдиреБрд░рдХреНрд╖рдХ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ, рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдЙрдард╛рдКрдВрдЧрд╛? рддрдм рддрдХ рдирд╣реАрдВ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рд╕реНрд╡рдпрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ред рдЬреЛ рдЗрд╕реЗ golang/go рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдареАрдХ рдмрдирд╛рддрд╛ рд╣реИред

рдкреАрдПрд╕ рд╕реАрдПрд▓ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╕реНрд╡реАрдХрд░рдг:

... Some transformations may be incorrect due to the limitations of the tool (see https://github.com/griesemer/tryhard)...

рдЬреИрд╕реЗ xerrors , рдЗрд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрджрдо рдХреИрд╕реЗ рдЙрдард╛рдпрд╛ рдЬрд╛рдП?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

https://github.com/junpayment/gotry

  • рдпрд╣ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдРрд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдо рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

===

рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рджреЛ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВред

1. рдПрдХ рд░рд╛рдп рд╣реИ рдХрд┐ рд░реЗрдЦрд╛ рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд╕реНрдердЧрд┐рдд (рдпрд╛ рд╣реИрдВрдбрд▓рд░) рдЦрдВрдб рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред

foo, err: = Foo ()
if err! = nil {
  if err.Error () = "AAA" {
    some action for AAA
  } else if err.Error () = "BBB" {
    some action for BBB
  } else if err.Error () = "CCC" {
    some action for CCC
  } else {
    return err
  }
}

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ try рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред

handler: = func (err error) {
  if err.Error () = "AAA" {
    some action for AAA
  } else if err.Error () = "BBB" {
    some action for BBB
  } else if err.Error () = "CCC" {
    some action for CCC
  } else {
    return err
  }
}
foo: = try (Foo (), handler)

2. рдЕрдиреНрдп рдЦрд░рд╛рдм рдкреИрдХреЗрдЬ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЧрд▓рддреА рд╕реЗ рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред

type Bad struct {}
func (bad * Bad) Error () {
  return "i really do not intend to be an error"
}

@junpayment рдЖрдкрдХреЗ gotry рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ try рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА Try рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛ред interface{} рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред

рдЖрдкрдХреЗ рджреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:
1) рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ try рдХреЛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? (рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ try рдХреЗ рдкрд╣рд▓реЗ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛?)
2) рдореИрдВ рдЧрд▓рддреА рд╕реЗ рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛрдИ рдирдИ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЬрд╣рд╛рдБ рддрдХ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдИ рд╣реИрдВред

@jonbodner https://go-review.googlesource.com/c/go/+/182717 рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореБрдЭреЗ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рд╕рдВрджреЗрд╣ рд╣реИ, рдЧреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ try() рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдЕрднреА рдкрд╛рд░рд┐рдд рд╣реБрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ tryhard рдХреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рджреВрд╕рд░реЛрдВ рдФрд░ рдореИрдВрдиреЗ рдКрдкрд░ рд╕рдмрдорд┐рдЯ рдХрд┐рдП рд╣реИрдВ, рдХрдИ рдЕрдиреНрдп рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП try() рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд╣реАрдВ рдмрд╕ рдмреАрдд рдЧрдпрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЛ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд░рди рдЯрд╛рдЗрдо рдХреБрдЫ "рдЕрджреНрд╡рд┐рддреАрдп" рдЧреЛ рдХреЛрдб рд╣реИрдВ, рдЬреЛ рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try() рдХреЛ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ рдПрдХ defer рдХрдерди рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рдВрдЫрдиреАрдп рдирд╣реАрдВ рд╣реИред

@griesemer

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╕реЗ рд╕рднреА рдкреНрд░рдпрд╛рд╕ рдкрд░рд┐рдгрд╛рдо рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛ред

рдЖрдк рд╕рд╣реА рд╣реЗред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рд░ рдХреЛ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? (рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдХреЛрд╢рд┐рд╢ рдХреЗ рдкрд╣рд▓реЗ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛?)

рдореИрдВрдиреЗ рднреВрд▓ рдХреАред рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрдЬрд╛рдп defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдореБрдЭреЗ рдорд╛рдл рдХрд░ рджреЛред

рдореИрдВ рдЬреЛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдпреЛрдЧрджрд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реИрд╕реЗ рднреА рд╕реНрдердЧрд┐рдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЬрдм рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдкреНрд░рднрд╛рд╡ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЧрд▓рддреА рд╕реЗ рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛрдИ рдирдИ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЬрд╣рд╛рдБ рддрдХ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдИ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИред

@beoran рдореИрдВрдиреЗ рдЧреЛ рдХреЙрд░реНрдкрд╕ (https://github.com/rsc/corpus) рдХрд╛ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ tryhard рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреБрд▓ err != nil рдЪреЗрдХ рдореЗрдВ рд╕реЗ 41.7% рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдкреИрдЯрд░реНрди "_test.go" рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╕рдВрдЦреНрдпрд╛ 51.1% рддрдХ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ ( tryhard рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рдирд╣реАрдВ рдвреВрдВрдврддрд╛ рд╣реИ)ред рдЪреЗрддрд╛рд╡рдиреА, рдЗрди рдирдВрдмрд░реЛрдВ рдХреЛ рдирдордХ рдХреЗ рджрд╛рдиреЗ рдХреЗ рд╕рд╛рде рд▓реЗрдВ, рдореБрдЭреЗ $#$4 tryhard #$ рдХреЗ рд╣реИрдХ-рдЕрдк рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд░ (рдпрд╛рдиреА рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛ рд╣рдо err != nil рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ) рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдо рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ рдЬрдм рддрдХ tryhard рдиреЗ рдЗрди рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░ рджрд┐рдпрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ tryhard рдЯрд╛рдЗрдк-рдЕрд╡реЗрдпрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

// Before.
a, err := foo()
if err != nil {
  return 0, nil, errors.Wrapf(err, "some message %v", b)
}

// After.
a, err := foo()
try(errors.Wrapf(err, "some message %v", b))

рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рддрд░реНрдХ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ nil рд▓реМрдЯрдиреЗ рдХрд╛ рд░реИрдк рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ nil рд╣реИред ( github.com/pkg/errors рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рднреА рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИ, рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЬрд┐рд╕ рдЖрдВрддрд░рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рднреА nil рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреЛрд╕реНрдЯ- try , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)ред рдирдИ рдкреАрдврд╝реА рдХреЗ рд╕рдкреЛрд░реНрдЯ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдпрдж рдЗрди рдкреНрд░рдЪрд╛рд░ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдирд╛рдо рджреЗрдВрдЧреЗред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдкреИрдЯрд░реНрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдкрд╣рд▓реЗ, рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ err != nil рдЪреЗрдХ рдЖрдЙрдЯ рдХреЗ 50% рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ .

рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ CreateDockerVolume https://github.com/golang/go/issues/32437#issuecomment -508199875 рдХреЗ рд╕рд╛рде
рдореБрдЭреЗ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд┐рд▓рд╛ред lib рдореЗрдВ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдкрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ, lib рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдореИрдВ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП defer рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдХрд░ рдЗрд╕рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:

func MyLib() error {
    return errors.New("Error from my lib")
}
func MyOtherLib() error {
    return errors.New("Error from my otherLib")
}

func Caller(a, b int) error {
    eh := func(err error) error {
        return fmt.Errorf("From Caller with %d and %d i found this error: %v", a, b, err)
    }

    err := MyLib()
    if err != nil {
        return eh(err)
    }

    err = MyOtherLib()
    if err != nil {
        return eh(err)
    }

    return nil
}

рдпрд╣ try+defer рдХреЗ рд╕рд╛рде рдареАрдХ рдФрд░ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд▓рдЧреЗрдЧрд╛

func Caller(a, b int) (err error) {
    defer fmt.Errorf("From Caller with %d and %d i found this error: %v", a, b, &err)

    try(MyLib())
    try(MyOtherLib())

    return nil
}

@griesemer

рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдерди рд╣реИрдВ:

рдпрджрд┐ рд╕рдВрд▓рдЧреНрди рдлрд╝рдВрдХреНрд╢рди рдЕрдиреНрдп рдирд╛рдорд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЬреЛ рднреА рдореВрд▓реНрдп рд░рдЦрддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдЕрдиреНрдп рдЕрдЬреНрдЮрд╛рдд рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╢реВрдиреНрдп рдорд╛рди рдорд╛рдирддреЗ рд╣реИрдВ (рдЬреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдорд╛рди рдХреЛ рд░рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИ)ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо 0 рдХреЗ рдмрдЬрд╛рдп 1 рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛: https://play.golang.org/p/KenN56iNVg7ред

рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ try рдХреЛ рдПрдХ рдирдЧреНрди рд╡рд╛рдкрд╕реА рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд▓реМрдЯрд╛рдП рдЬрд╛ рд░рд╣реЗ рдореВрд▓реНрдп рдирд┐рд╣рд┐рдд рд╣реИрдВ; рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд▓реМрдЯрд╛рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХрд┐рд╕реА рдХреЛ рдХреЙрд▓ рд╕реЗ try рддрдХ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреВрд░реА рдкрд░ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдирдЧреНрди рд░рд┐рдЯрд░реНрди (рдЧреИрд░-рдЗрд▓рд╛рдХреЗ) рдХреА рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдЖрдо рддреМрд░ рдкрд░ рдирд╛рдкрд╕рдВрдж рд╣реЛрддреА рд╣реИ, try рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рд╣рдореЗрд╢рд╛ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рддрд░реНрдХреЛрдВ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ (рдпрджрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ)?

рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:

рдпрд╣ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЬреБрдбрд╝реЗ рдХреБрдЫ рдкреИрдЯрд░реНрди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, io.Writer рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ рдЖрдВрд╢рд┐рдХ рд▓реЗрдЦрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА рд▓рд┐рдЦреЗ рдЧрдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЧрд┐рдирддреА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реИрд╕реЗ рднреА try рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП n += try(wrappedWriter.Write(...)) рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ n рдХреЛ рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рдпрд╣ рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреЛрдЧреА рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рджреБрд░реНрд▓рдн рд╣реИред

рдпрджрд┐ try рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдб рдмреНрд▓реЛрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрдИ рд╕реНрдерд╛рди рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдЪрд░ рдХреЛ рд╢реВрдиреНрдп-рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрдХрд▓рдХ рдЗрди рджрд┐рдиреЛрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓реЗрдЦрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдФрд░ рджреВрд╕рд░рд╛, рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА try -рдЬрдирд░реЗрдЯреЗрдб рдмреНрд▓реЙрдХ goto рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдЭрд╛ рдлрд╝рдВрдХреНрд╢рди-рд╡рд╛рдЗрдб рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдзрд╛ рдЕрдиреБрдХреВрд▓рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЛ рд╢реВрдиреНрдп рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, tryhard рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд╛рдЗрдб рдмреЗрдирд┐рдлрд┐рдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдкреВрд░реНрд╡рд╡реНрдпрд╛рдкреА рд░реВрдк рд╕реЗ tryhard рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣реА рдмрдирд╛ рджреЗрдЧрд╛ред

@jonbodner https://go-review.googlesource.com/c/go/+/182717 рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореБрдЭреЗ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рд╕рдВрджреЗрд╣ рд╣реИ, рдЧреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ try() рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рдЕрднреА рдкрд╛рд░рд┐рдд рд╣реБрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ tryhard рдХреЗ рдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рджреВрд╕рд░реЛрдВ рдФрд░ рдореИрдВрдиреЗ рдКрдкрд░ рд╕рдмрдорд┐рдЯ рдХрд┐рдП рд╣реИрдВ, рдХрдИ рдЕрдиреНрдп рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП try() рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд╣реАрдВ рдмрд╕ рдмреАрдд рдЧрдпрд╛ред

рдореИрдВ рдЗрд╕рдХреА рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реВрдВрдЧрд╛ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдВрдЧрд▓реА рдореЗрдВ рдХреЛрдб рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рд╕реАрдзреЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреЗрдирд░рд┐рдХ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореЗрд░реЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рдореИрдВрдиреЗ 2 рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ

  1. рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░ рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдкреИрдирд┐рдХ рдХреЛ рдареАрдХ рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВ
  2. рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ рд╕реНрдердЧрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдореИрдВ рд╕рдореГрджреНрдз рд╕реНрдЯреИрдХ рдлрд╝рд╛рдЗрд▓/рд▓рд╛рдЗрди рдирдВрдмрд░ рдкреАрд╕реА рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛ рд╕рдХреВрдВ

рдпреЗ рдкреИрдЯрд░реНрди рд╡реНрдпрд╛рдкрдХ рдирд╣реАрдВ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред 1) рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрд╕рдХреЗ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 2) рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдореЗрд░реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рд╕рд░рд▓ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЖрд╢реАрд░реНрд╡рд╛рдж рджрд┐рдпрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╡реНрдпрд╛рдкрдХ рдирд╣реАрдВ рд╣реИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдЪреНрдЫреЗ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рд░ рдЪреАрдЬ рдХреА рддрд░рд╣, рдЧреЛ рдЯреАрдо рдХреЗ рджрд┐рд╢рд╛-рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдиреЛрдЯ рдХрд╛ рдПрдХ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдЬрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреБрдЫ рд╕реНрдерд╛рди рдРрд╕реЗ рд╣реЛрдВрдЧреЗ рдЬрд╣рд╛рдБ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рд╕реНрдерд╛рди рдЬрд╣рд╛рдБ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рдорд╣рд╛рди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рдереЗ, рд▓реЛрдЧреЛрдВ рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рд░ рдмрд╛рд░ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╣реАрдВ рдЦреБрд▓рдиреЗ рдкрд░ рд╣рдореЗрд╢рд╛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░ "рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: conf.json" рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд: "рдЕрдХреНрд╖рдо" рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдбреАрдмреА рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: рд╕рд┐рд╕реНрдЯрдо рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: conf.json"ред

рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде, рдЕрдм рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдорд┐рд▓ рд░рд╣реЗ рд╣реИрдВред рд╡рд░реАрдпрддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ:

  • рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рд░рд▓ рд╣реЛрдЧреА рдЬреИрд╕реЗ "рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: conf.json"
  • рдПрдХ рддреНрд░реБрдЯрд┐ рдлреНрд░реЗрдо рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрджрд░реНрдн рд╢рд╛рдорд┐рд▓ рд╣реИ: GetUserName -> GetConnection -> LoadSystemFileред
  • рдпрджрд┐ рдпрд╣ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ MyAppError {рддреНрд░реБрдЯрд┐}

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЛрд╢рд┐рд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдФрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдЪреАрдЬреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВ:

  1. рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░реЗрдВ! = рд╢реВрдиреНрдп {рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐} рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдвреЗрд░ рддрдХ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХреЗ
  2. рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд░рд▓реАрдХреГрдд рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдЬрд╣рд╛рдВ рдЧрд▓рддреА == nil
  3. рд╕рдорд╛рдзрд╛рди рдХреЛ рдмрд╛рдж рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдЗрдЯ рдкрд░ рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ, рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдкрд░ рдЬрд╛рдПрдВ, рд╡рд╛рдкрд╕реА рд╢рдмреНрджрд╛рд░реНрде рдЖрджрд┐ рдХреЗ рдмрдЬрд╛рдп рдЧреЛрдЯреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  4. рдХреЛрдбрдмреЗрд╕ рдХреЗ рддрд░реНрдХ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдпрд╛рдиреА рдЗрд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣рдж рддрдХ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд░рдЦреЗрдВред

рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА 1) рд╣реИред рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ 1 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ) рдХреНрдпреЛрдВрдХрд┐ рдмреЗрд╣рддрд░ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдкрд╣рд▓реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рдереЗред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐, рдЬрдм рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреА рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдзрд┐рдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрджрд▓реЗрдЧреАред

рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдХрд┐рддрдирд╛ рдкрд░ рдЕрд╕рд╣рдорддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдореЗрд░реЗ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

var u user = try(db.LoadUser(try(strconv.ParseInt(stringId)))

рдЬрд╛рд╡рд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рдЕрдкрд╡рд╛рдж рдЖрджрд░реНрд╢ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрдЧрд╛:

User u = db.LoadUser(Integer.parseInt(stringId)))

рдХреЛрдИ рднреА рдЗрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░ рдирд╣реАрдВ рдХрд╣реЗрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ 2 рд▓рд╛рдЗрди рдореЗрдВ рдХрд░рдирд╛ рд╣реИ рдпрд╛рдиреАред

int id = Integer.parseInt(stringId)
User u = db.LoadUser(id))

рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдХреЗ рддрд╣рдд рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдЗрдирд▓рд╛рдЗрди рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреА рд▓рд╛рдЗрди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдЬ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рдХрд░реЗрдВрдЧреЗ:

var u user
var err error
var id int
id, err = strconv.ParseInt(stringId)
if err != nil {
  return u, errors.Wrap("cannot load userid from string: %s: %v", stringId, err)
}
u, err = db.LoadUser(id)
if err != nil {
  return u, errors.Wrap("cannot load user given user id: %d: %v", id, err)
}
// now work with u

рдЕрдм, рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЗрди 10 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ 1 рдкрдВрдХреНрддрд┐ рд╣реЛрдЧреА, рдФрд░ рдЬреЛ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде 1 рдкрдВрдХреНрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЬрдм рдореИрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдкрдбрд╝рддреА рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреМрди рд╕реА рд░реЗрдЦрд╛рдПрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЗрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЧреНрд░реЛрдХ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рдЬреАрд╡рди рдореЗрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рдкрд╣рд▓реВ рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдпрд╛рдж рд╣реИред рд╡рд╣рд╛рдВ, рд▓рдХреНрд╖реНрдп рдерд╛

рдпрд╣ рдЙрди рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ (рдЬреИрд╕реЗ рд▓реЙрдЧрд┐рдВрдЧ) рдХреЗ рд▓рд┐рдП рдХреЗрдВрджреНрд░реАрдп рдирд╣реАрдВ рд╣реИрдВ, рдХреЛрдб рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрд░ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ https://en.wikipedia.org/wiki/Aspect-рдЙрдиреНрдореБрдЦ_рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдЙрджреНрдзреГрдд)ред
рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреЗрдВрджреНрд░реАрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрдВрджреНрд░реАрдп рд╣реИред рд╡рд┐рдЪрд╛рд░ рдПрдХ рд╣реА рд╣реИ - рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ " рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ "ред рд╣рд╛рдБ рдпрд╣ рд╣реИ, рдФрд░ рд╣рд╛рдБ рд╣рдо рдЗрд╕реЗ рдПрдХ рддрд░рдл рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

4 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ), рдХрдИ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдиреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЙрд╕ рддрд░рдл рдХреЛрдб рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓ рдХреАрд╡рд░реНрдб рд╣реИ, рдФрд░ рд▓реЛрдЧреЛрдВ рдиреЗ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд░ рдореИрдХреЗрдирд┐рдЬреНрдо рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╕ рдЗрд╕реЗ рддреЗрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рдЗрд╕рдХреА рджрд░реНрджрднрд░реА рдПрдбрд╝реА рдереАред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ - рдореИрдВрдиреЗ рдЧреЛ рдЯреАрдо рдХреЛ рдХрдИ рдмрд╛рд░ рд╕реНрдердЧрд┐рдд рддрдВрддреНрд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢реЛрд░ рдордЪрд╛рдпрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ tryhard рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝реНрд▓реИрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди try рдФрд░ рдирдП рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде, рд▓реЛрдЧ рдЗрд╕ рдХреЛрдб рдХреЛ 1-рд▓рд╛рдЗрдирд░ рдореЗрдВ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдлрд╝реНрд░реЗрдо рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрджрд░реНрдн рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рджреЗрдВред

рд╕рдВрджрд░реНрдн, рдЬреЛ рдЕрдкрд╡рд╛рдж рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛, рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдИрдбреА рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдЖрдИрдбреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЙрд╕рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдд рдХрд┐рдпрд╛ред

рдЗрд╕реЗ рдПрд░рд░ рдлрд╝реЙрд░реНрдореЗрдЯрд░ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдВ, рдФрд░ рдЕрдм рд╣рдо рдПрд░рд░ рдлреНрд░реЗрдо рдФрд░ рдПрд░рд░ рдХрд╛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ a: b: c: d: e: underlying error рд╕реНрдЯрд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд┐рдирд╛ рдЬреЛ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЬреЛ рд╣рдордиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдереЗред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпреЗ рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рд╕рд╛рде рд╣рдореЗрдВ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди, рдЬрдмрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдирд┐рджрд╛рди рдФрд░ рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рд╕реНрд╡рд░реВрдкрдг рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧред рдпреЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рде рдмреЗрд╣рдж рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдКрдкрд░ 3) рджрд┐рдП рдЧрдП, рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рдХреАрд╡рд░реНрдб рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдирд╛рдо рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рдСрди-рдж-рд╕реНрдкреЙрдЯ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рдЧреЛрдЯреЛ рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ (рд░рд┐рдЯрд░реНрди рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдПрдХ рдХреАрд╡рд░реНрдб рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рдЧреЛ рдЯреАрдо рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЬрдм рдЧреЛ 2 рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдХрд┐ рд╡реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред try рдлрд╝рдВрдХреНрд╢рди рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреЛрдлрд┐рдХреНрд╕ try рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ рдлрд┐рд░ рд╕реЗ!

7/4/19 рдХреЛ, рд╕рдВрдЬрдп рдореЗрдирд╛рдХреБрд░реБ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@griesemer

[...]
рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ try рдХреЛ рдирдЧреНрди рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ
рд╡рд╛рдкрд╕реА, рдЬрд╣рд╛рдВ рд▓реМрдЯрд╛рдП рдЬрд╛ рд░рд╣реЗ рдореВрд▓реНрдп рдирд┐рд╣рд┐рдд рд╣реИрдВ; рдХреНрдпрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рд▓реМрдЯрд╛рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХрд┐рд╕реА рдХреЛ рдХреЛрдб рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ a
рдХреЙрд▓ рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреВрд░реА try рд╣реА рд╣реИред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдирдЧреНрди рд░рд┐рдЯрд░реНрди (рдЧреИрд░-рдЗрд▓рд╛рдХреЗ) рдХреА рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдЖрдо рддреМрд░ рдкрд░ рд╣реИ
рдирд╛рдкрд╕рдВрдж, try рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд▓реМрдЯрд╛рдиреЗ рдкрд░ рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ
рдЧреИрд░-рддреНрд░реБрдЯрд┐ рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рди (рдпрджрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ)?

рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХреА рдЕрдиреБрдорддрд┐ рдХреЗрд╡рд▓ рддрднреА рджреА рдЬрд╛рддреА рд╣реИ рдЬрдм рд░рд┐рдЯрд░реНрди рддрд░реНрдХреЛрдВ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИ?

рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордЧреНрд░ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ try рдХреАрд╡рд░реНрдб рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдкреИрдЯрд░реНрди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдЖрдпрд╛рдд рд╕реЗ рд╣рд░ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ:

рд╕реНрдкрд╖реНрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ

res, err := doSomething()
if err != nil {
    return err
}

рд╕реНрдкрд╖реНрдЯ рдЕрдирджреЗрдЦреА

res, _ := doSomething()

рдЖрд╕реНрдердЧрд┐рдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ

рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛ try рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

res, . := doSomething()

@piotrkowalczuk
рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЧреЛ рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░реНрд╕ рджреЛрдиреЛрдВ рдореЗрдВ рдЗрд╕реЗ рдХрд╛рдиреВрдиреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

@balasanjay (рдФрд░ @lootch): рдпрд╣рд╛рдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рд╛рдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо https://play.golang.org/p/KenN56iNVg7 1 рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ред

рдЪреВрдВрдХрд┐ try рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдпрд╣ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рдЙрдирдХреЗ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ред рдПрдХ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдкрд░рд┐рдгрд╛рдо рдорд╛рдиреЛрдВ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ; рдлрд┐рд░ рднреА рдЕрдЧрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рддреЛ рдХреЙрд▓рд░ (рд╕рдВрднрд╛рд╡рдирд╛) рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рд░реНрдгрдп рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕рдХреЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рдкрд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рд╢реНрди (рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдкрд░ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ) try рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ return рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрд╕реЗ рдЙрд╕реА рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред]

рдПрдХ рд▓реЗрдЦрдХ рдХреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ n += try(wrappedWriter.Write(...)) : рд╣рд╛рдБ, рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рднреА n рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЛрдИ рднреА try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ - рднрд▓реЗ рд╣реА try рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдорд╛рдиреЛрдВ рдХреЛ рд╢реВрдиреНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ try рдХреЗрд╡рд▓ рдХреБрдЫ рднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ: try рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХреЙрд▓рд░ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓рд░ рдХреЗ рдХреЙрд▓рд░ рдХреЛ)ред try рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрд╕реНрдерд╛рдпреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджреЗрдЦреЗрдВред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдЬреИрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рдХреЛ рднреА if рдХрдерди рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд▓реМрдЯрд╛рдИ рдЧрдИ рдмрд╛рдЗрдЯ рдЧрд┐рдирддреА рдХреЛ n рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдореИрдВ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛ рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВред

@griesemer : рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЛ рдЙрдирдХреЗ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЙрд▓рд╕рд╛рдЗрдЯ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ try рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдпрд╛ рддреЛ a) рдХреБрдЫ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдпрд╛ b) рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, try рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдирд╛рдо рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХреЗ рдХрд┐ рдХреМрди рд╕реЗ рдореВрд▓реНрдп try рд▓реМрдЯ рд░рд╣реЗ рд╣реИрдВред

рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рд╛рде рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИ (рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдореВрд▓реНрдп рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рд╣реИ), рдФрд░ рд╕рдВрднрд╡рддрдГ https://github.com/golang/go/issues/21291 рджрд╛рдЦрд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдерд╛ред рдпрд╣, рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рд╡рд╛рд▓реЗ рдмрдбрд╝реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ try рдХреЛ рдЙрд╕реА рдЖрдзрд╛рд░ рдкрд░ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдирдЧреНрди рд░рд┐рдЯрд░реНрди (https://github.com/golang/go/wiki/CodeReviewComments) #рдирд╛рдо-рдкрд░рд┐рдгрд╛рдо-рдкреИрд░рд╛рдореАрдЯрд░)ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ try рдХреЛ рд╣рдореЗрд╢рд╛ рдЧреИрд░-рддреНрд░реБрдЯрд┐ рддрд░реНрдХ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЪрдХрд┐рдд рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЧреЛ рдЯреАрдо рдХреЗ рд▓рд┐рдП рдмреБрд░рд╛ рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред try рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд╛рдл рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ: рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд╡рд╛рдЪрд╛рд▓рддрд╛ред

рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝рддрд╛ рд╣реИ: рдПрдХ рд╕рд╛рд▓ рдХреА рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рдХреЛрдб рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдк рдЬреЛ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рдСрдкреНрдЯ-рдЗрди рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рд░реЛрдз рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рджрд┐рдЦрд╛рдпрд╛ рд╣реИ!

рдореИрдВ рдЧреЛ рдЯреАрдо рдХреЛ try рдПрдХ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдмрд┐рд▓реНрдЯ-рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ

try(outf.Seek(linkstart, 0))
try(io.Copy(outf, exef))

рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

try(outf.Seek(linkstart, 0)), io.Copy(outf, exef)))

рдЕрдЧрд▓реА рд╡рд░реНрдмреЛрдЬрд╝ рдЪреАрдЬрд╝ try рдкрд░ рд▓рдЧрд╛рддрд╛рд░ рдХреЙрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореИрдВ try рдХреЗ рд╡рд┐рд╡рд┐рдз рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП nvictor рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рд╡рд┐рдз рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрд░реЗ рд▓рд┐рдП рдкрдардиреАрдпрддрд╛ рд╕реАрдорд╛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИред

@nvictor Go рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдЧреИрд░-рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдПрдХ рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдЬреЛ try рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ (рдпрджрд┐ рдпрд╣ рдлреНрд▓реИрдЯ-рдЖрдЙрдЯ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди "рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛" рд╣реИ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╣рд╛рдВ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рдзреАрдорд╛ рдХрд░ рджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдвреВрдВрдвреВрдВрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рддреЛ рдореБрдЭреЗ рдЧреБрд╕реНрд╕рд╛ рдирд╣реАрдВ рдЖрддрд╛ред рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рджреЗрдЦрдиреЗ рдореЗрдВ, рдореИрдВ рдПрдХ рдмреНрд▓реЙрдХ рдХреЛрдб рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрдм try рдЬреИрд╕реЗ рд╣реИрдВрдбрд▓ рдЧрд▓рддреА func

рдЗрд╕ рдЪрд░реНрдЪрд╛ (рдФрд░ рд░реЗрдбрд┐рдЯ рдкрд░ рдЪрд░реНрдЪрд╛) рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдХрд┐ рд╣рд░ рдХреЛрдИ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрд╛ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://faiface.github.io/post/how-to-use-try/ред

рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХрдИ рдкрд╣рд▓реБрдУрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддрд╛рдХрд┐ рд╣рд░ рдХреЛрдИ рджреЗрдЦ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдзрд┐рдХ рд╕реВрдЪрд┐рдд (рднрд▓реЗ рд╣реА рдирдХрд╛рд░рд╛рддреНрдордХ) рд░рд╛рдп рдмрдирд╛ рд╕рдХреЗред

рдЕрдЧрд░ рдореБрдЭреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпрд╛рдж рдЖрдпрд╛, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ!

@faiface рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ

if err != nil {
    return resps, err
}

try(err) рдХреЗ рд╕рд╛рдеред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ!

@DmitriyMV рд╕рдЪ рд╣реИ! рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рд░рдЦреВрдВрдЧрд╛, рддрд╛рдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ if err != nil рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рджреЛ рдЪрд┐рдВрддрд╛рдПрдВ рд╣реИрдВ:

  • рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирдП рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ
  • рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдЧрд╛

рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдиреЗ рд▓рдЧрднрдЧ рд╣рд░ рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рднреНрд░рдо рдкреИрджрд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЬрд╛рдирддрд╛ рд╣реВрдВред

рдПрдХ рдФрд░ рдорд╛рдореВрд▓реА, рд╢реИрд▓реАрдЧрдд рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдм рдХреЛрдб рдХреА рдХрд┐рддрдиреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ try(actualThing()) рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ try() рдореЗрдВ рд▓рд┐рдкрдЯреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдПрдХ рдЪрд┐рдордЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)

check() рдмрд╣реБрдд рдХреБрдЫ try() рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╡рд╛рдкрд╕реА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ред

рдпрд╣ try() рдХреЗ рдХрдИ рд▓рд╛рднреЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦреЗрдЧрд╛:

  • рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИ
  • рдпрд╣ рдореМрдЬреВрджрд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ WRT рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ
  • рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдореМрдЬреВрджрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реИ
  • рдпрд╣ рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ errors.Wrap(err, "context message")
  • рдпрд╣ рдПрдХ рдХреНрд▓реАрди рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдореЗрдВ рдкрд░рд┐рдгрдд рд╣реЛрддрд╛ рд╣реИ: a, b, err := myFunc() рд▓рд╛рдЗрди рдкрд░ рдХреЛрдИ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИ
  • defer fmt.HandleError(&err, "msg") рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • check рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд▓рдкреЗрдЯрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЯреАрдо рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ !!!

@buchanae рдореБрдЭреЗ рдЖрдкрдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рд░рд╛рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдерд╛ рдХрд┐ try рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдЧрд╛, рдЬрдмрдХрд┐ рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓реЗрдЦ рдореЗрдВ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рднреА рдЖрд╕рд╛рди рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдЕрднреА рд╡рд░реНрддрдорд╛рди рд╕реНрддрд░ рдкрд░ рд╡рд╣рд╛рдБ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдБред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВрдиреЗ рдЗрд╕реЗ #32811 . рдкрд░ рднреА рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ

рддреЛ, рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП рдЦреЛрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реА рдореИрдХреНрд░реЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдЗрд╕ рдХрджрд░:

define returnIf(err error, desc string, args ...interface{}) {
    if (err != nil) {
        return fmt.Errorf("%s: %s: %+v", desc, err, args)
    }
}

func CopyFile(src, dst string) error {
    r, err := os.Open(src)
    :returnIf(err, "Error opening src", src)
    defer r.Close()

    w, err := os.Create(dst)
    :returnIf(err, "Error Creating dst", dst)
    defer w.Close()

    ...
}

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕реА рдЕрдЧрд░ рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд/рдЗрдирд▓рд╛рдЗрди рдХреА рдЬрд╛рдПрдЧреАред рд▓рдЪреАрд▓рд╛рдкрди рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╕рдВрдкрд╛рджрдХ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдмрджрд▓ рди рджреЗред рдпрд╣ рдЗрд╕реЗ рдХрдо рдЬрд╛рджреБрдИ рднреА рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╕рд╛рде рд╣реА, рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд▓рд╛рдЗрди рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреА рд╣реИред рдФрд░ рдпрд╣ рдХрд╣рд╛рдВ рд╣реБрдЖ (рд╕рдВрджрд░реНрдн) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рдордиреЗ рдХреЛрд▓рди рднреА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдирд╣реАрдВ рд╣реИред

@ рдПрдирд╡рд┐рдХреНрдЯрд░

рдореИрдВ рдЧреЛ рдЯреАрдо рдХреЛ try рдПрдХ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдмрд┐рд▓реНрдЯ-рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реВрдВрдЧрд╛

рдпрджрд┐ foo рдФрд░ bar рдПрдХ рд╣реА рдЪреАрдЬрд╝ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ try(foo(), bar()) рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛?

рдореИрдВ рдЗрд╕реЗ рдЕрднреА рд╡рд░реНрддрдорд╛рди рд╕реНрддрд░ рдкрд░ рд╡рд╣рд╛рдБ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдБред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВрдиреЗ рдЗрд╕реЗ #32811 . рдкрд░ рднреА рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ

рддреЛ, рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП рдЦреЛрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реА рдореИрдХреНрд░реЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

@рдЪрд┐рд▓реЗрдВрд╕ , рдЖрдИрдПрдордПрдЪрдУ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ (рдФрд░ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ) рдХреА рддрд░рд╣ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рд▓реЛрдЧреЛрдВ рдХреЛ try рдпрд╛ рдЬреЗрдирд░рд┐рдХ рдЬреИрд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рдореМрдХрд╛ рджреЗрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд░реНрд╡реЛрддреНрддрдо рд╡рд┐рдЪрд╛рд░ рдмрди рд╕рдХрддреЗ рд╣реИрдВ рднрд╛рд╖рд╛ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рдд рдХреА рдмрд╣реБрдд рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдРрд╕реА рдЪреАрдЬ рдЬреЛрдбрд╝реА рдЬрд╛рдПрдЧреАред

@jonbodner рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧреЛ рдореЗрдВ рд╣рд╛рдЗрдЬреАрдирд┐рдХ рдореИрдХреНрд░реЛрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдЕрднреА рддрдХ рдХреЛрдИ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрд╡рдЪреНрдЫ рдореИрдХреНрд░реЛрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред #32620

@Allenyn , @buchanae рдХреЗ рдкрд╣рд▓реЗ рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЕрднреА рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛ рд╣реИ:

a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)

рдореИрдВрдиреЗ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдпрд╣ fmt рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП @josharian рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЦреЗрдВ)ред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЗрд╕рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ fmt рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдХреЛ рд╕реАрдзреЗ рдмрд┐рд▓реНрдЯрд┐рди рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реА рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг @eihigh рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рджрд┐рди рдпрд╛ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ @buchanae рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдЬрд┐рд╕рдиреЗ try рдмрд┐рд▓рд┐рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛:

func try(error, optional func(error) error)

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк try рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ:

  • рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рдиреЗрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рдпрд╣ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдореИрдВ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ рдирд╛рдо рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди try рд╡рд╣ рд░реВрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдо рдЬреИрд╕реЗ check рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рд╣рд╛рдпрдХреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрди-рдкреНрд▓реЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ defer рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╕рдорд╛рди рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛ рд░рд╣ рд╕рдХрддрд╛ рд╣реИред

рдмрд╛рдж рдореЗрдВ #32811 ( catch рдПрдХ рдмрд┐рд▓рд┐рди рдХреЗ рд░реВрдк рдореЗрдВ) рдФрд░ #32611 ( on рдХреАрд╡рд░реНрдб рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП on err, <statement> ) рдореЗрдВ рдХреБрдЫ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдП рдЧрдП рдереЗред рд╡реЗ рдЖрдЧреЗ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрдВрдЧреВрдареЗ рдКрдкрд░ рдпрд╛ рдЕрдВрдЧреВрдареЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЙрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдмрджрд▓рд╛рд╡ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕реНрдерд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

@jonbodner рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧреЛ рдореЗрдВ рд╣рд╛рдЗрдЬреАрдирд┐рдХ рдореИрдХреНрд░реЛрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдЕрднреА рддрдХ рдХреЛрдИ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрд╡рдЪреНрдЫ рдореИрдХреНрд░реЛрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред #32620

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХреЛрд░ рдЧреЛ рдЯреАрдо рдореИрдХреНрд░реЛрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рд╣реЛрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрди рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рднрд╛рд╖рд╛ рдХреЛрд░ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдХрдардкреБрддрд▓реА рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рдХрд░реЛ рдпрд╛ рди рдХрд░реЛред рдХреЛрдИ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рд╣реИред"

@jonbodner рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕реНрд╡рдЪреНрдЫ рдореИрдХреНрд░реЛрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рддрд░реНрдХ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрддред рдПрдХ рдЖрдо рдЖрд▓реЛрдЪрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ try рд░рд┐рдЯрд░реНрди рдХреЛ "рдЫреБрдкрд╛" рджреЗрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рд╕рдЦреНрддреА рд╕реЗ рдмрджрддрд░ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдХреНрд░реЛ рдореЗрдВ рдХреБрдЫ рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣рд╛рдЗрдЬреАрдирд┐рдХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддрдм рднреА рд╣рдореЗрдВ рдмрд╣рд╕ рдХрд░рдиреА рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ try рдмреНрд░рд╣реНрдорд╛рдВрдб рдмреНрд▓реЙрдХ рдореЗрдВ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореИрдХреНрд░реЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдирд╣реАрдВред try рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдЬреАрдирд┐рдХ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╡рд┐рд░реЛрдз рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ ;-)

@ngrilly рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдмрд╛рд╣рд░ рд░рд╣реЗрдВ рдФрд░ рджреЗрдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдВред рд░рд╕реНрдЯ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рд╣рдореЗрд╢рд╛ ! (рдпрд╛рдиреА try!(...) рдФрд░ println!(...) ) рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рд╕реНрд╡рдЪреНрдЫ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдФрд░ рджреЗрдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реЛрдВрдЧреЗред рд╣рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд▓реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдПред

@thepudds рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ func(error) error рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд┐рдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА), рд▓реЗрдХрд┐рди рдореБрдЭреЗ try рдХрд╛ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ try рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдХрд░рдг рд╣реИред

@deanveloper рд╣рд╛рдВ, рд░рд╕реНрдЯ рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЕрдВрдд рдореЗрдВ ! рдЪрддреБрд░ рд╣реИред рдпрд╣ рдирд┐рд░реНрдпрд╛рддрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рдЧреЛ рдореЗрдВ рдПрдХ рдЕрдкрд░рдХреЗрд╕ рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ :-)

рдореИрдВ рдЧреЛ рдореЗрдВ рд╣рд╛рдЗрдЬреАрдирд┐рдХ рдореИрдХреНрд░реЛрдЬрд╝ рд╣реЛрдиреЗ рд╕реЗ рд╕рд╣рдордд рд╣реВрдБ рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рд╣рдо рд╕рдВрдХрд▓рди рдЧрддрд┐ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯреВрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрдЯрд┐рд▓ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреЛрдб рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЯреВрд▓ рдХреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП) . рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕ рдмреАрдЪ, рд╢рд╛рдпрдж try рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ try! рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? ;-)

рдПрдХ рд╣рд▓реНрдХрд╛ рд╡рд┐рдЪрд╛рд░: рдпрджрд┐ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП if/for рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдПрдХ рд╣реА рдХрдерди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдмрд╢рд░реНрддреЗ рдпрд╣ рдХрдерди if рдпрд╛ for рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реЛред рдЙрджрд╛рд╣рд░рдг:

fd, err := os.Open("foo")
if err != nil return err

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ error рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИред try рдЗрд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ error рдХреЛ рд╡рд┐рд╢реЗрд╖ рдорд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ рдореИрдВ /bin/sh рдкреНрд░реЗрд░рд┐рдд || рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛:

fd, err := os.Open("foo") || return err

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдЕрд░реНрде рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рдХреЛрдИ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рдХреЛрдб рдЕрд╡реИрдз рд╣реИ, рдХреЛрдИ рднреА рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рд▓реЛрдЧ рднрдпрд╛рд╡рд╣ рд░реВрдк рд╕реЗ рдкреАрдЫреЗ рд╣рдЯ рд░рд╣реЗ рд╣реИрдВред

@bakul if err != nil return err рдореЗрдВ, рдЖрдк рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ err != nil рдХрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдФрд░ рдХрдерди return err рдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ? рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рднрд╛рд╖рд╛ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛, рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред

рдЖрдкрдХрд╛ рджреВрд╕рд░рд╛ рд╡рд┐рдЪрд╛рд░ Zig рдореЗрдВ catch |err| return err рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ "рдбрд░рд╛рд╡рдиреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреАрдЫреЗ рдирд╣реАрдВ рд╣рдЯ рд░рд╣рд╛ рд╣реВрдВ" рдФрд░ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ Zig рдореЗрдВ рдПрдХ try рдХреАрд╡рд░реНрдб рднреА рд╣реИ, рдЬреЛ рдХрд┐ catch |err| return err рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рд╣реИ, рдФрд░ рдЧреЛ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдПрдХ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рдЧрднрдЧ рдмрд░рд╛рдмрд░ рд╣реИред рддреЛ рд╢рд╛рдпрдж try рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рд╣рдореЗрдВ catch рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ? ;-)

@ngrily , рд╡рд░реНрддрдорд╛рди рдореЗрдВ <expr> <statement> рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЕрд╕реНрдкрд╖реНрдЯ рдмрдирд╛ рджреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдирд╛рдЬреБрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдХреЛрд╢рд┐рд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди рд╣реА рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдП) рд╡рд╛рдкрд╕реА рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдмреА) рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдШреЛрдВрд╕рд▓рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕реА) рдпрд╣ рд╢реЗрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ (рдЬреЛ рдЬрд╝рд┐рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ) рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рдХреЛрдИ catch рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдпрд╛ рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдореВрд▓ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрдирд░ рдЬреЛ рдХреБрдЫ рднреА рддрдп рдХрд░рддрд╛ рд╣реВрдВ рдЙрд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рд╣реВрдВред

рдореИрдВрдиреЗ tryhard рдХрд╛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЕрдм рдЗрдирдкреБрдЯ рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреЛ рд░реЗрдкреЛ рдХреА рдиреЛрдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЕрдм рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ:

$ tryhard $HOME/go/src
...
--- stats ---
  55620 (100.0% of   55620) function declarations
  14936 ( 26.9% of   55620) functions returning an error
 116539 (100.0% of  116539) statements
  27327 ( 23.4% of  116539) if statements
   7636 ( 27.9% of   27327) if <err> != nil statements
    119 (  1.6% of    7636) <err> name is different from "err" (use -l flag to list file positions)
   6037 ( 79.1% of    7636) return ..., <err> blocks in if <err> != nil statements
   1599 ( 20.9% of    7636) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
     17 (  0.2% of    7636) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
   5907 ( 77.4% of    7636) try candidates (use -l flag to list file positions)

рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрд╕реНрд╡реАрд░ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рднреА if рдХрдердиреЛрдВ рдореЗрдВ рд╕реЗ 28% рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ; рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рд╣реИред рдЙрди рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪреЛрдВ рдореЗрдВ рд╕реЗ, 77% try рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рджрд╛рдпреА рд╣реЛрдВрдЧреЗред

$ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдбред
--- рдЖрдБрдХрдбрд╝реЗ ---
2930 (2930 рдХрд╛ 100.0%) рд╕рдорд╛рд░реЛрд╣ рдШреЛрд╖рдгрд╛рдПрдБ
1408 (2930 рдХрд╛ 48.1%) рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
10497 (10497 рдХрд╛ 100.0%) рдХрдерди
2265 (10497 рдХрд╛ 21.6%) рдЕрдЧрд░ рдмрдпрд╛рди
1383 (2265 рдХрд╛ 61.1%) рдЕрдЧрд░!= рд╢реВрдиреНрдп рдмрдпрд╛рди
0 (1383 рдХрд╛ 0.0%)рдирд╛рдо "рдЧрд▓рддреА" рд╕реЗ рдЕрд▓рдЧ рд╣реИ (рдЙрдкрдпреЛрдЧ -l рдзреНрд╡рдЬ
рдлрд╝рд╛рдЗрд▓ рдкрджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)
645 (1383 рдХрд╛ 46.6%) рд░рд┐рдЯрд░реНрди ...,if . рдореЗрдВ рдмреНрд▓реЙрдХ!= рд╢реВрдиреНрдп
рдмрдпрд╛рди
738 (1383 рдХрд╛ 53.4%) рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ if . рдореЗрдВ!= рд╢реВрдиреНрдп
рдмрдпрд╛рди; рдХреЛрд╢рд┐рд╢ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХреЗрдВ (рдлрд╝рд╛рдЗрд▓ рдкрджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -l рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)
1 (1383 рдХрд╛ 0.1%) рдЧреИрд░-рд░рд┐рдХреНрдд рдЕрдиреНрдп рдмреНрд▓реЙрдХ if . рдореЗрдВ!= рд╢реВрдиреНрдп
рдмрдпрд╛рди; рдХреЛрд╢рд┐рд╢ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХреЗрдВ (рдлрд╝рд╛рдЗрд▓ рдкрджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -l рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)
638 (1383 рдХрд╛ 46.1%) рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -l рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдкрдж)
$ рдЧреЛ рдореЙрдб рд╡рд┐рдХреНрд░реЗрддрд╛
$ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рд╡рд┐рдХреНрд░реЗрддрд╛
--- рдЖрдБрдХрдбрд╝реЗ ---
37757 (37757 рдХрд╛ 100.0%) рд╕рдорд╛рд░реЛрд╣ рдШреЛрд╖рдгрд╛рдПрдВ
12557 (37757 рдХрд╛ 33.3%) рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
88919 (88919 рдХрд╛ 100.0%) рдмрдпрд╛рди
20143 (88919 рдХрд╛ 22.7%) рдЕрдЧрд░ рдмрдпрд╛рди
6555 (20143 рдХрд╛ 32.5%) рдЕрдЧрд░!= рд╢реВрдиреНрдп рдмрдпрд╛рди
109 (6555 рдХрд╛ 1.7%)рдирд╛рдо "рдЧрд▓рддреА" рд╕реЗ рдЕрд▓рдЧ рд╣реИ (рдЙрдкрдпреЛрдЧ -l рдзреНрд╡рдЬ
рдлрд╝рд╛рдЗрд▓ рдкрджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)
5545 (6555 рдХрд╛ 84.6%) рд░рд┐рдЯрд░реНрди ...,if . рдореЗрдВ рдмреНрд▓реЙрдХ!= рд╢реВрдиреНрдп
рдмрдпрд╛рди
1010 (6555 рдХрд╛ 15.4%) рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ if . рдореЗрдВ!= рд╢реВрдиреНрдп
рдмрдпрд╛рди; рдХреЛрд╢рд┐рд╢ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХреЗрдВ (рдлрд╝рд╛рдЗрд▓ рдкрджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -l рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)
12 (6555 рдХрд╛ 0.2%) рдЧреИрд░-рд░рд┐рдХреНрдд рдЕрдиреНрдп рдмреНрд▓реЙрдХ if . рдореЗрдВ!= рд╢реВрдиреНрдп
рдмрдпрд╛рди; рдХреЛрд╢рд┐рд╢ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХреЗрдВ (рдлрд╝рд╛рдЗрд▓ рдкрджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -l рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)
5427 (6555 рдХрд╛ 82.8%) рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -l рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдкрдж)

рдЗрд╕рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдореИрдХреНрд░реЛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрд▓рди рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЪрд┐рдкрдХ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛ред рдмреЗрд╢рдХ рдХреЛрд▓рди рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╕рд╛рде рд╣реА, рдореИрдХреНрд░реЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЫреБрдкрд╛рддрд╛ рд╣реИред рдЖрдк рдмрд╕ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдХреНрд░реЛ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рд╡рд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдкрдиреЗ рдореИрдХреНрд░реЛ рд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рдЦреЛрдЬ рдХреА рдФрд░ рдХреЛрдб рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдореИрдХреНрд░реЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рд▓реЛрдЧ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдореИрдХреНрд░реЛрдЬрд╝ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдареАрдХ рд╣реИ, рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреЛ рджреЛрд╖ рджреЗрдВред :)

@mirtchovski

$ tryhard .
--- stats ---
   2930 (100.0% of    2930) function declarations
   1408 ( 48.1% of    2930) functions returning an error
  10497 (100.0% of   10497) statements
   2265 ( 21.6% of   10497) if statements
   1383 ( 61.1% of    2265) if <err> != nil statements
      0 (  0.0% of    1383) <err> name is different from "err" (use -l flag to list file positions)
    645 ( 46.6% of    1383) return ..., <err> blocks in if <err> != nil statements
    738 ( 53.4% of    1383) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
      1 (  0.1% of    1383) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
    638 ( 46.1% of    1383) try candidates (use -l flag to list file
positions)
$ go mod vendor
$ tryhard vendor
--- stats ---
  37757 (100.0% of   37757) function declarations
  12557 ( 33.3% of   37757) functions returning an error
  88919 (100.0% of   88919) statements
  20143 ( 22.7% of   88919) if statements
   6555 ( 32.5% of   20143) if <err> != nil statements
    109 (  1.7% of    6555) <err> name is different from "err" (use -l flag to list file positions)
   5545 ( 84.6% of    6555) return ..., <err> blocks in if <err> != nil statements
   1010 ( 15.4% of    6555) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
     12 (  0.2% of    6555) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
   5427 ( 82.8% of    6555) try candidates (use -l flag to list file
positions)
$

@ av86743 ,

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХрд┐ "рдИрдореЗрд▓ рдЙрддреНрддрд░ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ"

рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ рдХрд┐ tryhard рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреЛрдб рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд╕рдЯреАрдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреЛрдб рдореЗрдВ рдЙрддреНрдкрдиреНрди syscall рдкреИрдХреЗрдЬ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╣реЛрддреА рд╣реИ рдФрд░ рдЬреЛ рд╕рдордЧреНрд░ рддрд╕реНрд╡реАрд░ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░ рд╕рдХрддреА рд╣реИред tryhard рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдм рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ "vendor" рд╡рд╛рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдкрде рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ (рдЗрд╕реЗ рдирдП -ignore рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рднреА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЯрд┐рдк рдкрд░ рдПрд╕рдЯреАрдбреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ:

tryhard $HOME/go/src
/Users/gri/go/src/cmd/go/testdata/src/badpkg/x.go:1:1: expected 'package', found pkg
/Users/gri/go/src/cmd/go/testdata/src/notest/hello.go:6:1: expected declaration, found Hello
/Users/gri/go/src/cmd/go/testdata/src/syntaxerror/x_test.go:3:11: expected identifier
--- stats ---
  45424 (100.0% of   45424) func declarations
   8346 ( 18.4% of   45424) func declarations returning an error
  71401 (100.0% of   71401) statements
  16666 ( 23.3% of   71401) if statements
   4812 ( 28.9% of   16666) if <err> != nil statements
     86 (  1.8% of    4812) <err> name is different from "err" (-l flag lists details)
   3463 ( 72.0% of    4812) return ..., <err> blocks in if <err> != nil statements
   1349 ( 28.0% of    4812) complex error handler in if <err> != nil statements; cannot use try (-l flag lists details)
     17 (  0.4% of    4812) non-empty else blocks in if <err> != nil statements; cannot use try (-l flag lists details)
   3345 ( 69.5% of    4812) try candidates (-l flag lists details)

рдЕрдм рд╕рднреА if рдмрдпрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ 29% (28.9%) рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ), рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 70% try (рдереЛрдбрд╝рд╛ рд╕рд╛) рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХрдо)ред

рдмрджрд▓реЗрдВ https://golang.org/cl/185177 рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ: src: apply tryhard -err="" -ignore="vendor" -r $GOROOT/src

@griesemer рдЖрдкрдиреЗ "рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░" рдЧрд┐рдирд╛ рд╣реИ рд▓реЗрдХрд┐рди "рдПрдХрд▓-рдХрдерди рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░" рдирд╣реАрдВред

рдпрджрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ "рдЬрдЯрд┐рд▓" рд╣реИрдВрдбрд▓рд░ рдПрдХ рд╣реА рдХрдерди рд╣реИрдВ, рддреЛ on err #32611 рд╕реЗ рд▓рдЧрднрдЧ рдЙрддрдиреА рд╣реА рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрдЪрдд рд╣реЛрдЧреА рдЬрд┐рддрдиреА try() - 2 рд▓рд╛рдЗрди рдмрдирд╛рдо 3 рд▓рд╛рдЗрди x 70%ред рдФрд░ on err рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╕рдВрдЧрдд рдкреИрдЯрд░реНрди рдХрд╛ рд▓рд╛рдн рдЬреЛрдбрд╝рддрд╛ рд╣реИред

@ рдПрдирд╡рд┐рдХреНрдЯрд░

try рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд╛рдл рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ:
рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд╡рд╛рдЪрд╛рд▓рддрд╛ред

рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рд╡рд░реНрдмреЛрд╕рд┐рдЯреА _a рд╕рдорд╕реНрдпрд╛_ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЧреЛ рдХреА рддрд╛рдХрдд рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝рддрд╛ рд╣реИ: рдПрдХ рд╕рд╛рд▓ рдХреА рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рдХреЛрдб рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдк рдЬреЛ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рдСрдкреНрдЯ-рдЗрди рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рд░реЛрдз рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рджрд┐рдЦрд╛рдпрд╛ рд╣реИ!

рд▓реЗрдЦрди рдХреЗ рд╕рдордп рдЖрдкрдХрд╛ _рдСрдкреНрдЯ- рдЗрди_ рднрд╡рд┐рд╖реНрдп-рдЖрдк рд╕рд╣рд┐рдд рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн

рдпрджрд┐ рдореИрд▓рд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ 'рдПрдХ рдлрд╛рдпрджрд╛' рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рд╛рдБред

try , рдЬрд╛рд╡рд╛ рдФрд░ рд╕реА ++ рдПрдХреНрд╕рдкреИрдЯреНрд╕ рдХреА рдЖрджрддреЛрдВ рдХреЗ рд▓рд┐рдП, рдЬрд╛рджреВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рднреА рдЧреЛрдлрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдмреАрдЪ рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рдХреЛ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрдЦреНрд╢рд╛ рдЧрдпрд╛ (рдЬреИрд╕рд╛ рдХрд┐ tryhard рд░рди рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рд░рд╛рд╕реНрддрд╛ рдЖрд╕рд╛рди onErr рдореИрдХреНрд░реЛ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрд╣реБрдордд рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдЧрд╛:

x, err = fa()
onErr break

r, err := fb(x)
onErr return 0, nil, err

if r, err := fc(x); onErr && triesleft > 0 {
  triesleft--
  continue retry
}

_(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ 'рд▓реАрд╡ if err!= nil рдЕрдХреЗрд▓реЗ' рдХреИрдВрдк рдореЗрдВ рд╣реВрдВ рдФрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЕрдзрд┐рдХ рд╡реНрд╣рд┐рдирд░реНрд╕ рдХреЛ рдЦреБрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред)_

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдореИрдВ рдЧреЛ рдЯреАрдо рдХреЛ try рдПрдХ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдмрд┐рд▓реНрдЯ-рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ
try(outf.Seek(linkstart, 0)), io.Copy(outf, exef)))

~рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЫреЛрдЯрд╛, рдкрдврд╝рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛, рдлрд┐рд╕рд▓рди рдпрд╛ рдЧрд▓рддрдлрд╣рдореА рдХреА рд╕рдВрднрд╛рд╡рдирд╛, рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд╕реНрддрд░ рдкрд░ рдкрд░рддрджрд╛рд░ рдФрд░ рдЦрддрд░рдирд╛рдХред~

рдореИрдВ рдЧрд▓рдд рдерд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╡рд┐рдз try рдШреЛрдВрд╕рд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ:

try( outf.Seek(linkstart, 0),
 io.Copy(outf, exef),
)

рдФрд░ рдкрд╣рд▓реА рдЧрд▓рддреА рдХреЗ рдмрд╛рдж try(тАж) рд╡рд╛рдкрд╕реА рдХрд░реЗрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрднрд╛рд▓ (рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪреАрдиреА) рдХреЛрд╢рд┐рд╢ рдХреА рддрд░рд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдкрдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдЬреИрд╕реЗ рдЕрдореГрдд рдХреЗ рдХрдерди рдХреЗ рд╕рд╛рде: https://www.openmymind.net/Elixirs-With-Statement/

рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рдиреАрдЪреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:

switch a, b, err1 := go_func_01(),
       apple, banana, err2 := go_func_02(),
       fans, dissman, err3 := go_func_03()
{
   normal_func()
else
   err1 -> handle_err1()
   err2 -> handle_err2()
   _ -> handle_other_errs()
}

рдХреНрдпрд╛ "рдЧреЛ рдкреНрд░реЗрдлрд░реЗрдВрд╕ рд▓реЗрд╕ рдлреАрдЪрд░реНрд╕" рдФрд░ "рдЧреЛ рдореЗрдВ рдлреАрдЪрд░реНрд╕ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛" рдХрд╛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ...

рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рдВрддреБрд╖реНрдЯ рд╣реВрдВ

if err != nil {
    return тАж, err
}

рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдирд╣реАрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ ... рдХрд╛рд░рдг рджреЛ рдЧреБрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  1. рдХрднреА-рдХрднреА рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ
  2. try s рдХреЛ рдиреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛рдиреА try( ... try( ... try ( ... ) ... ) ... ) , рдкрдврд╝рдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓

рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдПрд░рд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдердХрд╛рдК рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рд╕рд┐рд░реНрдл рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?

рдареАрдХ рд╣реИ, рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐, рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдЕрдкрдирд╛ "рд╣реИрдВрдбрд▓рд░" рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рддреЛ рд╢рд╛рдпрдж рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЛрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ? рдореИрдВрдиреЗ рдЖрд╕реНрдердЧрд┐рдд рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЧреБрдЧрд▓ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдРрд╕рд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ 16x рд▓рд╛рдЧрдд рдкрд╛рдИ рд╣реИред рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЗрддрдирд╛ рдмреБрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди 4x рдзреАрдореА рдШрдВрдЯреА рдмрдЬрддреА рд╣реИред рдХреБрдЫ рдРрд╕рд╛ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░рди рдЯрд╛рдЗрдо рдХреЛ рджреЛрдЧреБрдирд╛ рдпрд╛ рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@ рдПрд░рд┐рдХ-рд╣реЙрдереЛрд░реНрди рдбрд┐рдлрд░реНрд╕ рдкреНрд░рджрд░реНрд╢рди рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред рдХреЛрд╢рд┐рд╢ рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ defer рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред

@ fabian-f рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдЗрдирд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдЬрд╛ рд░рд╣рд╛ рд╣реИ if err != nil рдмреНрд▓реЙрдХ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВред рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рд╣реЛрдЧрд╛ред

@ рдПрд░рд┐рдХ-рд╣реЙрдереЛрд░реНрди рдбрд┐рдЬрд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:

рдкреНрд░рд╢реНрди: рд░реИрдкрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдзреАрдорд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИ?

рдП: рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕реНрдердЧрд┐рдд рдмрдпрд╛рди рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдорд╣рдВрдЧрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди "рдореИрдиреБрдЕрд▓" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рддреБрд▓рдиреАрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЖрд╕реНрдердЧрд┐рдд рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╕реАрдПрд▓ 171758 рднреА рджреЗрдЦреЗрдВ, рдЬреЛ рд▓рдЧрднрдЧ 30% рддрдХ рдЖрд╕реНрдердЧрд┐рдд рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рдЙрдореНрдореАрдж рд╣реИред

рд░реЗрдбрд┐рдЯ рдкрд░ рд░рд╕реНрдЯ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣рд╛рдВ рджреА рдЧрдИред рд╕рдмрд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ 47:55 . рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реЗрдкреЛ, https://github.com/dpinela/mflg рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛:

--- stats ---
    309 (100.0% of     309) func declarations
     36 ( 11.7% of     309) func declarations returning an error
    305 (100.0% of     305) statements
     73 ( 23.9% of     305) if statements
     29 ( 39.7% of      73) if <err> != nil statements
      0 (  0.0% of      29) <err> name is different from "err"
     19 ( 65.5% of      29) return ..., <err> blocks in if <err> != nil statements
     10 ( 34.5% of      29) complex error handler in if <err> != nil statements; cannot use try
      0 (  0.0% of      29) non-empty else blocks in if <err> != nil statements; cannot use try
     15 ( 51.7% of      29) try candidates

рдЙрд╕ рд░реЗрдкреЛ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдЖрдВрддрд░рд┐рдХ рд╕рдВрдкрд╛рджрдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреЛрдИ I/O рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╣реЛрддреА рд╣реИ - рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡реЗ рд╕реНрдерд╛рди рдЬрд╣рд╛рдВ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реАрдорд┐рдд рд╣реИрдВред рдореИрдВ рдЖрдЧреЗ рдмрдврд╝ рдЧрдпрд╛ рдФрд░ рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛; git diff --stat рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрддрд╛ рд╣реИ:

 application.go                  | 42 +++++++++++-------------------------------
 internal/atomicwrite/write.go   | 35 ++++++++++++++---------------------
 internal/clipboard/clipboard.go | 17 +++--------------
 internal/config/config.go       | 15 +++++++--------
 internal/termesc/term.go        |  5 +----
 render.go                       |  8 ++------
 6 files changed, 38 insertions(+), 84 deletions(-)

( рдпрд╣рд╛рдВ рдкреВрд░реНрдг рдЕрдВрддрд░ред)

"рдЬрдЯрд┐рд▓" рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ 10 рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдореЗрдВ рд╕реЗ 5 рдЖрдВрддрд░рд┐рдХ/рдкрд░рдорд╛рдгреБрд▓реЗрдЦрди/рд▓реЗрдЦрди.рдЧреЛ рдореЗрдВ рдЧрд▓рдд рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИрдВ; рд╡реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП pkg/errors.WithMessage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗред рд░реИрдкрд┐рдВрдЧ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдФрд░ рд╕реНрдердЧрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ред рдореИрдВ рдЗрд╕ рдЕрдВрддрд░ (+14, -21 рд▓рд╛рдЗрдиреЛрдВ) рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖ:

@@ -20,21 +20,20 @@ const (
 // The file is created with mode 0644 if it doesn't already exist; if it does, its permissions will be
 // preserved if possible.
 // If some of the directories on the path don't already exist, they are created with mode 0755.
-func Write(filename string, contentWriter func(io.Writer) error) error {
+func Write(filename string, contentWriter func(io.Writer) error) (err error) {
+       defer func() { err = errors.WithMessage(err, errString(filename)) }()
+
        dir := filepath.Dir(filename)
-       if err := os.MkdirAll(dir, defaultDirPerms); err != nil {
-               return errors.WithMessage(err, errString(filename))
-       }
-       tf, err := ioutil.TempFile(dir, "mflg-atomic-write")
-       if err != nil {
-               return errors.WithMessage(err, errString(filename))
-       }
+       try(os.MkdirAll(dir, defaultDirPerms))
+       tf := try(ioutil.TempFile(dir, "mflg-atomic-write"))
        name := tf.Name()
-       if err = contentWriter(tf); err != nil {
-               os.Remove(name)
-               tf.Close()
-               return errors.WithMessage(err, errString(filename))
-       }
+       defer func() {
+               if err != nil {
+                       tf.Close()
+                       os.Remove(name)
+               }
+       }()
+       try(contentWriter(tf))
        // Keep existing file's permissions, when possible. This may race with a chmod() on the file.
        perms := defaultPerms
        if info, err := os.Stat(filename); err == nil {
@@ -42,14 +41,8 @@ func Write(filename string, contentWriter func(io.Writer) error) error {
        }
        // It's better to save a file with the default TempFile permissions than not save at all, so if this fails we just carry on.
        tf.Chmod(perms)
-       if err = tf.Close(); err != nil {
-               os.Remove(name)
-               return errors.WithMessage(err, errString(filename))
-       }
-       if err = os.Rename(name, filename); err != nil {
-               os.Remove(name)
-               return errors.WithMessage(err, errString(filename))
-       }
+       try(tf.Close())
+       try(os.Rename(name, filename))
        return nil
 }

рдкрд╣рд▓реЗ рдбрд┐рдлрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддрд╛ рд╣реИ - рдореИрдВ рдЗрд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЖрд░рд╛рдо рд╕реЗ рдлрд┐рдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдзрдиреНрдпрд╡рд╛рдж рдПрдХ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП WithMessage рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ nilред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд░реИрдкрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕реБрдЭрд╛рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рджреЛ рдЕрдиреНрдп "рдЬрдЯрд┐рд▓" рд╣реИрдВрдбрд▓рд░ рд░реАрдбрдлреНрд░реЙрдо рдФрд░ рд░рд╛рдЗрдЯ рдЯреВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдереЗ:

var line string
line, err = br.ReadString('\n')
b.lines = append(b.lines, line)
if err != nil {
  if err == io.EOF {
    err = nil
  }
  return
}
func (b *Buffer) WriteTo(w io.Writer) (int64, error) {
    var n int64
    for _, line := range b.lines {
        nw, err := w.Write([]byte(line))
        n += int64(nw)
        if err != nil {
            return n, err
        }
    }
    return n, nil
}

рдпреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рдереЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред

рджреЛ рдЕрдиреНрдп рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдереЗ, рдЬрд╣рд╛рдВ рдореИрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдерд╛ (рдХреЗрд╡рд▓ рдЗрд╕реЗ рд▓рдкреЗрдЯрдХрд░ рдирд╣реАрдВ)ред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рднреА рдЫреЛрдбрд╝ рджрд┐рдпрд╛:

n, err := strconv.ParseInt(s[1:], 16, 32)
if err != nil {
    return Color{}, errors.WithMessage(err, fmt.Sprintf("color: parse %q", s))
}

рдЕрдВрддрд┐рдо рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдерд╛, рдЬреЛ рд╣рдореЗрд╢рд╛ рдПрдХ (рдЧреИрд░-рд╢реВрдиреНрдп) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдереА, рдЗрд╕рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдЗрд╕рдХрд╛ рдЬреНрдпрд╛рджрд╛ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖ:

-func Load() (*Config, error) {
-       c := Config{
+func Load() (c *Config, err error) {
+       defer func() { err = errors.WithMessage(err, "error loading config file") }()
+
+       c = &Config{
                TabWidth:    4,
                ScrollSpeed: 1,
                Lang:        make(map[string]LangConfig),
        }
-       f, err := basedir.Config.Open(filepath.Join("mflg", "config.toml"))
-       if err != nil {
-               return &c, errors.WithMessage(err, "error loading config file")
-       }
+       f := try(basedir.Config.Open(filepath.Join("mflg", "config.toml")))
        defer f.Close()
-       _, err = toml.DecodeReader(f, &c)
+       _, err = toml.DecodeReader(f, c)
        if c.TextStyle.Comment == (Style{}) {
                c.TextStyle.Comment = Style{Foreground: &color.Color{R: 0, G: 200, B: 0}}
        }
        if c.TextStyle.String == (Style{}) {
                c.TextStyle.String = Style{Foreground: &color.Color{R: 0, G: 0, B: 200}}
        }
-       return &c, errors.WithMessage(err, "error loading config file")
+       return c, err
 }

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ - рдЬреИрд╕реЗ рдирдЧреНрди рд╡рд╛рдкрд╕реА - рд▓рдЧрддрд╛ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкрд╛рд▓рди рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реИ; рдЬрдм рддрдХ рдореИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛, рдореИрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ if err != nil рддрдХ рд░рд╣реВрдВрдЧрд╛ред

TL; DR: try рдХреЗрд╡рд▓ рдЗрд╕ рдХреЛрдб рдХреЗ рдХрд╛рдлреА рдЫреЛрдЯреЗ рдкреНрд░рддрд┐рд╢рдд (рд▓рд╛рдЗрди рдХрд╛рдЙрдВрдЯ рджреНрд╡рд╛рд░рд╛) рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

(рдпрд╣рд╛рдБ рдиреЛрдм)ред рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ред рдХреИрд╕рд╛ рд░рд╣реЗрдЧрд╛:

package trytest

import "fmt"

func errorInner() (string, error) {
   return "", fmt.Errorf("inner error")
}

func errorOuter() (string, error) {
   tryreturn errorInner()
   return "", nil
}

func errorOuterWithArg() (string, error) {
   var toProcess string
   tryreturn toProcess, _ = errorOuter()
   return toProcess + "", nil
}

func errorOuterWithArgStretch() (bool, string, error) {
   var toProcess string
   tryreturn false, ( toProcess,_ = errorOuterWithArg() )
   return true, toProcess + "", nil
}

рдпрд╛рдиреА рдЯреНрд░рд╛рдИрд░рд┐рдЯрд░реНрди рд╕рднреА рдорд╛рдиреЛрдВ рдХреА рд╡рд╛рдкрд╕реА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЕрдВрддрд┐рдо рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:
рдорд╛рди, рдЕрдиреНрдпрдерд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд╣реИред

рдЬрд┐рди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ:
-

  • рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЕрдкрдиреА рд▓рд╛рдЗрди рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЧреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкреИрдХ рдХрд░рдирд╛ рдЗрд╕рдХреА рдЦреЛрдЬрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рдзрд╛рдУрдВ рдкрд░ рд╣реИред
  • рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд┐рдзрд┐ рд╣реЛрдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред (рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рдПрдХ рд╢рдмреНрдж рдпрд╛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рдХреБрдЫ рд╡рд░реНрдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА 3 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдШрд░реНрд╖рдг рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рдХреБрдЫ рдкреНрдпрд╛рд░ рдФрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
  • рдХреЛрдИ рднреА рдмрд┐рд▓реНрдЯрд┐рди рдЬреЛ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try ) рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╢рдмреНрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЧреЛ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ (рдореИрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ)ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдВрджрд░реНрдн-рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдореИрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ:
-

  • рдПрдХ reterr _x_ рдХрдерди ( if err != nil { return _x_ } рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛)

рддреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдПрдХ рдЕрдЪреНрдЫреА рдЫреЛрдЯреА, рд╕реНрдкрд╖реНрдЯ рд░реЗрдЦрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

func foo() error {
    a, err := bar()
    reterr err

    b, err := baz(a)
    reterr fmt.Errorf("getting the baz of %v: %v", a, err)

    return nil
}

3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╡реЗ рдЕрдм рд╣реИрдВ:

func foo() error {
    a, err := bar()
    if err != nil {
        return err
    }

    b, err := baz()
    if err != nil {
        return fmt.Errorf("getting the baz of %v: %v", a, err)
    }

    return nil
}

рдЬрд┐рди рдЪреАрдЬреЛрдВ рд╕реЗ рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ:



    • "рднрд╛рд╖рд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдмрджрд▓рд╛рд╡ рд╣реИ"

      рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ, рдпрд╣ рдЬреАрд╡рди рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рд╣реИ рдЬреЛ рдЧреЛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдореЗрд░реЗ рдкрд╛рд╕ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдШрд░реНрд╖рдг рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕реНрд░реЛрдд рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп 4 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

  • "рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛"
    рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдорд░реНрдкрд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рдХрдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЙрддреНрддрд░ рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИ - рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рдХреЗ рдЧреЛ рд▓реЛрдХрд╛рдЪрд╛рд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣реИред рдпрджрд┐ рдЧреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореИрдХреНрд░реЛ рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ, рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ reterr (рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЧреЛ рд▓рд┐рдЦрддрд╛ рд╣реИ рдЙрд╕реЗ рд░рд┐рдЯрд░ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛)ред

@Qhesz рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ:

func foo() error {
    a, err := bar()
    try(err)

    b, err := baz(a)
    try(wrap(err, "getting the baz of %v", a))

    return nil
}

@reusee рдореИрдВ рдЙрд╕ рд╕реБрдЭрд╛рд╡ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдЭрдХрдЭреЛрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЗрд╕ рдкрд░ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдХреЛрд╢рд┐рд╢" рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЬреАрдм рд╢рдмреНрдж рд╣реИред "рдХреЛрд╢рд┐рд╢ (рдХрд╛рд░реНрд░рд╡рд╛рдИ ())" рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ "рдХреЛрд╢рд┐рд╢ (рдореВрд▓реНрдп)" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдареАрдХ рд╣реЛрддрд╛ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╢рдмреНрдж рд╣реЛрддрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ try(wrap(...)) wrap(...) рдкрд╣рд▓реЗ рд╕рд╣реА рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ? рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реЗ рдХрд┐рддрдирд╛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? (рдХреЗрд╡рд▓ if err != nil рдЪрд▓рд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ?)

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ #32611 рднреА рдПрдХ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрд░ рдЧреЛ рдЯреАрдо рдФрд░ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреЛрдиреЛрдВ рдХреА рдХреБрдЫ рдЬреНрдЮрд╛рдирд╡рд░реНрдзрдХ рд░рд╛рдп рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреАрд╡рд░реНрдб рдФрд░ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

@Qhesz рдореИрдВ рдирд╛рдордХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рд╢рд╛рдпрдж check рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╛ рддреЛ "рдЪреЗрдХ (рдХрд╛рд░реНрд░рд╡рд╛рдИ ())" рдпрд╛ "рдЪреЗрдХ (рдЧрд▓рддреА)" рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред

@reusee рдЬреЛ рдереЛрдбрд╝рд╛ рд╡рд┐рдбрдВрдмрдирд╛рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ check рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

7/6/19 рдХреЛ mirtchovski [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

$ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдбред
--- рдЖрдБрдХрдбрд╝реЗ ---
2930 (2930 рдХрд╛ 100.0%) рд╕рдорд╛рд░реЛрд╣ рдШреЛрд╖рдгрд╛рдПрдБ
1408 (2930 рдХрд╛ 48.1%) рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
[...]

рдореИрдВ рдпрд╣рд╛рдБ рд╢рд░рд╛рд░рддреА рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛: рдпрд╣ рд╣реИ рдХрд┐ "рдлрд╝рдВрдХреНрд╢рдВрд╕ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ an
рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐"?

рд▓реБрд╕рд┐рдпреЛред

рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рдкреНрд░рд╢реНрди рдкрд░ рдЕрдВрддрд┐рдо рд╡рд┐рдЪрд╛рд░, рдореИрдВ рдЕрднреА рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ try(err, wrap("getting the baz of %v: %v", a, err)) рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд░реИрдк() рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рддрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЧрд▓рддреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп try(wrap(err, "getting the baz of %v", a)) ред

@Qhesz wrap рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

func wrap(err error, format string, args ...interface{}) error {
    if err == nil {
        return nil
    }
    return fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err)
}

рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ wrap рдЗрдирд▓рд╛рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ wrap рдФрд░ if err != nil рдХреНрд▓реЙрдЬ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

@reusee рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм if err == nil рдерд╛;)

@Qhesz wrap рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

func wrap(err error, format string, args ...interface{}) error {
  if err == nil {
      return nil
  }
  return fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err)
}

рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ wrap рдЗрдирд▓рд╛рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ wrap рдФрд░ if err != nil рдХреНрд▓реЙрдЬ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

%w рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ go рдХреНрд░рд┐рдпрд╛

(рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХрд╛ рдорддрд▓рдм %v...)

рдЗрд╕рд▓рд┐рдП рдЬрдм рдПрдХ рдХреАрд╡рд░реНрдб рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд╕рдВрджреАрджрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рдкрд░ рд╣реЛрддрд╛ рдЕрдЧрд░

  • рдпрд╣ check . рдХреЗ рдмрдЬрд╛рдп try рдерд╛
  • рдЧреЛ рдЯреВрд▓рд┐рдВрдЧ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрдпрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ (рдпрд╛рдиреА рдЗрд╕реЗ рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди 'рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ' рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ, рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди 'рдлрд╝рдВрдХреНрд╢рди' рдХреА рддрд░рд╣ рдирд╣реАрдВред рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди рд╣реИ, рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрдпрд╛рди рдХреЗ рдмрдпрд╛рди рдмрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рддред) рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдХрднреА рднреА рдорд╛рдиреНрдп рдирд╣реАрдВ рдерд╛, рдЬреИрд╕реЗ panic() ред
  • ~ рд╢рд╛рдпрдж рдХреБрдЫ рд╕рдВрдХреЗрддрдХ рдХрд┐ рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП check!(...) рдЬреИрд╕реЗ рд░рд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдПрдХ рдордЬрдмреВрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИ) ~ рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рдЧрдпрд╛

рддрдм рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдФрд░ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдореВрд▓реА рдХреНрд╖рдорд╛рдпрд╛рдЪрдирд╛, рдореБрдЭреЗ рдЕрдм рдХреЗрд╡рд▓ рдЙрд╕ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рдКрдкрд░ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдорд┐рд▓реАрдВ рдЬреЛ рдореИрдВрдиреЗ рдЕрднреА рдХрд╣рд╛ рдерд╛ред

@deanveloper рддрдп, рдзрдиреНрдпрд╡рд╛рджред

@olekukonko @Qhesz %w рдЯрд┐рдк рдореЗрдВ рдирдпрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ: https://tip.golang.org/pkg/fmt/#Errorf

рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред

рдореИрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ Go1 рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: "рдЕрдЪреНрдЫрд╛" рдХреЛрдб рдЬреЛ рд╕рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рджреЛрд╣рд░рд╛рд╡рджрд╛рд░ рд╣реИ; рдФрд░ "рдЦрд░рд╛рдм" рдХреЛрдб рдЬреЛ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдЧрд░-рдЧрд▓рддреА рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рддрд░реНрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдХ рдХреЛрд╢рд┐рд╢ рд╢реИрд▓реА рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдмрдирд╛рдХрд░ рдЗрд╕ рдЕрдЪреНрдЫреЗ рдЕрднреНрдпрд╛рд╕ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦрд░рд╛рдм рдХреЛрдб рдЕрдХреНрд╕рд░ рдлреЙрд░реНрдо рдХрд╛ рд╣реЛрддрд╛ рд╣реИ:

..., _ := might_error()

рдпрд╛ рдХреЗрд╡рд▓

might_error()

рдЬрд╣рд╛рдВ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦрдХ рдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдордп рдЦрд░реНрдЪ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдмрд╕ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╢реВрдиреНрдп-рдкреНрд░рдпрд╛рд╕ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╕реЗ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:

..., XXX := might_error()

рдЬрд╣рд╛рдВ XXX рдПрдХ рдкреНрд░рддреАрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдХрд┐рд╕реА рднреА рддрд░рд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП"ред рдЗрд╕рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХреЛрдб рдирд╣реАрдВ рд╣реИ - рд▓реЗрдЦрдХ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд╛рдорд▓реЗ рд╕реЗ рдЕрд╡рдЧрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред

рдмреЗрд╢рдХ рдпрд╣ returnif handle(err) рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд░реЛрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдиреНрдпреВрдирддрдо рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХреЗ рд╕рд╛рде, рд╕рдВрддреБрд▓рди рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реВрдВред рдореИрдВ рдПрдХ рднрд╛рд░реА рдЧреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрддреА рдЕрдкрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рдФрд░ рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХреЛрдб рд╣реИред рдореИрдВ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдореЗрдВ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рд╕рдореВрд╣ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рд╛рд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЧреЛ-рдЖрдзрд╛рд░рд┐рдд рд╕реЗрд╡рд╛ рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдкрд╣рд▓рд╛ рдЪреЗрдХ-рдЗрди рдХрд╛рдлреА рд╣рдж рддрдХ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреВрдврд╝рд╛ рдЖрджрдореА рд╣реВрдВ, рд╕реА, рдкрд░реНрд▓, рдЬрд╛рд╡рд╛ рдФрд░ рд░реВрдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдорд╛рд░реНрдЧ рд╣реИред рдореЗрд░реЗ рдореБрджреНрджреЗ рдкрд╣рд▓реЗ рднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╡рд╛рдж-рд╡рд┐рд╡рд╛рдж рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рджреЛрд╣рд░рд╛рдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВред

  1. рдЧреЛ рдПрдХ рдЫреЛрдЯреА, рд╕рд░рд▓ рднрд╛рд╖рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдиреЗ рдЕрдкреНрд░рддрд┐рдо рдкрдардиреАрдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИред рдЬрдм рддрдХ рд▓рд╛рдн рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреБрдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рди рд╣реЛ, рдореИрдВ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣реВрдВред рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдлрд┐рд╕рд▓рди рдврд▓рд╛рди рдХреЛ рддрдм рддрдХ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдЙрд╕ рдкрд░ рди рдЪрдврд╝ рдЬрд╛рдП, рддреЛ рдЪрд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрджрдо рдирд╣реАрдВ рдЙрдард╛рддреЗ рд╣реИрдВред
  2. рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рддрд░реНрдХ рд╕реЗ рдореИрдВ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдЖ рдерд╛ред рдореБрдЭреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЕрд╡рд╕рдВрд░рдЪрдирд╛ рдХреЛрдб рдореЗрдВ, "Do A. рдЪреЗрдХ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" рдХреА рддрд░реНрдЬ рдкрд░ рдХреЛрдб рдХреЗ рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рд╢реНрд▓реЛрдХреЛрдВ рдХреА рджреГрд╢реНрдп рд▓рдп рдкрд╕рдВрдж рд╣реИред рдмреА рдХрд░реЗрдВред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ... рдЖрджрд┐" рдХреНрдпреЛрдВрдХрд┐ "рдЪреЗрдХ" рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдкреНрд░рд┐рдВрдЯрдл рдпрд╛ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдбрд╛рд▓рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рд╣реЛрд╢рд┐рдпрд╛рд░ рд╣реЛ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
  3. рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдорд╛рдирддреЗ рд╣реБрдП, "рдХреЛрд╢рд┐рд╢" if err != nil { return } рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ?) рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкрд╕рдВрдж рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдирд╛рдорд┐рдд рдЧрд▓рддреА рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рдЕрдиреБрдкрд╛рдд рд╣реЛрдЧрд╛ рдПрдХрд░рд╕ рд╡реГрджреНрдзрд┐; рдЬреЛ рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИред
  4. рдореБрдЭреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ-рд▓рд╛рдЗрдирд░ рдХреЛ рдЧреЛрдлрдордЯ рдЖрд╢реАрд░реНрд╡рд╛рдж рджреЗрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рдЖрдпрд╛, рд▓реЗрдХрд┐рди рд╕рдВрддреБрд▓рди рдкрд░, рдЖрдИрдбреАрдИ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдЗрд╕ рдкреНрд░рджрд░реНрд╢рди рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рдЕрдкрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдПрдХ-рд▓рд╛рдЗрдирд░ рдбреАрдмрдЧ-рдпрд╣рд╛рдВ рд▓рд╛рдн рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░реЗрдЧрд╛ред
  5. рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдХреБрдЫ рд░реВрдкреЛрдВ рдореЗрдВ "рдХреЛрд╢рд┐рд╢" рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкреЗрд╢реЗ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджрд░рд╡рд╛рдЬрд╛ рдЦреЛрд▓ рджреЗрдЧрд╛, рдЙрд╕реА рддрд░рд╣ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЬрд╛рд╡рд╛ рд╕реНрдЯреНрд░реАрдо рдФрд░ рд╕реНрдкреНрд▓рд┐рдЯрд░реЗрдЯрд░ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рд╣реИред рд╣рдорд╛рд░реЗ рдмреАрдЪ рдХреЗ рдЪрддреБрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдирдХреЗ рдХреМрд╢рд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░реЛрдВ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧреЛ рдЕрдзрд┐рдХ рд╕рдлрд▓ рд░рд╣рд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ, рдЕрдЪреНрдЫреЗ рд╕реНрд╡рдЪреНрдЫ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╕рдореБрджрд╛рдп рдХреЛ рдмрдзрд╛рдИред

рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЕрдкрд░рд┐рдЪрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдпрд╛ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдХреВрджрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИред рдЯреЗрдбрд┐рдпрдо рдХреЗ рдмрд╛рд╡рдЬреВрдж, if err != nil рдкрдврд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдпрджреНрдпрдкрд┐ рд▓рдВрдмрд╡рдд рд╡рд░реНрдмреЛрдЬрд╝, рдореБрд╣рд╛рд╡рд░рд╛ред рдЬреЛ try() рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЙрд╕рдХреА рднрд╛рд╡рдирд╛ рдиреЗрдХ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЧрд▓рдд рд▓рдЧрддреА рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рди рдХреЗ рдЙрдЬрд╛рд▓реЗ рдХреЛ рдмрд╣реБрдд рдЬрд▓реНрджреА рджреЗрдЦ рд░рд╣рд╛ рд╣реИ (рдпрд╛рдиреА рдЗрд╕реЗ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП) xerr рдХреЗ рдмрд╛рдж рдФрд░ рдЬреЗрдирд░рд┐рдХ рдХреЛ 6-12mo рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдореИрд░реАрдиреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рд╛ рд╣реИ)ред

try() рдкреЗрд╢ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕рд╛рд░реНрдердХ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 29% - if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ ~40% if err != nil рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИрдВ)ред рд╕рддрд╣ рдкрд░, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдЬреБрдбрд╝реЗ рдХрдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡реЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред try() рдХреА рд╢реБрд░реВрдЖрдд рд╕реЗ рдЯреНрд░реЗрдбрдСрдлрд╝ рдЕрд░реНрдз-рд╕реВрдХреНрд╖реНрдо рд╡рд┐рд╢реЗрд╖-рдорд╛рдорд▓реЛрдВ рд╕реЗ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЧреЛ рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд░рд▓ рд╣реИ рдФрд░ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╕реА ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рднрд╛рд╖рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдмрдбрд╝реА рдФрд░ рдмрд╛рд░реАрдХ рд╣реЛрддреА рд╣реИ)ред рдорд╛рдирд╕рд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдорд╛рддреНрд░рд╛рддреНрдордХ рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рдорд╛рддреНрд░рд╛рддреНрдордХ рдореАрдЯреНрд░рд┐рдХ ( if err != nil рдХрд╛ рдПрд▓рдУрд╕реА) рдХреЛ рдХрдо рдХрд░рдирд╛ рдирд┐рдЧрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рдЧреЛрд▓реА рд╣реИ (рдпрд╛рдиреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рдХреАрдорддреА рд╕рдВрд╕рд╛рдзрди, рдорд╕реНрддрд┐рд╖реНрдХ-рд╢рдХреНрддрд┐ рдкрд░ рдорд╛рдирд╕рд┐рдХ рдХрд░)ред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ try() рдХреЛ go , defer рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рд╡реЗрд░рд┐рдПрдмрд▓ try() рдХреЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рджреБрдИ рдмрдирд╛рддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЧреЛ рдХреЛрдб рдХреЗ рд╕рднреА рд▓реЗрдЦрдХреЛрдВ рдпрд╛ рдкрд╛рдардХреЛрдВ рдХреЛ рдЧреЛ рдХреЛ рдареАрдХ рд╕реЗ рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдирдП рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдРрд╕рд╛ рдмреЛрдЭ рдкрд╣рд▓реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛ред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рд╣реИрдВ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХреБрдЫ рд░реВрдкреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд░реБрджреНрдз, рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рд╕рдордп рдЕрдзреВрд░рд╛ рд╣реИред рдпрджрд┐ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдереЗ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди, рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдПрд▓рдУрд╕реА рдХреЗ 40% рддрдХ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ, рддреЛ рдЗрди рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкреВрд░реЗ рд╕рдореБрджрд╛рдп рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЬреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреА рд▓рд╛рдЧрдд рдХреЛ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрддрд░ рддрдХ рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИред

рдЧреЛ рдореЗрдВ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖-рдХреЗрд╕ рдирд┐рдпрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдлрд┐рд╕рд▓рди рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдврд▓рд╛рди рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдкрд┐рди рдХрд┐рдП рдЧрдП рдФрд░ рдЕрдирдкрд┐рди рдХрд┐рдП рдЧрдП рдЪрд░ред рдЪрд░ рдХреЛ рдкрд┐рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЪреВрдХ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рд▓реЗрдЦрдХ, рдкрд╛рдардХ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреЗ рдмреАрдЪ рдПрдХ рдмреЗрдореЗрд▓ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ scopelint рдЬреИрд╕реЗ рд▓рд┐рдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рднреА рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрднреА рднреА рдЗрд╕ рдЧреЛрдЪрд╛ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ (рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рд╡реЗ рдЗрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреЛрдЪрд╛ рдЙрдирдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдлрд┐рд╕рд▓ рдЬрд╛рддрд╛ рд╣реИ)ред рдХрд╛рд░реНрдпрд╢реАрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдмрдЧ рдХрд╛ рдирд┐рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдФрд░ рдХрдард┐рди рдХреБрдЫ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЖрдП рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕рднреА рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдорд╛рди рдорд╛рди рдХреЗ рд╕рд╛рде рдкреЙрдкреНрдпреБрд▓реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ)ред try() рд╕реЗ рд╡рд┐рдлрд▓рддрд╛ рдбреЛрдореЗрди рдкрд┐рди рдХрд┐рдП рдЧрдП рдЪрд░ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рдЗрд╕ рдмрд╛рдд рдкрд░ рдкрдбрд╝реЗрдЧрд╛ рдХрд┐ рд▓реЛрдЧ рдХреИрд╕реЗ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред

IMNSHO, xerr рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ if err != nil рд╕реЗ рдмрд╛рдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдЬреАрддрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╕реЗ рдкрд╣рд▓реЗ 6-12mo рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдмреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЪрд╛рд╣рд┐рдПред рдЬреЗрдирд░рд┐рдХ рд╕рдВрднрд╡рддрдГ рдЕрдзрд┐рдХ рд╕рдореГрджреНрдз рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдПрдХ рдирдП рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХреЗ рдХрд╛ рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд░реЗрдЧрд╛ред рдПрдХ рдмрд╛рд░ рдЬрдм рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЙрднрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рддрдм рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА, try() рдпрд╛ рдЬреЛ рднреА рд╣реЛ, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИред

рдореИрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдореГрджреНрдз рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдПрдХ рдмрд╛рд░ рдЬрдм рдЬреЗрдирд░рд┐рдХ рдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП try() рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рдЪрд┐рдВрддрд╛ рдХреЗ рдмрд┐рдВрджреБ рд╣реИрдВ рд╡реЗ рд╣реИрдВ:

  1. try() рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдУрд╡рд░рд╣реЗрдб рд╣реИ рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рдХреЛрдИ рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛ред
  2. err != nil рдореЗрдВ try() рдХреЗ рдХрд▓реНрдкрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмреЗрдХ рдХрд░рдХреЗ, рднрд╛рд╖рд╛ рд╕реНрдЯреИрдХ рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ err рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХ рд░рд╣реА рд╣реИред
  3. рд╕реМрдВрджрд░реНрдп рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ try() рдЬрдмрд░реНрджрд╕реНрддреА рдЪрддреБрд░рд╛рдИ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдЪрддреБрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░ рд╕рдХреЗ рдЬреЛ рдХрд┐ рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╕рдВрдж рд╣реИред рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдорд╛рдирджрдВрдб рд╕реЗ рдЬреБрдбрд╝реА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЛрдВ рдХреА рддрд░рд╣, рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрд╡рд╛рдж рдФрд░ рдЕрдиреБрднрд╡ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдорд╛рдкрдирд╛ рдХрдард┐рди рд╣реИред
  4. switch / case рдХрдердиреЛрдВ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдФрд░ рддреНрд░реБрдЯрд┐ рд▓рдкреЗрдЯрдирд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЕрдЫреВрддрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЪреВрдХ рдЕрд╡рд╕рд░, рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдЕрдЬреНрдЮрд╛рдд-рдЕрдЬреНрдЮрд╛рдд рдХреЛ рдЬреНрдЮрд╛рдд рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдИрдВрдЯ рд╢рд░реНрдореАрд▓рд╛ рд╣реИ -рдЬреНрдЮрд╛рдд (рдпрд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм, рдПрдХ рдЬреНрдЮрд╛рдд-рдЕрдЬреНрдЮрд╛рдд)ред

рдЕрдВрдд рдореЗрдВ, try() рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╛рдВрдз рдореЗрдВ рдПрдХ рдирдП рдмреНрд░реЗрдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреА рдмрд╛рдврд╝ рдХреЛ рд░реЛрдХ рд░рд╣рд╛ рдерд╛ рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рд╕реА ++ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝рдХрд░ рдмрдЪ рдЧрдПред

TL; DR: #nevertry рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрддрдиреА рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдиреА рд╣реИ, "рдЕрднреА рдирд╣реАрдВ, рдЕрднреА рдирд╣реАрдВ, рдФрд░ рдЖрдЗрдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ xerr рдФрд░ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХ рддрдВрддреНрд░ рдореЗрдВ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред "

рдКрдкрд░ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ #32968 рдмрд┐рд▓реНрдХреБрд▓ рдкреВрд░реНрдг рдкреНрд░рддрд┐-рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ try рдореИрдХреНрд░реЛ рдХреЗ рдкрд╛рд╕ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдиреЗ рдХреА рдЦрддрд░рдирд╛рдХ рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдЕрд╕рд╣рдорддрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред #32946 рдХреЗ рд╡рд┐рдкрд░реАрдд рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдЧрдВрднреАрд░ рдЦрд╛рдорд┐рдпреЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ (рдЗрд╕реЗ рджреЗрдЦрдиреЗ, рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХрд╛)ред рдЕрдВрд╢:

  • _ check рдореИрдХреНрд░реЛ рдПрдХ-рд▓рд╛рдЗрдирд░ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрдИ рджреЛрд╣рд░рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ
    рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬрд╛рдВрдЪ рдирд┐рдХрдЯрддрд╛ рдореЗрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред_
  • _рдЗрд╕рдХрд╛ рдирд┐рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИред_

рдбрд┐рдЬрд╛рдЗрди рдмрд╛рдзрд╛рдПрдВ (рдорд┐рд▓реА)

рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИ, рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдШреЛрдВрд╕рд▓рд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдпрд╣ try рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдб рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг

// built-in 'check' macro signature: 
func check(Condition bool) {}

check(err != nil) // explicit catch: label.
{
    ucred, err := getUserCredentials(user)
    remote, err := connectToApi(remoteUri)
    err, session, usertoken := remote.Auth(user, ucred)
    udata, err := session.getCalendar(usertoken)

  catch:               // sad path
    ucred.Clear()      // cleanup passwords
    remote.Close()     // do not leak sockets
    return nil, 0, err // dress before leaving
}
// happy path

// implicit catch: label is above last statement
check(x < 4) 
  {
    x, y = transformA(x, z)
    y, z = transformB(x, y)
    x, y = transformC(y, z)
    break // if x was < 4 after any of above
  }

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЖрдирдВрдж рд▓реЗрдВ!

рдореИрдВрдиреЗ рдЗрд╕ рд╕реВрддреНрд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХреЗ рдЙрддрдирд╛ рдкрдврд╝рд╛ рд╣реИред рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ рдЬреИрд╕реЗ рд╡реЗ рд╣реИрдВред

рдореЗрд░реЗ рдХрд╛рд░рдг:

  1. рдореИрдВ, рдФрд░ рдХрд┐рд╕реА рдХреЛ рднреА рдореИрдВрдиреЗ рд╕рд┐рдЦрд╛рдпрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдХреЛ _ever_ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ
  2. рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХрднреА рднреА рддреНрд░реБрдЯрд┐ рдЬрд╛рд▓ рд╕реЗ рдирд╣реАрдВ рдЪреВрдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрд╕реЗ рддрдм рдФрд░ рд╡рд╣реАрдВ рдХрд░рдирд╛ рд╣реИ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢рд╛рдпрдж рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЧрд▓рдд рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрдо рддреМрд░ рдкрд░, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ try рдирд┐рд░реНрдорд╛рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреЛрдб рдХреА рдХрдИ рд▓рд╛рдЗрдиреЗрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдЧреНрд░рд┐рдо рддреНрд░реБрдЯрд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рдпрд╛рд╕ред

рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд┐рдпрд╛ рд╣реИ), рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЬреЛ рдХреЛрдб рдХреЛ рд▓рдВрдмрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЧреЛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди try рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реИ, рддреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрдЧрд╛ред

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рд╡рдЬрди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреА рдЕрдкрдиреА рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдХрд▓реНрдкрдирд╛ рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ, рдпреЗ рджреЛ рдЕрдиреБрд░реЛрдз рд╣реИрдВ:

рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧреЛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред
...
рдЗрд╕рд▓рд┐рдП рд╣рдо рдбрд┐рдлрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рднреА рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред

рдпрд╣ рдкрд╣рд▓рд╛ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдпрд╣ рд╕рддреНрдп рд╣реИ (рдЖрдк defer рдФрд░ go a panic рднреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдПрдХ рдирдпрд╛ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рдЪрд╛рд░ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝рд╛ рдкреВрдЫрдирд╛ рд╣реИ рдФрд░ рдЬрд╛рдиреЗ рдХреЗ рдЕрд░реНрдердкреВрд░реНрдг рд╕рдордиреНрд╡рдп рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рд╣рд░ рджреВрд╕рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЯреЛрдХрди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИред

рдореЗрд░реА рд╢рд┐рдХрд╛рдпрдд рдХрд╛ рдкреНрд░рддрд┐рд╡рд╛рдж рдпрд╣ рд╣реИ рдХрд┐ defer рдФрд░ go a panic рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╢рд╛рдпрдж рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореЗрд░рд╛ рдХрд╣рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рд╕рд╛рдордВрдЬрд╕реНрдп рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ defer рдФрд░ go рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╕рдВрднрд╡рдд: рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреИрд░-рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ defer рдпрд╛ go рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╡реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдмрд┐рд▓реНрдЯрд┐рди рдХреЛ рдЪрд▓рддреЗ-рдлрд┐рд░рддреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЕрдиреБрдмрдВрдз рд╕реЗ рдЫреВрдЯ рдХреНрдпреЛрдВ рдорд┐рд▓рддреА рд╣реИ?

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ @griesemer рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реМрдВрджрд░реНрдп рд╕рдВрдмрдВрдзреА рд░рд╛рдп рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реМрдВрджрд░реНрдпрд╡рд╛рджреА рд░реВрдк рд╕реЗ рд╡рд┐рджреНрд░реЛрд╣ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдлреА рдЬреЛрдбрд╝ рдирд╣реАрдВ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ:

рд╣рдо рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рд┐рдЧреНрдиреЗрдЪрд░ (рдЫрджреНрдо рдХреЛрдб) рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ

func try(expr) (T1, T2, тАж Tn)

рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреЛрдИ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ (рдЬрд┐рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ)ред рдпрд╣, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ, рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдмрд╛рд░ рдХрд╛ рдореИрдХреНрд░реЛ рд╣реИ (рдпрджрд┐ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛)ред рдЗрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

  1. рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдПрдХ рдмреБрд▓рд╛рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдирд╛ред рд╣рд░ рдмрд╛рд░ рдЬрдм "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐" рд╢рдмреНрдж рдХрд╛ рдкреНрд░рдпреЛрдЧ рдпреБрдХреНрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдПрдХ рдЕрдирдХрд╣рд╛ рдХрд╛рд░реНрдп рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рд╣реИ рдХрд┐ рдПрдХ "рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╣рд░ рджреВрд╕рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп рд╣реЛрддреЗ рд╣реИрдВред рдЖрдИрдИ рд╣рдо рдПрдХ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рдЕрдкрд╡рд╛рдж, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, go рдФрд░ defer рд╣реИрдВ, рдЬреЛ рджреЛрдиреЛрдВ рдХрдЪреНрдЪреЗ рдЯреЛрдХрди рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВред

  2. рд╕рд╛рде рд╣реА рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд▓рдд рдорд┐рд▓рддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ:

func try(R1, R2, ... Rn) ((R|T)1, (R|T)2, ... (R|T)(n-1), ?Rn) 
// where T is the return params of the function that try is being called from
// where `R` is a return value from a function, `Rn` must be an error
// try will return the R values if Rn is nil and not return Tn at all
// if Rn is not nil then the T values will be returned as well as Rn at the end 
  1. рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрд╢рд┐рд╢ рдХреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ try рдХреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
try(arg1, arg2,..., err)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ try рдПрдХ expr рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕реА рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдФрд░, рдЗрд╕ рддрдереНрдп рдХрд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИ, рдХреЗ рдЕрд░реНрде рд╕рдВрдмрдВрдзреА рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рдореЗрд░реА рдЕрдВрддрд┐рдо рд╢рд┐рдХрд╛рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдЯрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд░реНрде рдХреЛ рдФрд░ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдкреНрд░рддрд┐ рдЙрджрд╛рд╕реАрди рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХрднреА-рдХрднреА "рд╕рд╛рдорд╛рдиреНрдп" рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдирд┐рдпрдореЛрдВ рд╕реЗ рдЫреВрдЯ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛, рдЖрджрд┐), рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЫреВрдЯ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ " рд╕рд╛рдорд╛рдиреНрдп" рдирд┐рдпрдо рдЬреЛ рдЧреЛрд▓рд╛рдВрдЧ рдХреЗ рдЕрдВрджрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ try рдПрдХ рдирдИ рдЪреАрдЬ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рдЯреЛрдХрди рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдХрд╛рдлреА рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рджреЛрдиреЛрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрд░реНрдердкреВрд░реНрдг рд╕рд╛рдордВрдЬрд╕реНрдп рдмрдирд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рд╛рдм рдорд┐рд╕рд╛рд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рднрд╛рд╖рд╛ред

рдЕрдЧрд░ рд╣рдо рдПрдХ рдирдпрд╛ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдЪреАрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ- рддреЛ рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдЗрд╕реЗ goto , et al рдЬреИрд╕реЗ рдХрдЪреНрдЪреЗ рдЯреЛрдХрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:

f, err := os.Open("/dev/stdout")
throw err

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЛрдб рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ try рдХреЗ рд╕рд╛рде рд╕рдВрдкреВрд░реНрдг "рд╡реИрдХрд▓реНрдкрд┐рдХ" рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдХрдореА рдХреЛ рднреА рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд1 : defer рдФрд░ go рдорд╛рдорд▓реЛрдВ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреЛрдЯ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдмрд┐рд▓реНрдЯрд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рдЬрдмрдХрд┐ try рдХреЗ рд╕рд╛рде рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд╣рд╛ рдХрд┐ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред

@nathanjsweet рдЖрдк рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ #32611 :-)

@nathanjsweet рдЖрдк рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рднрд╛рд╖рд╛ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде defer рдпрд╛ go рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИ append cap complex imag len make new real ред рдпрд╣ defer рдпрд╛ go рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ unsafe.Alignof unsafe.Offsetof unsafe.Sizeof рдХреЗ рд╕рд╛рде рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдЖрдкрдХреА рд╡реНрдпрд╛рдкрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @nathanjsweet - @ianlancetaylor рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдХрд┐ рдЖрдкрдХреЗ рддрд░реНрдХ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИрдВред рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рджреЛ:

1) рдЖрдк рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд▓реНрдкрдирд╛ рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ try рдХреЗ рд╕рд╛рде go рдФрд░ defer рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ try рдкрд╣рд▓рд╛ рдмрд┐рд▓реНрдЯ-рдЗрди рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдЪ рд╣реИред рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рд╕рдВрдХрд▓рдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, defer append(a, 1) ред рдЕрдиреНрдп рдмрд┐рд▓реНрдЯ-рдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИ рдЬреЛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдлрд░реНрд╢ рдкрд░ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╣реА рдкреНрд░рддрд┐рдмрдВрдз рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП try рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ (рд╕рд┐рд╡рд╛рдп рдЬрдм try рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред (рдЬрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ рд╣рдордиреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЗрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдВрдкреВрд░реНрдг рд╣реИ - рд╡реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдпрджрд┐ рдЖрдк рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдареАрдХ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдо try рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ go defer try go рдФрд░ defer рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИред)

2) рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ try "рд╕реМрдВрджрд░реНрдпрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╡рд┐рджреНрд░реЛрд╣реА" рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдк рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдореЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред new , make , append , unsafe.Offsetof рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдЗрди рд╕рднреА рдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред unsafe.Offsetof рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рдХреА рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!) рдХрд┐ рд╣рдореЗрдВ try рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХрд▓ рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) error рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЬреЛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ error рд▓реМрдЯрд╛рддрд╛ рд╣реИ)ред рд╣рдо рдЙрди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдореМрдЬреВрджрд╛ рдФрдкрдЪрд╛рд░рд┐рдХрддрд╛ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ - рдпрджрд┐ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдкрдбрд╝реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЙрдирдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдЧрджреНрдп рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╛рдиреА _why_ рд╡реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рд╣реИрдВ рдЬреЛ _are_ рдЧреЛ рдореЗрдВ рдПрд╕реНрдХреЗрдк рд╣реИрдЪ, рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛, рдкрд╣рд▓реЗ рджрд┐рди рд╕реЗред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред

3) рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣ рднреА рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм try рдХреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ): рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ try рдПрдХ (рдПрдХ) рдЖрдиреЗ рд╡рд╛рд▓реА рддрд░реНрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

4) рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ "рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд░реНрде рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ"ред рдЧреЛ рдХрд╣реАрдВ рднреА рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдкреВрд░реА рдЖрдЬрд╛рджреА рд╣реИред

рдзрдиреНрдпрд╡рд╛рджред

@griesemer

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрдврд╝рдХрд░ рдореИрдВ рд╣реИрд░рд╛рди рд░рд╣ рдЧрдпрд╛ред

рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ "рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЕрд░реНрдердкреВрд░реНрдг рдЕрд░реНрде рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ"ред рдЧреЛ рдХрд╣реАрдВ рднреА рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдкреВрд░реА рдЖрдЬрд╛рджреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдмрд┐рдВрджреБ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ "рдЧреЛ" рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ (рдЬреЛ рдХреБрдЫ рд░реЙрдм рдкрд╛рдЗрдХ рдмрд╣реБрдд рдХреБрдЫ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд╣рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ try рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рдмрд┐рд▓реНрдЯрд┐рди рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдпрдо рддреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ:

  1. рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐-рд╕рд╣рдЬред рдпрд╣ рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рддрд░реНрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдХреЛ рдЦреЛрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ panic рдФрд░ os.Exit рдХрд░рддреЗ рд╣реИрдВ)
  2. рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓рд┐рдВрдЧ рдХрдиреНрд╡реЗрдВрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдПрдХ рдирдпрд╛ рдЕрдкрд╡рд╛рджред рдЖрдкрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ unsafe.Offsetof рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛ , рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рднрд┐рдиреНрди рд╡рд╛рдХреНрдп-рд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред unsafe.Offsetof рдХреЛ рдПрдХ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ try рдХреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╣рд░ рджреВрд╕рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА (рдпрд╛рдиреА try(os.Open("/dev/stdout")) ) рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╣рд░ рджреВрд╕рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬрдм рддрдХ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ try(os.Open("/dev/stdout")...) рдЬреИрд╕рд╛ рди рджрд┐рдЦреЗ)ред

@nathanjsweet рдиреЗ рд▓рд┐рдЦрд╛:

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрдврд╝рдХрд░ рдореИрдВ рд╣реИрд░рд╛рди рд░рд╣ рдЧрдпрд╛ред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ "рдирд┐рд╖реНрдХрд░реНрд╖" рдЦрдВрдб рдореЗрдВ рд╣реИ:

рдЧреЛ рдореЗрдВ, рдмрд┐рд▓реНрдЯ-рдЗрди рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХреА рднрд╛рд╖рд╛ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЕрдирд┐рдпрдорд┐рдд рд╣реИ рд▓реЗрдХрд┐рди рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕рд╣реА рдирд╣реАрдВ рдард╣рд░рд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ ;-)

@ngrily рдореЗрд░рд╛ рдорддрд▓рдм рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдореЗрд░рд╛ рдорддрд▓рдм рдЧреЛ рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдЖрднрд╛рд╕ рд╣реБрдЖ рдХрд┐ @griesemer рдХрд╣ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЧреЛ рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╕реНрдкреЗрдХ рдХреЙрд▓ рдмрд┐рд▓рд┐рди рд╕рд┐рдВрдЯреЗрдХреНрдЯрд┐рдХ рдХрдиреНрд╡реЗрдВрд╢рди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

@рдирд╛рдердирдЬрд╕реНрд╡реАрдЯ

рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐-рд╕рд╣рдЬред рдпрд╣ рдкрд╣рд▓рд╛ рдлрдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрдВрдЯреНрд░реЛрд▓ рдлреНрд▓реЛ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдХреЛ рдЦреЛрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ рдкреИрдирд┐рдХ рдФрд░ os.Exit do)

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ os.Exit рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧреА рдЕрд░реНрде рдореЗрдВ рдвреЗрд░ рдХреЛ рдЦреЛрд▓ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЖрд╕реНрдердЧрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд▓рд╛рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддреБрд░рдВрдд рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ os.Exit рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЬреАрдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ panic рдФрд░ try рджреЛрдиреЛрдВ рдЖрд╕реНрдердЧрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреИрдХ рдХреА рдпрд╛рддреНрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ os.Exit рдЕрдЬреАрдм рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред os.Exit рд╕рднреА рдЧреЛрд░реЛрдЗрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ; рдХреЗрд╡рд▓ os.Exit рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЧреЛрд░реМрдЯрд╛рдЗрди рдХреЗ рдЖрд╕реНрдердЧрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдпрд╛ рддреЛ рд╕рднреА рд╕реНрдердЧрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреЛрдИ рднреА рдирд╣реАрдВред рдФрд░ рдХрд┐рд╕реА рдХреЛ рднреА рдЪрд▓рд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рд╣рдорд╛рд░реЗ рдХреЛрдбрдмреЗрд╕ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд tryhard рдФрд░ рдпрд╣реА рд╣рдореЗрдВ рдорд┐рд▓рд╛:

--- stats ---
  15298 (100.0% of   15298) func declarations
   3026 ( 19.8% of   15298) func declarations returning an error
  33941 (100.0% of   33941) statements
   7765 ( 22.9% of   33941) if statements
   3747 ( 48.3% of    7765) if <err> != nil statements
    131 (  3.5% of    3747) <err> name is different from "err"
   1847 ( 49.3% of    3747) return ..., <err> blocks in if <err> != nil statements
   1900 ( 50.7% of    3747) complex error handler in if <err> != nil statements; cannot use try
     19 (  0.5% of    3747) non-empty else blocks in if <err> != nil statements; cannot use try
   1789 ( 47.7% of    3747) try candidates

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ (1.13 рд╕реЗ рдкрд╣рд▓реЗ) рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ, рд╣рдордиреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬреЛ error рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ foo.Error рдХреЗ рдмрдЬрд╛рдп error foo.Error рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ error , рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рдпреЗ рдкрд░рд┐рдгрд╛рдо "рдЙрдЪрд┐рдд" рдирд╣реАрдВ рд╣реИрдВред

рдореИрдВ "рд╣рд╛рдБ! рдЪрд▓реЛ рдпрд╣ рдХрд░рддреЗ рд╣реИрдВ" рдХреЗ рд╢рд┐рд╡рд┐рд░ рдореЗрдВ рдерд╛, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 1.13 рдпрд╛ 1.14 рдмреАрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рдпреЛрдЧ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ _" 47.7% ... рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ"_ рд╕реЗ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВред рдЕрдм рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ 2 рддрд░реАрдХреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреЙрдЗрдВрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ 2 рддрд░реАрдХреЗ рднреА рд╣реИрдВ ( new(Foo) рдмрдирд╛рдо &Foo{} ) рдФрд░ рд╕рд╛рде рд╣реА make([]Foo) рдФрд░ []Foo{} рдХреЗ рд╕рд╛рде рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдпрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рдиреЗ рдХреЗ 2 рддрд░реАрдХреЗ рднреА рд╣реИрдВред .

рдЕрдм рдореИрдВ "рдЪрд▓реЛ _try_ рдпрд╣" рдХреЗ рд╢рд┐рд╡рд┐рд░ рдореЗрдВ рд╣реВрдВ: ^) рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╕рдореБрджрд╛рдп рдХреНрдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реИред рд╢рд╛рдпрдж рд╣рдо рдЕрдкрдиреЗ рдХреЛрдбрд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЛ рдЖрд▓рд╕реА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рджреЗрдВрдЧреЗ рдФрд░ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдареАрдХ рд╣реИ рдЕрдЧрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ xerrors impl рд╕реЗ рдмреЗрд╣рддрд░ рд╕рдВрджрд░реНрдн рдорд┐рд▓рддрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж, @Goodwine рдЕрдзрд┐рдХ рдареЛрд╕ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП!

(рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдХрд▓ рд░рд╛рдд tryhard рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ "рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░" рдЧрд┐рдирддреА рдХреЛ рджреЛ рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ: рдЬрдЯрд┐рд▓ рд╣реИрдВрдбрд▓рд░, рдФрд░ рдлреЙрд░реНрдо рдХреА рд╡рд╛рдкрд╕реА return ..., expr рдЬрд╣рд╛рдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдорд╛рди <err> рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред)

рдЗрд╕ рдЕрдЬреАрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рддрд░реНрдХ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╡рд┐рдз рд╣реЛрдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдЬрд┐рд╕рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рд▓реЛрдЧ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдмрджрд▓реЗрдЧреА рд╡рд╣ рд╣реИ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд┐рдзрддрд╛ ... ред рдИрдЬреА:

try(os.Open("/dev/stdout")...)

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреЛ рд▓реЛрдЧ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рд╕реНрдерд┐рддрд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

f, err := os.Open("/dev/stdout")
try(WrapErrorf(err, "whatever wrap does: %v"))

рдПрдХ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ try рд╢рдмреНрдж рдХреЛ рдХрдо рдЙрдкрдпреБрдХреНрдд рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рд░рдЦрддрд╛ рд╣реИред

@nathanjsweet рдиреЗ рд▓рд┐рдЦрд╛:

рдореЗрд░рд╛ рдорддрд▓рдм рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдореЗрд░рд╛ рдорддрд▓рдм рдЧреЛ рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣реИред

рдпрд╣рд╛рдБ рд╡реЗ рдЕрдВрд╢ рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдЦреЛрдЬ рд░рд╣реЗ рдереЗ:

"рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рд╡рд░рдг" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ:

рдмрдпрд╛рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ: append cap complex imag len make new real unsafe.Alignof unsafe.Offsetof unsafe.Sizeof

"рдЧреЛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕" рдФрд░ "рдбреЗрдлрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕" рд╕реЗрдХреНрд╢рди рдореЗрдВ:

рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдХреЙрд▓ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИрдВред

"рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ:

рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдорд╛рдирдХ рдЧреЛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдХреЗрд╡рд▓ рдХреЙрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ; рдЙрдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@nathanjsweet рдиреЗ рд▓рд┐рдЦрд╛:

рдореБрдЭреЗ рдпрд╣ рдЖрднрд╛рд╕ рд╣реБрдЖ рдХрд┐ @griesemer рдХрд╣ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЧреЛ рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╕реНрдкреЗрдХ рдХреЙрд▓реНрд╕ рдмрд┐рд▓рд┐рди рд╕рд┐рдВрдЯреЗрдХреНрдЯрд┐рдХ рдХрдиреНрд╡реЗрдВрд╢рди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЧреЛ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдХрдиреНрд╡реЗрдВрд╢рди (рдХреЛрд╖реНрдардХ, рддрд░реНрдХреЛрдВ рдХреЗ рдмреАрдЪ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо, рдЖрджрд┐) рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддреЗ рд╣реИрдВред рд╡реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЙрди рдЪреАрдЬреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред

@nathanjsweet рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХ рдирд┐рд░реАрдХреНрд╖рдг рдерд╛) рд▓реЗрдХрд┐рди рдпрд╣ try рдХреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред https://go-review.googlesource.com/c/proposal/+/181878 рджреЗрдЦреЗрдВред

рдЖрдо рддреМрд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреА рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рдЧрд▓рдд рдЪреАрдЬрд╝ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ: try рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧреИрд░-рдореБрджреНрджрд╛ рд╣реИрдВ - рд╡рд╕реНрддреБрддрдГ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рд╣реЛрддреЗ рд╣реИрдВред

@griesemer рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд╛рди рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

@nathanjsweet рдпрд╣рд╛рдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:

рдирд┐рд╖реНрдХрд░реНрд╖ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ рдЬреЛ рдЧреЛ рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрдиреНрд╕ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рдореБрдЦрддрд╛ рд╕реЗ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред

try рдмрд┐рд▓реНрдЯ-рдЗрдиреНрд╕ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдкрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рд╣рд╛рдВ, unsafe.Offsetof рдЗрд╕рдХреЗ рддрд░реНрдХ рдкрд░ рдЬреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ $#$2 try #$ рд╕реЗ рднрд┐рдиреНрди рд╣реИред рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рдЙрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВред try рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧреЛ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд┐рдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдлреНрд░рдВрдЯ-рдПрдВрдб рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреВрд▓ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореБрдЭреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рддрдХрдиреАрдХреА рдХрд╛рд░рдг рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред

@griesemer рдирд╡реАрдирддрдо _tryhard_ "рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░" рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди "рдПрдХрд▓-рдХрдерди рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░" рдирд╣реАрдВред рдХреНрдпрд╛ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@networkimprov рд╕рд┐рдВрдЧрд▓-рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдПрд░рд░ рд╣реИрдВрдбрд▓рд░ рдХреНрдпрд╛ рд╣реИ? рдПрдХ if рдмреНрд▓реЙрдХ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рдВрдЧрд▓ рдиреЙрди-рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ?

@griesemer , рдПрдХ рд╕рд┐рдВрдЧрд▓-рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдПрд░рд░ рд╣реИрдВрдбрд▓рд░ рдПрдХ if err != nil рдмреНрд▓реЙрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╕рд╣рд┐рдд _any_ рд╕рд┐рдВрдЧрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реЛрддрд╛ рд╣реИред

@networkimprov рд╣реЛ рдЧрдпрд╛ред "рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рд╣реИрдВрдбрд▓рд░" рдЕрдм "рдПрдХрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдлрд┐рд░ рдмреНрд░рд╛рдВрдЪ" рдФрд░ "рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рдлрд┐рд░ рдмреНрд░рд╛рдВрдЪ" рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛ рдЧрдП рд╣реИрдВред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЗ рдЧрдгрдирд╛ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрди рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рднреА if рдХрдерди рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХрд┐рд╕реА рднреА рдЪрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ -err="" рдЬреЛ рдЕрдм tryhard рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ tryhard рдЬрдЯрд┐рд▓ рдпрд╛ рдПрдХрд▓-рдХрдерди рд╣реИрдВрдбрд▓рд░ рдЕрд╡рд╕рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, archive/tar/common.go , рд▓рд╛рдЗрди 701 рджреЗрдЦреЗрдВред

@networkimprov tryhard рдЕрдм рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдЧрдгрдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ try рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред try рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдПрдХрд▓ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдЕрд╡рд╕рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдм рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реИ (рдФрд░ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 50% рдХрдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓ then рд╕реЗ рдкрд╣рд▓реЗ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рд╢рд╛рдЦрд╛ рдХреЛ рддрдм рддрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ if рдореЗрдВ <varname> != nil рдЪреЗрдХ рд╢рд╛рдорд┐рд▓ рдерд╛, рдЪрд╛рд╣реЗ рдЙрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдпрд╛ рдирд╣реАрдВ)ред

рдЕрдЧрд░ рдХреЛрдИ try рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рд╣рд╛рдереЛрдВ рдореЗрдВ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдПрдХ WASM рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдмрдирд╛рдпрд╛ рд╣реИ:

https://ccbrown.github.io/wasm-go-playground/experimental/try-builtin/

рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реВрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреЛ рдлреЛрд░реНрдХ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ/рдЕрдк-рдЯреВ-рдбреЗрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ: https://github.com/ccbrown/go/pull/1

рдореБрдЭреЗ 'рдХреЛрд╢рд┐рд╢' рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдЧрд▓рддреА рдХреА рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: = рдмрдирд╛рдо = рдЧрд▓рддреА рдХреЗ рд╕рд╛рде, рдбрдмреНрд▓реНрдпреВ/рд╕рдВрдмрдВрдзрд┐рдд рдЖрдпрд╛рдд рдХреЗ рд╕рд╛рде, рдирд┐рдпрдорд┐рдд рд╡реНрдпрд╛рдХреБрд▓рддрд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рд╛рде рд╣реА, рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдмрдирд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛, рджреЛ рдорд╛рдорд▓реЛрдВ рдХреА рддрд░рд╣, рдПрдХ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕ рдкрд░ рдЕрднрд┐рдирдп рдХрд┐рдП рдмрд┐рдирд╛ рдЧрд▓рддреА рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рджреВрд╕рд░рд╛ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ

рдореИрдВ рдПрдХ рдЫреЛрдЯреА рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл tryhard рднрд╛рдЧрд╛, рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ред рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ 3 рд╕рд░реНрд╡рд░ ("рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ", рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ, рдПрдХ рдХреНрд░реЙрд▓рд░ рдЬреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдХреНрд░реЙрди рдЬреЙрдм рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЯреВрд▓ред рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рднреА рд╣реИрдВред (рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рд╡рд┐рднрд┐рдиреНрди рдЯреБрдХрдбрд╝реЗ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзрд╛ рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рд╣реИ)

рдпрд╣рд╛рдБ рдЖрдБрдХрдбрд╝реЗ рд╣реИрдВ:

--- stats ---
    370 (100.0% of     370) func declarations
    115 ( 31.1% of     370) func declarations returning an error
   1159 (100.0% of    1159) statements
    258 ( 22.3% of    1159) if statements
    123 ( 47.7% of     258) if <err> != nil statements
     64 ( 52.0% of     123) try candidates
      0 (  0.0% of     123) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
     54 ( 43.9% of     123) { return ... zero values ..., expr }
      2 (  1.6% of     123) single statement then branch
      3 (  2.4% of     123) complex then branch; cannot use try
      1 (  0.8% of     123) non-empty else branch; cannot use try

рдХреБрдЫ рдЯрд┐рдкреНрдкрдгреА:
1) рдЗрд╕ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╕рднреА if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдореЗрдВ рд╕реЗ 50% рдПрд░рд░-рдЪреЗрдХрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рдереЗ, рдФрд░ try рдЙрдирдореЗрдВ рд╕реЗ рдЖрдзреЗ рдХреЛ рд░рд┐рдкреНрд▓реЗрд╕ рдХрд░ рд╕рдХрддреЗ рдереЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ (рдЫреЛрдЯрд╛) рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╕рднреА if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдХрд╛ рдПрдХ рдЪреМрдерд╛рдИ $#$5 try #$ рдХрд╛ рдЯрд╛рдЗрдк-рдЖрдЙрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред

2) рдореБрдЭреЗ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдЖрдВрддрд░рд┐рдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рд╛ рдЧрдпрд╛ ( status.Annotate ) рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреАрдЖрд░рдкреАрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЛрдбред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк RPC рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ PERMISSION_DENIED рдХреЗ рд╕рдВрдмрджреНрдз рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЕрднреА рднреА PERMISSION_DENIED рдХрд╛ рд╕рдВрдмрджреНрдз рд╕реНрдерд┐рддрд┐ рдХреЛрдб рд╣реЛрдЧрд╛ (рдФрд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЙрд╕ рд╕рдВрдмрджреНрдз рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЛ рд╕рднреА рдПрдХ рдЖрд░рдкреАрд╕реА рд╣реИрдВрдбрд▓рд░ рддрдХ, рддреЛ рдЖрд░рдкреАрд╕реА рдЙрд╕ рд╕рдВрдмрджреНрдз рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛)ред рдореИрдВрдиреЗ рдЗрд╕ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдХрд▓реНрдк рд▓рд┐рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ 50% рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд┐рдпрд╛ред ( tryhard рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ 10% рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдереА)ред

3) status.Annotate nil рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ (рдпрд╛рдиреА status.Annotatef(err, "some message: %v", x) nil iff err == nil рд▓реМрдЯрд╛рдПрдЧрд╛)ред рдореИрдВрдиреЗ рдкрд╣рд▓реА рд╢реНрд░реЗрдгреА рдХреЗ рд╕рднреА рдЧреИрд░-рдкреНрд░рдпрд╛рд╕ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рджреЗрдЦрд╛, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдВрдЧреЗ:

```
// Before
enc, err := keymaster.NewEncrypter(encKeyring)                                                     
if err != nil {                                                                                    
  return status.Annotate(err, "failed to create encrypter")                                        
}

// After
enc, err := keymaster.NewEncrypter(encKeyring)                                                                                                                                                                  
try(status.Annotate(err, "failed to create encrypter"))
```

To be clear, I'm not saying this transformation is always necessarily a good idea, but it seemed worth mentioning since it boosts the count significantly to a bit under half of all `if` statements.

4) defer -рдЖрдзрд╛рд░рд┐рдд рддреНрд░реБрдЯрд┐ рдПрдиреЛрдЯреЗрд╢рди try рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд▓рдЧрддрд╛ рд╣реИ, рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ try рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЪреВрдВрдХрд┐ рдореИрдВ рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдХреИрд▓реА-рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЬреАрдЖрд░рдкреАрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреЛрдб рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рддрд░рд╣ рджреЗрдЦреЗ:

```
resp, err := s.someClient.SomeMethod(ctx, req)
if err != nil {
  return ..., status.Annotate(err, "failed to call SomeMethod")
}
```

This is actually a bit redundant in retrospect, since gRPC already prefixes its errors with something like "/Service.Method to [ip]:port : ".

There was also code that called standard library functions using the same pattern:

```
hreq, err := http.NewRequest("GET", targetURL, nil)
if err != nil {
  return status.Annotate(err, "http.NewRequest failed")
}
```

In retrospect, this code demonstrates two issues: first, `http.NewRequest` isn't calling a gRPC API, so using `status.Annotate` was unnecessary, and second, assuming the standard library also return errors with callee context, this particular use of error annotation was unnecessary (although I am fairly certain the standard library does not consistently follow this pattern).

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрднреНрдпрд╛рд╕ рдерд╛ рдФрд░ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ред

рдПрдХ рдмрд╛рдд, @griesemer : рдХреНрдпрд╛ tryhard рдореЗрдВ "рдЧреИрд░-рдкреНрд░рдпрд╛рд╕ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ" рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣рд░ рд╣реИ?
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдиреАрдЪреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдЧрдпрд╛, рдореИрдВрдиреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рдерд╛, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдПрдХ рд╕рд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред

@balasanjay рдЖрдкрдХреА рддрдереНрдп-рдЖрдзрд╛рд░рд┐рдд рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж; рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реИред

tryhard рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: "рдЧреИрд░-рдкреНрд░рдпрд╛рд╕ рдЙрдореНрдореАрджрд╡рд╛рд░" (рдмреЗрд╣рддрд░ рд╢реАрд░реНрд╖рдХ рд╕реБрдЭрд╛рд╡ рд╕реНрд╡рд╛рдЧрдд рд╣реИ) рдХреЗрд╡рд▓ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ if рдХрдерди "рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ" рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдиреА , рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддреНрд░реБрдЯрд┐ рдЪрд░ <err> рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛, рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реНрд░реЛрдд рдореЗрдВ if <err> != nil рдЪреЗрдХ), рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ if рдмреНрд▓реЙрдХ рдореЗрдВ рдХреЛрдбред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, "рдЧреИрд░-рдкреНрд░рдпрд╛рд╕ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ" рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдпреЗ if рдХрдерди рд╣реИрдВ рдЬрд┐рдирдореЗрдВ return рдХрдерди рд╣реИ рдЬреЛ рдЕрдВрдд рдореЗрдВ <err> рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, if рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ return (рдпрд╛ рдЕрдиреНрдп) рдХрдерди рдХреЗ рд╕рд╛рде рдмрдпрд╛рди, "рддрддреНрдХрд╛рд▓реАрди" рд╢рд╛рдЦрд╛ рдореЗрдВ рдХрдИ рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде if рдмрдпрд╛рди, рдФрд░ if рдХреЗ рд╕рд╛рде рдмрдпрд╛рди рдЧреИрд░-рд░рд┐рдХреНрдд else рд╢рд╛рдЦрд╛ред рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ if рдХрдердиреЛрдВ рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рд╢рд░реНрддреЗрдВ рдПрдХ рд╕рд╛рде рд╕рдВрддреБрд╖реНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпреЗ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдХреЗрд╡рд▓ рдЬреБрдбрд╝рддреА рдирд╣реАрдВ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рджреЗрдирд╛ рд╣реИ рдХрд┐ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП try рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖред

рдореИрдВрдиреЗ рдЖрдЬ рдЗрд╕рдореЗрдВ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рд╕рдорд╛рдпреЛрдЬрди рдХрд┐рдП рд╣реИрдВ (рдЖрдкрдиреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛рдпрд╛)ред рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ, рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рднрд▓реЗ рд╣реА рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╢рд╛рдорд┐рд▓ рди рд╣реЛ, рдЬреЛ рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдФрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП, try рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдЗрди рдкрд░рд┐рд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрджрд▓реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ try рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╢рд░реНрддреЗрдВ рд╕рдорд╛рди рдмрдиреА рд╣реБрдИ рд╣реИрдВред

рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдФрд░/рдпрд╛ рдХреНрдпрд╛ рдорд╛рдкрдирд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдпрд╣ рд╕реБрдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред рдореИрдВрдиреЗ рд╕рдореБрджрд╛рдп рдлрд╝реАрдбрдмреИрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рд╕рдорд╛рдпреЛрдЬрди рдХрд┐рдП рд╣реИрдВред рдзрдиреНрдпрд╡рд╛рджред

@subfuzion рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рд╣рдо рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреГрдкрдпрд╛ https://github.com/golang/go/issues/32437#issuecomment-501878888 рджреЗрдЦреЗрдВред рдзрдиреНрдпрд╡рд╛рджред

рдкрд░рд┐рдгрд╛рдо рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЧрд┐рдиреЗ рдЬрд╛рдиреЗ рдХреЗ рд╣рд┐рдд рдореЗрдВ:

рдореЗрд░реА рдЯреАрдо рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд░реЙрдм рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд try рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХ рдЙрдЪрд┐рдд рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рд╕реНрддрд░ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдмрд┐рд▓реНрдЯрд┐рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рддрдХ рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреИрдХреЗрдЬ рдПрдХ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реЛрдЧрд╛ред рдЕрдЧрд░ try рднрд╛рд╖рд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдЖрддрд╛ рд╣реИ рддреЛ рд╣рдо рдЗрд╕реЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВрдЧреЗред

рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдиреЛрдЯ рдкрд░, рдЧреЛ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реНрдерд┐рд░ рдореВрд▓ рднрд╛рд╖рд╛ рдФрд░ рдПрдХ рдмрд╣реБрдд рд╕рдореГрджреНрдз рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рднрд╛рд╖рд╛ рдЯреАрдо рдЬрд┐рддрдиреА рдзреАрдореА рдХреЛрд░ рднрд╛рд╖рд╛ рдкрд░ рдЪрд▓рддреА рд╣реИ, рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП x -> stdlib рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдПрдХ рдордЬрдмреВрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрдиреА рд╣реБрдИ рд╣реИред

@griesemer рдЖрд╣, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ, рдпрд╣ "if err != nil рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕" рдХрд╛рдЙрдВрдЯрд░ (123) рдХреЛ рд╣рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рди рдХрд┐ "рдХреЛрд╢рд┐рд╢ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ" рдХрд╛рдЙрдВрдЯрд░ (64) рдХреЛ рд╣рд░ рдХреЗ рд░реВрдк рдореЗрдВред рдореИрдВ рдЙрд╕ рд╕рд╡рд╛рд▓ рдкрд░ рдкреНрд░рд╣рд╛рд░ рдХрд░реВрдВрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж!

@mattpalmer рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рдиреЗ рдЦреБрдж рдХреЛ рд▓рдЧрднрдЧ рдПрдХ рджрд╢рдХ рддрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╕рдЯреАрдХ рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕реАрдзреЗ try рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЖрдк рдХрд┐рд╕ рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@griesemer рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдпрд╣ рдореЗрд░реА рдЧрд▓рддреА рд╣реИ - рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдХреНрдпрд╛ рд╢реБрд░реВ рд╣реБрдЖ рдпрд╣ рд╕рдордЭрд╛рддреЗ рд╣реБрдП рдХрд┐ рдореБрдЭреЗ try рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдмрд╛рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдП рдЧрдП рдЬрдореАрдиреА рдирд┐рдпрдореЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдерд╛ (рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдирдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдПрдХ рдирдпрд╛ рдСрдкрд░реЗрдЯрд░ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ)ред рдХреНрдпрд╛ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╣рдЯрд╛рдирд╛ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ (рдпрд╛ рдЗрд╕реЗ рдЦрд░рд╛рдм рд░реВрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)?

@subfuzion рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рдПрдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╕реБрдЭрд╛рд╡ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВред рдХрдИ рдЕрдЬреАрдм рд╣реИрдВ

рд╣рдордиреЗ рдЙрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рдХрдИ рдмрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд╛рдВрдЧреА рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдпреЛрдЧ рдЪрд░рдг рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрднреА рддрдХ рдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рдпреЛрдЧ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдбреНрд░рд╛рдЗрдВрдЧ рдмреЛрд░реНрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

@griesemer рдХреНрдпрд╛ рдЖрдк рдкреНрд░рдпреЛрдЧ рдХреА рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

@рдореЗрдБ рдУрд░

рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ @rsc рд╕реЗ рдпрд╣ рдкреВрдЫрд╛ рдерд╛ (https://github.com/golang/go/issues/32437#issuecomment-503245958):

@ рдЖрд░рдПрд╕рд╕реА
рдРрд╕реЗ рд╕реНрдерд╛рдиреЛрдВ рдХреА рдХрдореА рдирд╣реАрдВ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд░рдЦреА рдЬрд╛ рд╕рдХреЗред рдРрд╕рд╛ рдХреМрди рд╕рд╛ рдкреИрдорд╛рдирд╛ рдорд╛рдВрдЧрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рд░ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░реЗ? рдХреНрдпрд╛ рд╡рд░реНрдЧреАрдХреГрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ? рдбреЗрдЯрд╛ рд╕реЗ рдореВрд▓реНрдп рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдЬрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рднрд╛рд╡рдирд╛ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрддреА рд╣реИ?

рдЙрддреНрддрд░ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдерд╛, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╕реАрди рдФрд░ рдЕрднрд╛рд╡рдЧреНрд░рд╕реНрдд рдкрджрд╛рд░реНрде (https://github.com/golang/go/issues/32437#issuecomment-503295558):

рдирд┐рд░реНрдгрдп рдЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд▓реЛрдЧ рд╣рдореЗрдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдореЗрдВ try рдЕрдкреНрд░рднрд╛рд╡реА рд╣реИ, рддреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреА рд╣реИред рдпрд╣ рднрд╛рд╡рдирд╛ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдирд╣реАрдВ рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд╡рдирд╛ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИ рдереА (https://github.com/golang/go/issues/32437#issuecomment-503408184):

рдореБрдЭреЗ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдорд┐рд▓рдиреЗ рдкрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдЬрд┐рд╕рдореЗрдВ try рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдХреЛрдб рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рдереАред

рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ "рдХреНрдпрд╛ рд╡рд░реНрдЧреАрдХреГрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ?"ред рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ 6 рддрд░реАрдХреЗ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╣реЛрдВрдЧреЗ - рдореИрдиреБрдЕрд▓ рдбрд╛рдпрд░реЗрдХреНрдЯ, рдореИрдиреБрдЕрд▓ рдкрд╛рд╕-рдереНрд░реВ, рдореИрдиреБрдЕрд▓ рдЗрдирдбрд╛рдпрд░реЗрдХреНрдЯ, рдСрдЯреЛрдореИрдЯрд┐рдХ рдбрд╛рдпрд░реЗрдХреНрдЯ, рдСрдЯреЛрдореИрдЯрд┐рдХ рдкрд╛рд╕-рдереНрд░реВ, рдСрдЯреЛрдореИрдЯрд┐рдХ рдЗрдирдбрд╛рдпрд░реЗрдХреНрдЯред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 2 рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдо рд╣реИред рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рддрд░реАрдХреЗ, рдЬрд┐рдирдХреА рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрднрд╡реА рдЧреЛрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд╖реЗрдзрд╛рддреНрдордХ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдЪрд┐рдВрддрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред (https://github.com/golang/go/issues/32437#issuecomment-507332843)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдореВрд▓реНрдп (https://github.com/golang/go/issues/32437#issuecomment-507497656) рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рд╕рдордп рдХреЗ рд╕рд╛рде, рд╢реБрдХреНрд░ рд╣реИ рдХрд┐ рдкреЗрд╢ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рдкреВрд░реНрд╡рд╡реНрдпрд╛рдкреА рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдПрдХ рд╢рд╛рдВрдд рдФрд░ рдареЛрд╕ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░ (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ), рдЬрд┐рд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╢рддреНрд░реБрддрд╛рдкреВрд░реНрдг рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕реА рддрд░рд╣ рджреЗрд╡реЛрдВ рдХреЛ рдЖрд▓рд╕реА рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореВрд▓реНрдпрд╡рд╛рди рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (https://github.com/golang/go/issues/32437#issuecomment-507505243)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рдХрдореА рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯреЛрди-рдмрд╣рд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢реЛрд░ рд╣реЛрдиреЗ рд▓рд╛рдпрдХ рд╣реИред

@iand @rsc рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрддреНрддрд░ рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕ рдЙрддреНрддрд░ рдХрд╛ рдХреМрди рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ "рдкрджрд╛рд░реНрде рдХреА рдХрдореА" рд╣реИ рдпрд╛ рдЗрд╕реЗ "рдкреНрд░реЗрд░рдХ" рд╣реЛрдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдФрд░ "рдкрджрд╛рд░реНрде" рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

рдкреНрд░рд╕реНрддрд╛рд╡ рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдВрддрддрдГ рдпрд╣ рдкрд╣рдЪрд╛рдирдирд╛ рд╣реИ рдХрд┐ "рдХреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдиреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд▓рд╛рдн рджрд┐рдпрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд▓рд╛рдЧрдд рдкреИрджрд╛ рдХреА рд╣реИ" (рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд░рдг 5)ред

рд╣рдордиреЗ рдЪрд░рдг 1 рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ: рдЧреЛ рдЯреАрдо рдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ; рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╣рдо рдЗрд╕реЗ рдирд╣реАрдВ рдЪреБрдирддреЗ рдЕрдЧрд░ рд╣рдордиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рд╕реЛрдЪрд╛ рдФрд░ рдЗрд╕реЗ рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рд╕рдордЭрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ рдХреЛрдб рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рд╣рд╡рд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ - рд╣рдо рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдореЗрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд░рдг 2 рдкрд░ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рд╕реЗ рдХрд╛рдлреА рджреВрд░ рд╣реИрдВред рдЪрд░рдг 2 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ - рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП: рдЕрднреА рддрдХ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЯрд┐рдкреНрдкрдгреА рдереА рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рд╛рде _рддрдХрдиреАрдХреА_ рдХрдореА рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдареАрдХ рдХрд┐рдпрд╛ ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдареЛрд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рднреА рдереАрдВ рдЬреЛ рджрд░реНрд╢рд╛рддреА рд╣реИрдВ рдХрд┐ try рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ рдФрд░ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛; рдФрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдереАрдВ - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдкрд░ рдбреЗрдЯрд╛ рдкрд░ рднреА рдЖрдзрд╛рд░рд┐рдд - рдЬрд┐рд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ try рдЬреНрдпрд╛рджрд╛ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╛ рддрдХрдиреАрдХреА рдХрдорд┐рдпреЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕ рддрд░рд╣ рдХреА рдареЛрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдпреЛрдЧреНрдп рдФрд░ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реИред рд╣рдо рдЗрд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред

рдФрд░ рдлрд┐рд░ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдереАрдВ рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рднрд╛рд╡рдирд╛ рд╣реИрдВред рдпрд╣ рдХрдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдпреЛрдЧреНрдп рд╣реИред рдпрд╣ рдХрд╣рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЪрд┐рдкрдХреЗ рд╣реБрдП рд╣реИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо "рд╕реНрд╡рд░-рдмрд╣рд░реЗ" рд╣реИрдВред

рдЗрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╢рд╛рдпрдж рджреЛ, рд╢рд╛рдпрдж рддреАрди рджрд░реНрдЬрди рдореБрдЦрд░ рд╡рд┐рд░реЛрдзреА рд╣реИрдВ - рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреМрди рд╣реИрдВред рд╡реЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдкреЛрд╕реНрдЯ, рдХрднреА-рдХрднреА рдХрдИ рдмрд╛рд░ рдПрдХ рджрд┐рди рдХреЗ рд╕рд╛рде рд╣рд╛рд╡реА рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдХреБрдЫ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рд╣рд╛рд╕рд┐рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИред рдкрджреЛрдВ рдХреА рдмрдврд╝реА рд╣реБрдИ рд╕рдВрдЦреНрдпрд╛ рднреА рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ "рдордЬрдмреВрдд" рднрд╛рд╡рдирд╛ рдХреЛ рдирд╣реАрдВ рджрд░реНрд╢рд╛рддреА рд╣реИ; рдЗрд╕рдХрд╛ рд╕реАрдзрд╛ рд╕рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпреЗ рд▓реЛрдЧ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдореБрдЦрд░ рд╣реИрдВред

@iand @rsc рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрддреНрддрд░ рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕ рдЙрддреНрддрд░ рдХрд╛ рдХреМрди рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ "рдкрджрд╛рд░реНрде рдХреА рдХрдореА" рд╣реИ рдпрд╛ рдЗрд╕реЗ "рдкреНрд░реЗрд░рдХ" рд╣реЛрдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдФрд░ "рдкрджрд╛рд░реНрде" рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

@griesemer рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдерд╛ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрджреНрдзреГрдд рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрд░рд╛ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдмрд╛рдж рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ try рдХреА рд╕рдлрд▓рддрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╣рдореЗрдВ рдмреЗрд╣рддрд░ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

@iand рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рд╡рд╣ рд╕рд┐рд░реНрдл рдореЗрд░рд╛ рдирд┐рд░реАрдХреНрд╖рдг рдерд╛ред рдореИрдВ рдХреНрд╖рдорд╛рдкреНрд░рд╛рд░реНрдереА рд╣реВрдВред

рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ try рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╕реЗ рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдХреНрд╖реНрдп рдФрд░ tryhard рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдкреНрд░рдпреЛрдЧ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдлрд╛рдИ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкрдардиреАрдпрддрд╛ рдЕрдзрд┐рдХ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдФрд░ рдкрд░рд┐рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИред

@griesemer

рдЖрдк рдХрд┐рд╕ рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдореИрдВ рдЙрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ try рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдЧрд╛, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд╢реВрдиреНрдп-рдЬрд╛рдВрдЪ рдкреИрдЯрд░реНрди рдирд╣реАрдВред рджреБрд░реБрдкрдпреЛрдЧ рдФрд░ рджреБрд░реБрдкрдпреЛрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдПрдХ рдмрдбрд╝рд╛ рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЪрд▓ рд░рд╣реА рдЖрдордж рдХреЗ рд╕рд╛рде рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣ рд╕рдм рдФрд░ рдореВрд▓ рднрд╛рд╖рд╛ рдХреА рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ x рдкреИрдХреЗрдЬ рдпрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдпрд╛ рддреЛ рдкреИрдХреЗрдЬ errors/try рдпрд╛ errors.Try() рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд░рдирд╛)

@mattparlmer рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЬреА, рдПрдо (рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред

@ рдлреИрдмрд┐рдпрди-рдПрдл

@mattparlmer рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЬреА, рдПрдо (рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ; рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ try if рдФрд░ return рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ if рдФрд░ return рд╕реЗ рдЕрдзрд┐рдХ "рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб" рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реА рдХрдВрдкрдиреА рдХреЗ 300k-рд▓рд╛рдЗрди рдЧреЛ рдХреЛрдбрдмреЗрд╕ рд╕реЗ tryhard рд░рд┐рдкреЛрд░реНрдЯ рдпрд╣рд╛рдВ рджреА рдЧрдИ рд╣реИ:

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░рди:

--- stats ---
  13879 (100.0% of   13879) func declarations
   4381 ( 31.6% of   13879) func declarations returning an error
  38435 (100.0% of   38435) statements
   8028 ( 20.9% of   38435) if statements
   4496 ( 56.0% of    8028) if <err> != nil statements
    453 ( 10.1% of    4496) try candidates
      4 (  0.1% of    4496) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
   3066 ( 68.2% of    4496) { return ... zero values ..., expr }
    356 (  7.9% of    4496) single statement then branch
    345 (  7.7% of    4496) complex then branch; cannot use try
     63 (  1.4% of    4496) non-empty else branch; cannot use try

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреВрдЬреВ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреИрдХреЗрдЬ (https://godoc.org/github.com/juju/errgo) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдореНрдореЗрд▓рди рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо try рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдирдЧреНрди рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред

рдЪреВрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╣рд╛рдпрдХ рдореАрдЯреНрд░рд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ errgo.Mask() рдХреЙрд▓ рд╣рдЯрд╛ рджреАрдВ (рдЬреЛ рдмрд┐рдирд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреА рд╣реИрдВ) рдФрд░ tryhard рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдпрд╛ред рдпрд╣ рдПрдХ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХрд┐рддрдиреА рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

--- stats ---
  13879 (100.0% of   13879) func declarations
   4381 ( 31.6% of   13879) func declarations returning an error
  38435 (100.0% of   38435) statements
   8028 ( 20.9% of   38435) if statements
   4496 ( 56.0% of    8028) if <err> != nil statements
   3114 ( 69.3% of    4496) try candidates
      7 (  0.2% of    4496) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
    381 (  8.5% of    4496) { return ... zero values ..., expr }
    358 (  8.0% of    4496) single statement then branch
    345 (  7.7% of    4496) complex then branch; cannot use try
     63 (  1.4% of    4496) non-empty else branch; cannot use try

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ~ 70% рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдЕрдиреНрдпрдерд╛ try рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ, рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдВрддрд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝реА рдЧрдИ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рди рд╣реА рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ рдирд╣реАрдВ рд╣реИ:

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рд▓рд╛рдЧрдд рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ рд╡реГрджреНрдзрд┐ рдХрд░рддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдореЗрдВ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕реАрдорд╛рдВрдд рд▓рд╛рдЧрдд рдмрд╣реБрдд рдХрдо рд╣реИ; рдпрд╣ рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдпрджрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЬреАрдирд┐рдпрд░ try рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░ рдХреЛ рддреЗрдЬреА рд╕реЗ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдХреЛрдб рдХреЛ "рдЕрдзрд┐рдХ рдЪрд┐рдХрдирд╛ рджрд┐рдЦрддрд╛ рд╣реИ" (рдЬреЛ рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рджреБрдЦ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ), рдФрд░ рдЕрдм рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреНрд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реЗ рдЗрд╕реЗ "рдкрдардиреАрдпрддрд╛" рддрд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдЪрд┐рдд рдард╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреИрд╕реЗ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдиреНрдп 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╛рдардХ рдХреЛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдХреЛрдб рдЖрдзрд╛рд░ рдЧреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИрдВ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рд╕рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░ рдПрдХ рдФрд╕рдд рджрд░реНрдЬреЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рд╣реЛрддреА рд╣реИ, рдФрд░ рдЯреАрдо рдЕрднреНрдпрд╛рд╕ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред . рд╡реИрд╕реЗ рднреА, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рд╣рдо рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП try рдХреЛ рдирд╣реАрдВ рдЕрдкрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

@mattparlmer

рдпрд╣ рд╕рдм рдФрд░ рдореВрд▓ рднрд╛рд╖рд╛ рдХреА рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ x рдкреИрдХреЗрдЬ рдпрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдпрд╛ рддреЛ рдкреИрдХреЗрдЬ errors/try рдпрд╛ errors.Try() рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд░рдирд╛)

try рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреЗ рдХреЙрд▓рд░ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЬрд┐рд╕реЗ #32473 рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдмрд┐рд▓реНрдЯ-рдЗрдиреНрд╕ рдХреА рддрд░рд╣, рдЧреЛ рдореЗрдВ try рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рднреА рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рднреА, рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ; рдЕрдВрдд рдХреЗ рдкрд╛рд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ FAQ рджреЗрдЦреЗрдВред

рд╕рд╛рде рд╣реА, try рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдХреЛ рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдФрд░ рджреЛ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдПрдХ рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/rhysd/trygo рдФрд░ https://github.com/lunixbochs/og рджреЗрдЦреЗрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреЗрдЧреЛрд▓рд╛ рдХрд╛ ~60% рдХреЛрдб рдмреЗрд╕ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рддреЗрдЧреЛрд▓рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: (http://github.com/go-spatial/tegola)

--- try candidates ---
      1  tegola/atlas/atlas.go:84
      2  tegola/atlas/map.go:232
      3  tegola/atlas/map.go:238
      4  tegola/atlas/map.go:248
      5  tegola/atlas/map.go:253
      6  tegola/basic/geometry_math.go:248
      7  tegola/basic/geometry_math.go:251
      8  tegola/basic/geometry_math.go:268
      9  tegola/basic/geometry_math.go:276
     10  tegola/basic/json_marshal.go:33
     11  tegola/basic/json_marshal.go:153
     12  tegola/basic/json_marshal.go:276
     13  tegola/cache/azblob/azblob.go:54
     14  tegola/cache/azblob/azblob.go:61
     15  tegola/cache/azblob/azblob.go:67
     16  tegola/cache/azblob/azblob.go:74
     17  tegola/cache/azblob/azblob.go:80
     18  tegola/cache/azblob/azblob.go:105
     19  tegola/cache/azblob/azblob.go:109
     20  tegola/cache/azblob/azblob.go:204
     21  tegola/cache/azblob/azblob.go:259
     22  tegola/cache/file/file.go:42
     23  tegola/cache/file/file.go:56
     24  tegola/cache/file/file.go:110
     25  tegola/cache/file/file.go:116
     26  tegola/cache/file/file.go:129
     27  tegola/cache/redis/redis.go:41
     28  tegola/cache/redis/redis.go:46
     29  tegola/cache/redis/redis.go:51
     30  tegola/cache/redis/redis.go:56
     31  tegola/cache/redis/redis.go:70
     32  tegola/cache/redis/redis.go:79
     33  tegola/cache/redis/redis.go:84
     34  tegola/cache/s3/s3.go:85
     35  tegola/cache/s3/s3.go:102
     36  tegola/cache/s3/s3.go:112
     37  tegola/cache/s3/s3.go:118
     38  tegola/cache/s3/s3.go:123
     39  tegola/cache/s3/s3.go:138
     40  tegola/cache/s3/s3.go:164
     41  tegola/cache/s3/s3.go:172
     42  tegola/cache/s3/s3.go:179
     43  tegola/cache/s3/s3.go:284
     44  tegola/cache/s3/s3.go:340
     45  tegola/cmd/tegola/cmd/cache/format.go:97
     46  tegola/cmd/tegola/cmd/cache/seed_purge.go:94
     47  tegola/cmd/tegola/cmd/cache/seed_purge.go:103
     48  tegola/cmd/tegola/cmd/cache/seed_purge.go:170
     49  tegola/cmd/tegola/cmd/cache/tile_list.go:51
     50  tegola/cmd/tegola/cmd/cache/tile_list.go:64
     51  tegola/cmd/tegola/cmd/cache/tile_name.go:35
     52  tegola/cmd/tegola/cmd/cache/tile_name.go:43
     53  tegola/cmd/tegola/cmd/root.go:58
     54  tegola/cmd/tegola/cmd/root.go:61
     55  tegola/cmd/xyz2svg/cmd/draw.go:62
     56  tegola/cmd/xyz2svg/cmd/draw.go:70
     57  tegola/cmd/xyz2svg/cmd/draw.go:214
     58  tegola/config/config.go:96
     59  tegola/internal/env/parse.go:30
     60  tegola/internal/env/parse.go:69
     61  tegola/internal/env/parse.go:116
     62  tegola/internal/env/parse.go:174
     63  tegola/internal/env/parse.go:221
     64  tegola/internal/env/types.go:67
     65  tegola/internal/env/types.go:86
     66  tegola/internal/env/types.go:105
     67  tegola/internal/env/types.go:124
     68  tegola/internal/env/types.go:143
     69  tegola/maths/makevalid/main.go:189
     70  tegola/maths/makevalid/main.go:207
     71  tegola/maths/makevalid/main.go:221
     72  tegola/maths/makevalid/main.go:295
     73  tegola/maths/makevalid/main.go:504
     74  tegola/maths/makevalid/makevalid.go:77
     75  tegola/maths/makevalid/makevalid.go:89
     76  tegola/maths/makevalid/makevalid.go:118
     77  tegola/maths/makevalid/makevalid_test.go:93
     78  tegola/maths/makevalid/makevalid_test.go:163
     79  tegola/maths/makevalid/plyg/ring.go:518
     80  tegola/maths/triangle.go:1023
     81  tegola/mvt/layer.go:73
     82  tegola/mvt/layer.go:79
     83  tegola/mvt/vector_tile/vector_tile.pb.go:64
     84  tegola/provider/gpkg/gpkg.go:138
     85  tegola/provider/gpkg/gpkg.go:223
     86  tegola/provider/gpkg/gpkg_register.go:46
     87  tegola/provider/gpkg/gpkg_register.go:51
     88  tegola/provider/gpkg/gpkg_register.go:186
     89  tegola/provider/gpkg/gpkg_register.go:227
     90  tegola/provider/gpkg/gpkg_register.go:240
     91  tegola/provider/gpkg/gpkg_register.go:245
     92  tegola/provider/gpkg/gpkg_register.go:256
     93  tegola/provider/gpkg/gpkg_register.go:377
     94  tegola/provider/postgis/postgis.go:112
     95  tegola/provider/postgis/postgis.go:117
     96  tegola/provider/postgis/postgis.go:122
     97  tegola/provider/postgis/postgis.go:127
     98  tegola/provider/postgis/postgis.go:136
     99  tegola/provider/postgis/postgis.go:142
    100  tegola/provider/postgis/postgis.go:148
    101  tegola/provider/postgis/postgis.go:153
    102  tegola/provider/postgis/postgis.go:158
    103  tegola/provider/postgis/postgis.go:163
    104  tegola/provider/postgis/postgis.go:181
    105  tegola/provider/postgis/postgis.go:198
    106  tegola/provider/postgis/postgis.go:264
    107  tegola/provider/postgis/postgis.go:441
    108  tegola/provider/postgis/postgis.go:446
    109  tegola/provider/postgis/postgis.go:529
    110  tegola/provider/postgis/postgis.go:559
    111  tegola/provider/postgis/postgis.go:603
    112  tegola/provider/postgis/util.go:31
    113  tegola/provider/postgis/util.go:36
    114  tegola/provider/postgis/util.go:200
    115  tegola/server/bindata/bindata.go:89
    116  tegola/server/bindata/bindata.go:109
    117  tegola/server/bindata/bindata.go:129
    118  tegola/server/bindata/bindata.go:149
    119  tegola/server/bindata/bindata.go:169
    120  tegola/server/bindata/bindata.go:189
    121  tegola/server/bindata/bindata.go:209
    122  tegola/server/bindata/bindata.go:229
    123  tegola/server/bindata/bindata.go:370
    124  tegola/server/bindata/bindata.go:374
    125  tegola/server/bindata/bindata.go:378
    126  tegola/server/bindata/bindata.go:382
    127  tegola/server/bindata/bindata.go:386
    128  tegola/server/bindata/bindata.go:402
    129  tegola/server/middleware_gzip.go:71
    130  tegola/server/middleware_gzip.go:78
    131  tegola/server/server_test.go:85

--- <err> name is different from "err" ---
      1  tegola/basic/json_marshal.go:276

--- { return ... zero values ..., expr } ---
      1  tegola/basic/geometry_math.go:214
      2  tegola/basic/geometry_math.go:222
      3  tegola/basic/geometry_math.go:230
      4  tegola/cache/azblob/azblob.go:131
      5  tegola/cache/azblob/azblob.go:140
      6  tegola/cache/azblob/azblob.go:149
      7  tegola/cache/azblob/azblob.go:171
      8  tegola/cache/file/file.go:47
      9  tegola/cache/s3/s3.go:92
     10  tegola/cmd/internal/register/maps.go:108
     11  tegola/cmd/tegola/cmd/cache/flags.go:20
     12  tegola/cmd/tegola/cmd/cache/tile_name.go:51
     13  tegola/cmd/tegola/cmd/cache/worker.go:112
     14  tegola/cmd/tegola/cmd/cache/worker.go:123
     15  tegola/cmd/tegola/cmd/root.go:73
     16  tegola/cmd/tegola/cmd/root.go:78
     17  tegola/cmd/xyz2svg/cmd/root.go:60
     18  tegola/provider/gpkg/gpkg.go:90
     19  tegola/provider/gpkg/gpkg.go:95
     20  tegola/provider/gpkg/gpkg_register.go:264
     21  tegola/provider/gpkg/gpkg_register.go:297
     22  tegola/provider/gpkg/gpkg_register.go:302
     23  tegola/provider/gpkg/gpkg_register.go:313
     24  tegola/provider/gpkg/gpkg_register.go:328
     25  tegola/provider/postgis/postgis.go:193
     26  tegola/provider/postgis/postgis.go:208
     27  tegola/provider/postgis/postgis.go:222
     28  tegola/provider/postgis/postgis.go:228
     29  tegola/provider/postgis/postgis.go:234
     30  tegola/provider/postgis/postgis.go:243
     31  tegola/provider/postgis/postgis.go:249
     32  tegola/provider/postgis/postgis.go:255
     33  tegola/provider/postgis/postgis.go:304
     34  tegola/provider/postgis/postgis.go:315
     35  tegola/provider/postgis/postgis.go:319
     36  tegola/provider/postgis/postgis.go:364
     37  tegola/provider/postgis/postgis.go:456
     38  tegola/provider/postgis/postgis.go:520
     39  tegola/provider/postgis/postgis.go:534
     40  tegola/provider/postgis/postgis.go:565
     41  tegola/provider/postgis/util.go:108
     42  tegola/provider/postgis/util.go:113
     43  tegola/server/bindata/bindata.go:29
     44  tegola/server/bindata/bindata.go:245
     45  tegola/server/bindata/bindata.go:271
     46  tegola/server/bindata/bindata.go:396

--- single statement then branch ---
      1  tegola/cache/azblob/azblob.go:241
      2  tegola/cache/file/file.go:87
      3  tegola/cache/s3/s3.go:321
      4  tegola/cmd/internal/register/caches.go:18
      5  tegola/cmd/internal/register/providers.go:43
      6  tegola/cmd/internal/register/providers.go:62
      7  tegola/cmd/internal/register/providers.go:75
      8  tegola/config/config.go:192
      9  tegola/config/config.go:207
     10  tegola/config/config.go:217
     11  tegola/internal/env/dict.go:43
     12  tegola/internal/env/dict.go:121
     13  tegola/internal/env/dict.go:197
     14  tegola/internal/env/dict.go:273
     15  tegola/internal/env/dict.go:348
     16  tegola/internal/env/parse.go:79
     17  tegola/internal/env/parse.go:126
     18  tegola/internal/env/parse.go:184
     19  tegola/internal/env/parse.go:231
     20  tegola/maths/makevalid/plyg/ring.go:541
     21  tegola/maths/maths.go:239
     22  tegola/maths/validate/validate.go:49
     23  tegola/maths/validate/validate.go:53
     24  tegola/maths/validate/validate.go:59
     25  tegola/maths/validate/validate.go:69
     26  tegola/mvt/feature.go:94
     27  tegola/mvt/feature.go:99
     28  tegola/mvt/feature.go:592
     29  tegola/mvt/feature.go:603
     30  tegola/mvt/layer.go:90
     31  tegola/mvt/tile.go:48
     32  tegola/provider/postgis/postgis.go:570
     33  tegola/provider/postgis/postgis.go:586
     34  tegola/tile.go:172

--- complex then branch; cannot use try ---
      1  tegola/cache/azblob/azblob.go:226
      2  tegola/cache/file/file.go:78
      3  tegola/cache/file/file.go:122
      4  tegola/cache/s3/s3.go:195
      5  tegola/cache/s3/s3.go:206
      6  tegola/cache/s3/s3.go:219
      7  tegola/cache/s3/s3.go:307
      8  tegola/provider/gpkg/gpkg.go:39
      9  tegola/provider/gpkg/gpkg.go:45
     10  tegola/provider/gpkg/gpkg.go:131
     11  tegola/provider/gpkg/gpkg.go:154
     12  tegola/provider/gpkg/gpkg_register.go:171
     13  tegola/provider/gpkg/gpkg_register.go:195

--- stats ---
   1294 (100.0% of    1294) func declarations
    246 ( 19.0% of    1294) func declarations returning an error
   2693 (100.0% of    2693) statements
    551 ( 20.5% of    2693) if statements
    238 ( 43.2% of     551) if <err> != nil statements
    131 ( 55.0% of     238) try candidates
      1 (  0.4% of     238) <err> name is different from "err"
--- non-try candidates ---
     46 ( 19.3% of     238) { return ... zero values ..., expr }
     34 ( 14.3% of     238) single statement then branch
     13 (  5.5% of     238) complex then branch; cannot use try
      0 (  0.0% of     238) non-empty else branch; cannot use try

рдФрд░ рд╕рд╣рдпреЛрдЧреА рдкрд░рд┐рдпреЛрдЬрдирд╛: (http://github.com/go-spatial/geom)

--- try candidates ---
      1  geom/bbox.go:202
      2  geom/encoding/geojson/geojson.go:152
      3  geom/encoding/geojson/geojson.go:157
      4  geom/encoding/wkb/internal/tcase/symbol/symbol.go:73
      5  geom/encoding/wkb/internal/tcase/tcase.go:161
      6  geom/encoding/wkb/internal/tcase/tcase.go:172
      7  geom/encoding/wkb/wkb.go:50
      8  geom/encoding/wkb/wkb.go:110
      9  geom/encoding/wkt/internal/token/token.go:176
     10  geom/encoding/wkt/internal/token/token.go:252
     11  geom/internal/parsing/parsing.go:44
     12  geom/internal/parsing/parsing.go:85
     13  geom/internal/rtreego/rtree_test.go:110
     14  geom/multi_line_string.go:34
     15  geom/multi_polygon.go:35
     16  geom/planar/clip/linestring.go:82
     17  geom/planar/clip/linestring.go:181
     18  geom/planar/clip/point.go:23
     19  geom/planar/intersect/xsweep.go:106
     20  geom/planar/makevalid/makevalid.go:92
     21  geom/planar/makevalid/makevalid.go:191
     22  geom/planar/makevalid/setdiff/polygoncleaner.go:283
     23  geom/planar/makevalid/setdiff/polygoncleaner.go:345
     24  geom/planar/makevalid/setdiff/polygoncleaner.go:543
     25  geom/planar/makevalid/setdiff/polygoncleaner.go:554
     26  geom/planar/makevalid/setdiff/polygoncleaner.go:572
     27  geom/planar/makevalid/setdiff/polygoncleaner.go:578
     28  geom/planar/simplify/douglaspeucker.go:84
     29  geom/planar/simplify/douglaspeucker.go:88
     30  geom/planar/simplify.go:13
     31  geom/planar/triangulate/constraineddelaunay/triangle.go:186
     32  geom/planar/triangulate/constraineddelaunay/triangulator.go:134
     33  geom/planar/triangulate/constraineddelaunay/triangulator.go:138
     34  geom/planar/triangulate/constraineddelaunay/triangulator.go:142
     35  geom/planar/triangulate/constraineddelaunay/triangulator.go:173
     36  geom/planar/triangulate/constraineddelaunay/triangulator.go:176
     37  geom/planar/triangulate/constraineddelaunay/triangulator.go:203
     38  geom/planar/triangulate/constraineddelaunay/triangulator.go:248
     39  geom/planar/triangulate/constraineddelaunay/triangulator.go:396
     40  geom/planar/triangulate/constraineddelaunay/triangulator.go:466
     41  geom/planar/triangulate/constraineddelaunay/triangulator.go:553
     42  geom/planar/triangulate/constraineddelaunay/triangulator.go:583
     43  geom/planar/triangulate/constraineddelaunay/triangulator.go:667
     44  geom/planar/triangulate/constraineddelaunay/triangulator.go:672
     45  geom/planar/triangulate/constraineddelaunay/triangulator.go:677
     46  geom/planar/triangulate/constraineddelaunay/triangulator.go:814
     47  geom/planar/triangulate/constraineddelaunay/triangulator.go:818
     48  geom/planar/triangulate/constraineddelaunay/triangulator.go:823
     49  geom/planar/triangulate/constraineddelaunay/triangulator.go:865
     50  geom/planar/triangulate/constraineddelaunay/triangulator.go:870
     51  geom/planar/triangulate/constraineddelaunay/triangulator.go:875
     52  geom/planar/triangulate/constraineddelaunay/triangulator.go:897
     53  geom/planar/triangulate/constraineddelaunay/triangulator.go:901
     54  geom/planar/triangulate/constraineddelaunay/triangulator.go:907
     55  geom/planar/triangulate/constraineddelaunay/triangulator.go:1107
     56  geom/planar/triangulate/constraineddelaunay/triangulator.go:1146
     57  geom/planar/triangulate/constraineddelaunay/triangulator.go:1157
     58  geom/planar/triangulate/constraineddelaunay/triangulator.go:1202
     59  geom/planar/triangulate/constraineddelaunay/triangulator.go:1206
     60  geom/planar/triangulate/constraineddelaunay/triangulator.go:1216
     61  geom/planar/triangulate/delaunaytriangulationbuilder.go:66
     62  geom/planar/triangulate/incrementaldelaunaytriangulator.go:46
     63  geom/planar/triangulate/incrementaldelaunaytriangulator.go:78
     64  geom/planar/triangulate/quadedge/lastfoundquadedgelocator.go:65
     65  geom/planar/triangulate/quadedge/quadedgesubdivision.go:976
     66  geom/slippy/tile.go:133

--- { return ... zero values ..., expr } ---
      1  geom/internal/parsing/parsing.go:125
      2  geom/planar/triangulate/constraineddelaunay/triangulator.go:428
      3  geom/planar/triangulate/constraineddelaunay/triangulator.go:447
      4  geom/planar/triangulate/constraineddelaunay/triangulator.go:460

--- single statement then branch ---
      1  geom/bbox.go:259
      2  geom/encoding/wkb/internal/decode/decode.go:29
      3  geom/encoding/wkb/internal/decode/decode.go:55
      4  geom/encoding/wkb/internal/decode/decode.go:63
      5  geom/encoding/wkb/internal/decode/decode.go:70
      6  geom/encoding/wkb/internal/decode/decode.go:79
      7  geom/encoding/wkb/internal/decode/decode.go:84
      8  geom/encoding/wkb/internal/decode/decode.go:93
      9  geom/encoding/wkb/internal/decode/decode.go:99
     10  geom/encoding/wkb/internal/decode/decode.go:105
     11  geom/encoding/wkb/internal/decode/decode.go:114
     12  geom/encoding/wkb/internal/decode/decode.go:119
     13  geom/encoding/wkb/internal/decode/decode.go:135
     14  geom/encoding/wkb/internal/decode/decode.go:140
     15  geom/encoding/wkb/internal/decode/decode.go:149
     16  geom/encoding/wkb/internal/decode/decode.go:155
     17  geom/encoding/wkb/internal/decode/decode.go:161
     18  geom/encoding/wkb/internal/decode/decode.go:170
     19  geom/encoding/wkb/internal/decode/decode.go:176
     20  geom/encoding/wkb/internal/tcase/token/token.go:162
     21  geom/encoding/wkt/internal/token/token.go:136

--- complex then branch; cannot use try ---
      1  geom/encoding/wkb/internal/tcase/tcase.go:74
      2  geom/encoding/wkt/internal/symbol/symbol.go:125
      3  geom/planar/intersect/xsweep.go:165
      4  geom/planar/makevalid/makevalid.go:85
      5  geom/planar/makevalid/makevalid.go:172
      6  geom/planar/makevalid/triangulate.go:19
      7  geom/planar/makevalid/triangulate.go:28
      8  geom/planar/makevalid/triangulate.go:36
      9  geom/planar/makevalid/triangulate.go:58
     10  geom/planar/triangulate/constraineddelaunay/triangulator.go:358
     11  geom/planar/triangulate/constraineddelaunay/triangulator.go:373
     12  geom/planar/triangulate/constraineddelaunay/triangulator.go:453
     13  geom/planar/triangulate/constraineddelaunay/triangulator.go:1237
     14  geom/planar/triangulate/constraineddelaunay/triangulator.go:1243
     15  geom/planar/triangulate/constraineddelaunay/triangulator.go:1249

--- stats ---
    820 (100.0% of     820) func declarations
    146 ( 17.8% of     820) func declarations returning an error
   1715 (100.0% of    1715) statements
    391 ( 22.8% of    1715) if statements
    111 ( 28.4% of     391) if <err> != nil statements
     66 ( 59.5% of     111) try candidates
      0 (  0.0% of     111) <err> name is different from "err"
--- non-try candidates ---
      4 (  3.6% of     111) { return ... zero values ..., expr }
     21 ( 18.9% of     111) single statement then branch
     15 ( 13.5% of     111) complex then branch; cannot use try
      0 (  0.0% of     111) non-empty else branch; cannot use try

рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд▓рд╛рдЧрддреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░, рдореИрдВ рдЗрд╕реЗ #32611 рд╕реЗ рджреЛрдмрд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ...

рдореБрдЭреЗ рд▓рд╛рдЧрдд рдХреЗ рддреАрди рд╡рд░реНрдЧ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

  1. рдХрд▓реНрдкрдирд╛ рдХреА рд▓рд╛рдЧрдд, рдЬрд┐рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. рдЯреВрд▓реАрдВрдЧ рдХреА рд▓рд╛рдЧрдд (рдпрд╛рдиреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕рдВрд╢реЛрдзрди), рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рднреА рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
  3. рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреА рд▓рд╛рдЧрдд, рдЬрд┐рд╕реЗ рд╕рдореБрджрд╛рдп рдиреЗ рдКрдкрд░ рдФрд░ #32825 рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдпрд╛ рд╣реИред

рд░реЗ рдирдВред 1 рдФрд░ 2, try() рдХреА рд▓рд╛рдЧрдд рдорд╛рдореВрд▓реА рд╣реИред

рдУрд╡рд░рд╕рд┐рдореНрдкреНрд▓реАрдлрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред 3, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ try() рд╣рдорд╛рд░реЗ рдХреЛрдб рдФрд░/рдпрд╛ рдЙрд╕ рдХреЛрдб рдХреЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдирд┐рд░реНрднрд░ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдорд╛рд░реА рдЙрддреНрдкрд╛рджрдХрддрд╛ рдФрд░ рдЙрддреНрдкрд╛рдж рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╡реНрдпрд╛рдкрдХ, рд╕реБрд╡рд┐рдЪрд╛рд░рд┐рдд рдзрд╛рд░рдгрд╛ рдХреЛ "рдЧреИрд░-рддрдереНрдпрд╛рддреНрдордХ" рдпрд╛ "рд╕реМрдВрджрд░реНрдп" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдорд╛рдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреА рд▓рд╛рдЧрдд рдХрд▓реНрдкрдирд╛ рдпрд╛ рдЯреВрд▓реАрдВрдЧ рдХреА рд▓рд╛рдЧрдд рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

@griesemer рдпрд╣ рджрд╛рд╡рд╛ рдХрд░рдирд╛ рдЕрдиреБрдЪрд┐рдд рд╣реИ рдХрд┐ "рддреАрди рджрд░реНрдЬрди рдореБрдЦрд░ рд╡рд┐рд░реЛрдзреА" рд╡рд┐рдкрдХреНрд╖ рдХреЗ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рд╣реИрдВред рд╕реИрдХрдбрд╝реЛрдВ рд▓реЛрдЧреЛрдВ рдиреЗ рдпрд╣рд╛рдВ рдФрд░ #32825 рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред рдЖрдкрдиреЗ 12 рдЬреВрди рдХреЛ рдореБрдЭрд╕реЗ рдХрд╣рд╛, "рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд▓рдЧрднрдЧ 2/3 рдЙрддреНрддрд░рджрд╛рддрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЦреБрд╢ рдирд╣реАрдВ рд╣реИрдВред" рддрдм рд╕реЗ рдЕрдм рддрдХ 2,000 рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рдиреЗ 90% рдердВрдм-рдЕрдк рдХреЗ рд╕рд╛рде " err != nil рдЕрдХреЗрд▓реЗ рдЫреЛрдбрд╝ рджреЗрдВ" рдкрд░ рдорддрджрд╛рди рдХрд┐рдпрд╛ рд╣реИред

@gdey рдХреНрдпрд╛ рдЖрдк рдХреЗрд╡рд▓ _stats рдФрд░ рдЧреИрд░-рдХреЛрд╢рд┐рд╢ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ_ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@robfig , @gdey рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреБрд▓рдирд╛ рд╕реЗ рдкрд╣рд▓реЗ/рдмрд╛рдж рдореЗрдВред

@griesemer
рдЖрдкрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рддрддреНрд╡ рдЬреЛрдбрд╝реЗ рд╣реИрдВ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реА (рдФрд░ рдЕрдиреНрдп рдХреА) рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧреЛ рдЯреАрдо рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдореЛрдб (рдпрд╛рдиреА рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдФрд░/рдпрд╛ рдкреЛрд╕реНрдЯ-рдлрд╝рдВрдХреНрд╢рди рд╕реНрдХреЛрдк рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рджреБрд░реБрдкрдпреЛрдЧ рдХреЛ рдЪрд░рдг 5 рдХреЗ рджреМрд░рд╛рди рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд╛рдпрдХ рд▓рд╛рдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреА рд╣реИ, рдФрд░ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдпрдХ рд╣реИ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдордиреЛрджрд╢рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЗрд╕ рд╕рдмрд╕реЗ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдкрд╣рд▓реВ рдХреЛ рдЧреЛ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЪрддреБрд░/рдЙрдкрдиреНрдпрд╛рд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕ рдЪрд┐рдВрддрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЖрдХрд▓рди рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд/рд╕рдорд░реНрдерд┐рдд рд▓рдЧрддрд╛ рд╣реИред - errd , рдмрд╛рддрдЪреАрдд рдореЗрдВ, рдЖрджрд┐)ред

рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ... рдЧреЛ рдЯреАрдо рдХреЗ рд╕рд╛рде рдЬреЛ рдЪрд┐рдВрддрд╛ рд╡рдпреЛрд╡реГрджреНрдз рдЧреЛрдлрд╝рд░реНрд╕ рдирд┐рд╖реЗрдзрд╛рддреНрдордХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдорддрд▓рдм рд╕реНрд╡рд░-рдмрд╣рд░рд╛рдкрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдерд╛ред
... рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдПрдХ рд▓рд╛рдЧрдд рд╣реИ рдХрд┐ рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рдЕрдиреБрднрд╡рд╛рддреНрдордХ рджрд░реНрдж рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВред рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рд╕рднреА рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ), рд▓реЗрдХрд┐рди рдЗрд╕ рдЪрд┐рдВрддрд╛ рдХреЛ рднрд╛рд╡реБрдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдЕрдкрдорд╛рдирдЬрдирдХ рд╣реИред рдмрд▓реНрдХрд┐, рдареЛрд╕ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд┐рд░реНрдгрдп рдХреЗ рдмрд┐рдирд╛ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕рд╛рдЭрд╛ рдЕрдиреБрднрд╡ рдХреЗ рдЬреНрдЮрд╛рди рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд░рдирд╛ рдЙрд╕ рддрд░рд╣ рдХреА рднрд╛рд╡рдирд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдореИрдВ/рд╣рдо рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@networkimpro рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ред рдореИрдВрдиреЗ рдЬреЛ рдХрд╣рд╛ рд╡рд╣ рдерд╛:

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╢рд╛рдпрдж рджреЛ, рд╢рд╛рдпрдж рддреАрди рджрд░реНрдЬрди рдореБрдЦрд░ рд╡рд┐рд░реЛрдзреА рд╣реИрдВ - рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреМрди рд╣реИрдВред рд╡реЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдкреЛрд╕реНрдЯ, рдХрднреА-рдХрднреА рдХрдИ рдмрд╛рд░ рдПрдХ рджрд┐рди рдХреЗ рд╕рд╛рде рд╣рд╛рд╡реА рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ (рдЬреИрд╕рд╛ рдХрд┐ "рд▓рдЧрд╛рддрд╛рд░ рдкреЛрд╕реНрдЯ" рдореЗрдВ), рдЗрдореЛрдЬреА рдирд╣реАрдВред рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╣реИ _repeaatedly_, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рд╕рд╣реА рд╣реИред рдореИрдВ рднреА #32825 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛; рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдЗрдореЛрдЬреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╕реНрдерд┐рддрд┐ рд▓рдЧрднрдЧ рдПрдХ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИ: 1/3 рдЗрдореЛрдЬреА рдПрдХ рдЕрдиреБрдХреВрд▓ рд░рд╛рдп рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ, рдФрд░ 2/3 рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд░рд╛рдп рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред

@griesemer

рдКрдкрд░ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦрддреЗ рд╕рдордп рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖрдпрд╛: рдЬрдмрдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ try рдХреЛ рдПрдХ рд╕реАрдзреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рдорд▓рд╛ рд╣реИ, рдХреБрдЫ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдБ рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реАрдзрд╛ рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:

switch x {
case rand.Int():
  a()
case 5, try(strconv.Atoi(y)):
  b()
}

switch рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдЖрджреЗрд╢ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрдЪреНрдЫрд┐рдд рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП case рдЦрдВрдб рд╕реЗ strconv.Atoi(y) рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдЙрдард╛рдпрд╛ рдЬрд╛рдП; рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореИрдВ switch рдХреЛ if / else рдмрдпрд╛рдиреЛрдВ рдХреА рд╕рдордХрдХреНрд╖ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЬреИрд╕реЗ:

if x == rand.Int() {
  a()
} else if x == 5 {
  b()
} else if _v, _err := strconv.Atoi(y); _err != nil {
  return _err
} else if x == _v {
  b()
}

(рдРрд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рднреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдЖ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИред)

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ, рдореИрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рд╕реЗ check рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдПрд╕рдЯреА рдЕрдиреБрд╡рд╛рджрдХ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ go/* stdlib рд╕рдВрдХреБрд▓ рдХреЗ рд╣реИрдХ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛; рд╢рд╛рдпрдж рдХрдВрдкрд╛рдЗрд▓рд░ рдлреНрд░рдВрдЯ-рдПрдВрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдП? рдпрд╛ рдХреНрдпрд╛ рдореИрдВрдиреЗ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реАрдзрд╛ рддрд░реАрдХрд╛ рд╣реИ?

рдпрд╣ рднреА рджреЗрдЦреЗрдВ https://github.com/rhysd/trygo; рд░реАрдбрдореЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ try рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрд╕реА рдЪрд┐рдВрддрд╛ рдХреЛ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдпрд╣рд╛рдВ рдЙрдард╛ рд░рд╣рд╛ рд╣реВрдВ; рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦрдХ рдиреЗ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

@daved рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдХреЛрдб рд╢реВрдиреНрдп рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рд╕реНрдерд╛рдиреАрдп рд╕рдореНрдореЗрд▓рди, рд╢реИрд▓реА рдЕрдиреБрд╢рдВрд╕рд╛рдПрдВ, рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдЗрддреНрдпрд╛рджрд┐ рд╣реИрдВред (рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдпрд╣ рдХрд╣рд╛ рд╣реИ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рджреБрд░реБрдкрдпреЛрдЧ "рд╕рдВрднрд╛рд╡рдирд╛" рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ (рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИ)ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ $#$1 try defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХрдИ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕ рд╕рдЬрд╛рд╡рдЯ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╛ рд╢рд╛рдпрдж рдПрдХ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рдЬрд╛рд╡рдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рддрдВрддреНрд░ рдЬреЛ рдмрд┐рд▓ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдХреЛрдбрд┐рдВрдЧ рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛред рдЖрдЦрд┐рд░рдХрд╛рд░, "рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдореВрд▓реНрдп рд╣реИрдВ" рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рдХрд╛рд░рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдЕрдиреБрд╢рд╛рд╕рдирд╣реАрди рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдЦрд░рд╛рдм рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ рддрднреА рдорд╛рдиреНрдп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рди рд╣реЛ, рддреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ - рдЬрдм рддрдХ рд╣рдо рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рд╛рд╕рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рдорд▓рд╛)ред try рдареАрдХ рдпрд╣реА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреЛрдИ "рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░" рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

@dpinela рд╕рдВрдХрд▓рдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЗ рдЬреИрд╕реЗ switch if-else-if рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рд╕рд╛рде рд╣реА, "рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖" рдЬреЛ рд╕рдВрдХрд▓рдХ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ "go/ast" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖ рдирд╣реАрдВ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╡рд╛рдкрд╕ рдЧреЛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

@griesemer
рд╣рд╛рдВ, рдмрд┐рд▓реНрдХреБрд▓, рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдЖрдзрд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЧреНрд░реЗ рдХреНрд╖реЗрддреНрд░ рдЙрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдЖрдк рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХреЛ рдЖрдо рддреМрд░ рдкрд░ рд╣рдордореЗрдВ рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рджреВрд╕рд░реЛрдВ рдХреЛ рд╕рд┐рдЦрд╛рддреЗ рд╣реИрдВ (рд╣рдо, рдЬреЛ рд╕рдореБрджрд╛рдп рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ / рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ)ред рдореИрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ stdlib рдиреЗ рдЗрд╕реЗ рднрд░ рджрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рджреВрд╕рд░реЛрдВ рдХреЛ рдкрдврд╝рд╛рддреЗ рд╕рдордп, рд╕реНрдкрд╖реНрдЯ рд░рд┐рдЯрд░реНрди рдкрд░ рд╣рдореЗрд╢рд╛ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ "рдХрд╛рд▓реНрдкрдирд┐рдХ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдУрд░ рдореБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдкрдХреНрд╡рддрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рджреЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╢реБрд░реВ рд╕реЗ рд╣реА рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд╛рд░реНрдб-рдЯреВ-рд░реАрдб рдХреЛрдб (рдпрд╛рдиреА рдмреБрд░реА рдЖрджрддреЗрдВ) рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдорд┐рд▓реЗрдЧрд╛ред рдпрд╣, рдлрд┐рд░ рд╕реЗ, рд╡рд╣ рд╕реНрд╡рд░-рдмрд╣рд░рд╛рдкрди рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдпрд╛ рдЖрд╕реНрдердЧрд┐рдд рдореВрд▓реНрдп рд╣реЗрд░рдлреЗрд░ рдХреЛ рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЬрдм рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрддреА рд╣реИ рдХрд┐ рдпреЗ рдХреНрд╖рдорддрд╛рдПрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреНрдп рдЕрдиреБрднрд╡реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХ рдХрдареЛрд░ рд░реБрдЦ рдЕрдкрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдлрд┐рд░ рднреА, рдЗрди рдХрдо рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдирд╛рдЬреБрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЗрддрдиреЗ рд╡реНрдпрд╛рдкрдХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВрдиреЗ рдХрднреА рдХрд▓реНрдкрдирд╛ рдХреА рдереАред рдХреНрдпрд╛ рдЬрд╛рджреВ рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкреЛрдВ рдХреЗ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдЬрд╛рдирдмреВрдЭрдХрд░ рдмрджрд▓рд╛рд╡ рд╣реИ? рдХреНрдпрд╛ рд╣рдореЗрдВ рдбреАрдЖрдИрд╕реА рдФрд░ рдЕрдиреНрдп рд╣рд╛рд░реНрдб-рдЯреВ-рдбреАрдмрдЧ рддрдВрддреНрд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рднреА рдЬреЛрд░ рджреЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдкреАрдПрд╕ рдЖрдкрдХрд╛ рд╕рдордп рдмрд╣реБрдд рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реИред рдЖрдкрдХреА рдЯреАрдо рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдореЗрд░рд╛ рд╕рдореНрдорд╛рди рдФрд░ рджреЗрдЦрднрд╛рд▓ рд╣реИред рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдмреЛрд▓рдиреЗ рдореЗрдВ рдХреЛрдИ рджреБрдЦ рд╣реЛ; рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрд░реА/рд╣рдорд╛рд░реА рдЪрд┐рдВрддрд╛ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рд╕реБрдиреЗрдВрдЧреЗ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ "рдлреНрд░рдВрдЯ-рд▓рд╛рдЗрдиреНрд╕" рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рдореЗрд░реЗ рдбрд╛рдЙрдирд╡реЛрдЯ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдирд╛ред

рд╣рд╛рде рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП:

1) рдореИрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдХреЗ рдкрд╣рд▓реЗ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рдмрдирд╛рдо рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

2) рд╢рдмреНрджрд╛рд░реНрде, "рдХреЛрд╢рд┐рд╢" рдПрдХ рдмрд┐рдЬрд▓реА рдХреА рдЫрдбрд╝ рд╣реИред рдФрд░, рдЬрдм рддрдХ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ, "рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ" рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ guard рдпрд╛ ensure рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

3) рдЗрди рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдЦрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИред

try/guard/ensure рдЕрд╡рдзрд╛рд░рдгрд╛ рдмрдирд╛рдо if err != nil рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЖрдкрддреНрддрд┐ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ:

1) рдпрд╣ рдЧреЛрд▓рд╛рдВрдЧ рдХреЗ рдореВрд▓ рдЬрдирд╛рджреЗрд╢реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдорд╛рдирд╛ рдерд╛) рд╕реНрдкрд╖реНрдЯ, рдкрдврд╝рдиреЗ/рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди, рдмрд╣реБрдд рдХрдо 'рдЬрд╛рджреВ' рдХреЗ рд╕рд╛рдеред

2) рдпрд╣ рд╕рд╣реА рд╕рдордп рдкрд░ рдЖрд▓рд╕реНрдп рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдЧрд╛ рдЬрдм рд╡рд┐рдЪрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: "рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдХреНрдпрд╛ рд╣реИ?"ред рдХрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ "рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ" рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреИрд╕реЗ рдлрд╛рдЗрд▓реЗрдВ рдЦреЛрд▓рдирд╛, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рдЖрджрд┐ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк "рдХреЛрд╢рд┐рд╢реЛрдВ" рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдлрд▓рддрд╛ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдВрддрддрдГ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ " trys" рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмреИрдХрдСрдлрд╝/рдкреБрди: рдкреНрд░рдпрд╛рд╕, рд▓реЙрдЧрд┐рдВрдЧ/рдЯреНрд░реЗрд╕рд┐рдВрдЧ, рдФрд░/рдпрд╛ рдХреНрд▓реАрдирдЕрдк рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред "рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ" рдХреА рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИред

рдпрд╣рд╛рдБ рдХреБрдЫ рдФрд░ рдХрдЪреНрдЪреЗ tryhard рдЖрдБрдХрдбрд╝реЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред ;-)

godoc.org рдкрд░ рдкрд╣рд▓реЗ 20 "рд▓реЛрдХрдкреНрд░рд┐рдп рдкреИрдХреЗрдЬ"

рдпреЗ рд╡реЗ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╣реИрдВ рдЬреЛ https://godoc.org рдкрд░ рдкрд╣рд▓реЗ 20 рд▓реЛрдХрдкреНрд░рд┐рдп рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдХреЛрд╢рд┐рд╢ рдЙрдореНрдореАрджрд╡рд╛рд░ рдкреНрд░рддрд┐рд╢рдд рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ tryhard рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ vendor рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрди 20 рд░реЗрдкреЛ рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдФрд╕рдд рдореВрд▓реНрдп 58% рд╣реИред

| рдкрд░рд┐рдпреЛрдЬрдирд╛ | рд╕реНрдерд╛рдиреАрдп | рдЕрдЧрд░ рдПрд╕рдЯреАрдПрдо | рдЕрдЧрд░ != рд╢реВрдиреНрдп (рдпрджрд┐ рдХрд╛ %) | рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рдпрджрд┐ рдХрд╛%!= рд╢реВрдиреНрдп) |
|-----------|-----|---------------|----------------- -----|---------------
| github.com/google/uuid | 1714 | 12 | 16.7% | 0.0% |
| github.com/pkg/рддреНрд░реБрдЯрд┐рдпрд╛рдБ | 1886 | 10 | 0.0% | 0.0% |
| github.com/aws/aws-sdk-go | 1911309 | 32015 | 9.4% | 8.9% |
| github.com/jinzhu/gorm | 15246 | 44 | 11.4% | 20.0% |
| github.com/robfig/cron | 1911 | 20 | 35.0% | 28.6% |
| github.com/gorilla/websocket | 6959 | 212 | 32.5% | 39.1% |
| github.com/dgrijalva/jwt-go | 3270 | 118 | 29.7% | 40.0% |
| github.com/gomodule/redigo | 7119 | 187 | 34.8% | 41.5% |
| github.com/unixpickle/kahoot-hack | 1743 | 52 | 75.0% | 43.6% |
| github.com/lib/pq | 13396 | 239 | 30.1% | 55.6% |
| github.com/sirupsen/logrus | 5063 | 29 | 17.2% | 60.0% |
| github.com/prometheus/client_golang | 17791 | 194 | 49.0% | 62.1% |
| github.com/go-redis/redis | 21182 | 326 | 42.6% | 73.4% |
| github.com/mongodb/mongo-go-driver | 86605 | 2097 | 37.8% | 73.9% |
| github.com/uber-go/zap | 15363 | 84 | 36.9% | 74.2% |
| github.com/golang/protobuf | 42959 | 685 | 22.9% | 77.1% |
| github.com/gin-gonic/gin | 14574 | 96 | 53.1% | 86.3% |
| github.com/go-pg/pg | 26369 | 831 | 37.7% | 86.9% |
| github.com/Shopify/sarama | 36427 | 1369 | 68.2% | 91.0% |
| github.com/stretchr/testify | 13496 | 32 | 43.8% | 92.9% |

" if stmts " рдХреЙрд▓рдо рдХреЗрд╡рд▓ if рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрдердиреЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдХрд┐ tryhard рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ gorm рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдХрдо рдХреНрдпреЛрдВ рд╣реИ

10 рд╡рд┐рд╡рд┐рдзред "рдмрдбрд╝реЗ" рдЬрд╛рдУ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ

Godoc.org рдкрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреИрдХреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреИрдХреЗрдЬ рд╣реЛрддреЗ рд╣реИрдВ, рдореИрдВ рдХреБрдЫ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдЖрдБрдХрдбрд╝реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдпреЗ рд╡рд┐рд╡рд┐рдз рд╣реИрдВред рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдереАрдВ (рдпрд╛рдиреА, рдЗрди 10 рдХреЗ рдкреАрдЫреЗ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдирд╣реАрдВ)ред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдЙрдореНрдореАрджрд╡рд╛рд░ рдкреНрд░рддрд┐рд╢рдд рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрди 10 рд░реЗрдкреЛ рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдФрд╕рдд рдореВрд▓реНрдп 59% рд╣реИред

| рдкрд░рд┐рдпреЛрдЬрдирд╛ | рд╕реНрдерд╛рдиреАрдп | рдЕрдЧрд░ рдПрд╕рдЯреАрдПрдо | рдЕрдЧрд░ != рд╢реВрдиреНрдп (рдпрджрд┐ рдХрд╛ %) | рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рдпрджрд┐ рдХрд╛%!= рд╢реВрдиреНрдп) |
|-----------|-----|---------------|----------------- -----|------------------------------------------|
| github.com/juju/juju | 1026473 | 26904 | 51.9% | 17.5% |
| github.com/go-kit/kit | 38949 | 467 | 57.0% | 51.9% |
| github.com/boltdb/рдмреЛрд▓реНрдЯ | 12426 | 228 | 46.1% | 53.3% |
| github.com/hashicorp/consul | 249369 | 5477 | 47.6% | 54.5% |
| github.com/docker/docker | 251152 | 8690 | 48.7% | 56.8% |
| github.com/istio/istio | 429636 | 7564 | 40.4% | 61.9% |
| github.com/gohugoio/hugo | 94875 | 1853 | 42.4% | 64.8% |
| github.com/etcd-io/etcd | 209603 | 4657 | 38.3% | 65.5% |
| github.com/kubernetes/kubernetes | 1789172 | 40289 | 43.3% | 66.5% |
| github.com/cockroachdb/cockroach | 1038529 | 22018 | 39.9% | 74.0% |


рдмреЗрд╢рдХ рдпреЗ рджреЛ рдЯреЗрдмрд▓ рдХреЗрд╡рд▓ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдирдореВрдиреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдиреЗ-рдорд╛рдиреЗ рд▓реЛрдЧреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдЬреА рдХреЛрдб рдЖрдзрд╛рд░ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд┐рдзрддрд╛ рджрд┐рдЦрд╛рдПрдВрдЧреЗ, рдФрд░ рдЗрд╕рдХреЗ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдмреВрдд рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@thepudds , рдЬреЛ рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ _tryhard_ рдЬреИрд╕рд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ "рдЧреИрд░-рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░" рджреЗрддрд╛ рд╣реИред

@networkimprov рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХрдо рд╕реЗ рдХрдо gorm рдХреЗ рд▓рд┐рдП рдпреЗ рдирд╡реАрдирддрдо tryhard рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред "рдЧреИрд░-рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░" рдХреЗрд╡рд▓ рдЙрдкрд░реЛрдХреНрдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред

@daved рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ/рд╣рдо рдЖрдкрдХреЛ рдЬреЛрд░ рд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрдирддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЕрднреА рднреА рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВред рдЪрд▓реЛ рдмрдВрджреВрдХ рдирд╣реАрдВ рдХреВрджрддреЗред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ (рдФрд░ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ) рдХрд┐ рдЧреЛ рдкрдврд╝рд╛рддреЗ рд╕рдордп рдХреЛрдИ рдЕрдзрд┐рдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪреБрдирдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рдзрдиреНрдпрд╡рд╛рджред

@griesemer FYI рдпрд╣рд╛рдБ рдХреЛрдб рдХреА 233k рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдирд╣реАрдВ рд╣реИ:

--- stats ---
   8760 (100.0% of    8760) functions (function literals are ignored)
   2942 ( 33.6% of    8760) functions returning an error
  22991 (100.0% of   22991) statements in functions returning an error
   5548 ( 24.1% of   22991) if statements
   2929 ( 52.8% of    5548) if <err> != nil statements
    163 (  5.6% of    2929) try candidates
      0 (  0.0% of    2929) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
   2213 ( 75.6% of    2929) { return ... zero values ..., expr }
    167 (  5.7% of    2929) single statement then branch
    253 (  8.6% of    2929) complex then branch; cannot use try
     14 (  0.5% of    2929) non-empty else branch; cannot use try

рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 if err != nil {
     return ... zero values ..., errors.Wrap(err)
 }

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ tryhard рдпрд╣ рдкрд╣рдЪрд╛рди рд╕рдХреЗ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдРрд╕реЗ рд╕рднреА рднрд╛рд╡ рдПрдХ рд╕рдорд╛рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╛рдиреА рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп defer рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреЗ рдЬреАрд╕реАрдкреА рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдг рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:

$ tryhard -r .
--- stats ---
    129 (100.0% of     129) functions (function literals are ignored)
     75 ( 58.1% of     129) functions returning an error
    725 (100.0% of     725) statements in functions returning an error
    164 ( 22.6% of     725) if statements
     93 ( 56.7% of     164) if <err> != nil statements
     64 ( 68.8% of      93) try candidates
      0 (  0.0% of      93) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
     17 ( 18.3% of      93) { return ... zero values ..., expr }
      7 (  7.5% of      93) single statement then branch
      1 (  1.1% of      93) complex then branch; cannot use try
      0 (  0.0% of      93) non-empty else branch; cannot use try

рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЖрдЧреЗ рдмрдврд╝рдХрд░ рдХреЛрдб рдореЗрдВ рдЙрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬреЛ рдЕрднреА рднреА err рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рдкреИрдЯрд░реНрди рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

err s . рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛

рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░, рд╣рдо рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд░рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╣реБрдИ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рд╣реЛ рдЬреЛ try рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХреАрдХреГрдд рд╣реЛ рдпрд╛ рдмрд╣реБ-рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдЧреЛ рдореЗрдВ рд╣реА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реЛред

var errs []error
for _, p := range toDelete {
    fmt.Println("delete:", p.ProjectID)
    if err := s.DeleteProject(ctx, p.ProjectID); err != nil {
        errs = append(errs, err)
    }
}

рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдЬрд┐рдореНрдореЗрджрд╛рд░реА

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдЪрд╛рдирдХ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрднрд╛рд╡рд┐рдд try рдорд╛рдорд▓реЗ рдореЗрд░реЗ рдзреНрдпрд╛рди рдореЗрдВ рдЖрдПред рд╡реЗ рд╕рднреА рд╕рдорд╛рди рд╣реИрдВ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд╕рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func run() error {
    key := "MY_ENV_VAR"
    client, err := ClientFromEnvironment(key)
    if err != nil {
        // "github.com/pkg/errors"
        return errors.Wrap(err, key)
    }
    // do something with `client`
}

func ClientFromEnvironment(key string) (*http.Client, error) {
    filename, ok := os.LookupEnv(key)
    if !ok {
        return nil, errors.New("environment variable not set")
    }
    return ClientFromFile(filename)
}

рдЧреЛ рдмреНрд▓реЙрдЧ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рдХреЛ рдпрд╣рд╛рдБ рдлрд┐рд░ рд╕реЗ рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реБрдП:

рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рддреНрд░реБрдЯрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред os.Open рд╕реНрд╡рд░реВрдкреЛрдВ рджреНрд╡рд╛рд░рд╛ "рдЦреБрд▓реА/рдЖрджрд┐/рдкрд╛рд╕рд╡рд╛рд░реНрдб: рдЕрдиреБрдорддрд┐ рдЕрд╕реНрд╡реАрдХреГрдд" рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐, рди рдХрд┐ рдХреЗрд╡рд▓ "рдЕрдиреБрдорддрд┐ рдЕрд╕реНрд╡реАрдХреГрдд"ред рд╣рдорд╛рд░реЗ Sqrt рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЕрдорд╛рдиреНрдп рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЕрдм рдмрди рдЬрд╛рддрд╛ рд╣реИ:

func run() error {
    key := "MY_ENV_VAR"
    client := try(ClientFromEnvironment(key))
    // do something with `client`
}

func ClientFromEnvironment(key string) (*http.Client, error) {
    filename, ok := os.LookupEnv(key)
    if !ok {
        return nil, fmt.Errorf("environment variable not set: %s", key)
    }
    return ClientFromFile(filename)
}

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдПрдХ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЕрдиреБрдорд╛рди рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ try рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рд╕реНрд░реЛрдд рдпрд╛ рдкреИрдХреЗрдЬ рдХреЗ рдХрд░реАрдм рдмреЗрд╣рддрд░ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рддреНрд░реБрдЯрд┐ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЕрдВрддрд┐рдо рдиреЛрдЯреНрд╕

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try рдЬреЛ рдореВрд▓реНрдп рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд▓рд╛ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рдЙрди рд╕рдВрднрд╛рд╡рд┐рдд рдореБрджреНрджреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдЬреЛ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЬреЛ рд╣реИрдВ:

  1. рдПрдХ рдХреАрд╡рд░реНрдб рдмреЗрд╣рддрд░ "рдорд╣рд╕реВрд╕" рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ try рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред
  2. try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдм рдЖрдк return err рдорд╛рдорд▓реЗ рдореЗрдВ рдбреАрдмрдЧ рд╕реНрдЯреЙрдкрд░ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЪреВрдВрдХрд┐ рдЙрди рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдпреЗ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛" рдореЗрдВ рдХреИрд╕реЗ рдЦреЗрд▓реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЙрдирдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЕрджреНрдпрддрди

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдлрд┐рдХреНрд╕реНрдб рдЬреЛ рдкрд╣рд▓реЗ error рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП @magical рдзрдиреНрдпрд╡рд╛рдж!

func main() {
    key := "MY_ENV_VAR"
    client := try(ClientFromEnvironment(key))
    // do something with `client`
}

@mrkanister рдирд╛рдЗрдЯрдкрд┐рдХрд┐рдВрдЧ, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ main рдПрдХ error рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдкреНрд░рд╢рдВрд╕рд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгреА рд╣реИ;
рдзрдиреНрдпрд╡рд╛рдж @griesemer рдмрд╛рдЧрд╡рд╛рдиреА рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП, рдХрд┐ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдФрд░ рд╕рд╛рде рд╣реА рдХрд╣реАрдВ рдФрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА рдХрдИ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ (https://github.com/golang/go/issues/32437#issuecomment-509974901 рд╕реЗ):

if !ok {
    return nil, fmt.Errorf("environment variable not set: %s", key)
}

рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рд╢рд░реНрдд рд╕рддреНрдп рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:

try(condErrorf(!ok, "environment variable not set: %s", key))

рдПрдХ рдмрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреА рдкрд╣рдЪрд╛рди рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдкрд╣рд▓реЗ рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдкрд░, рдФрд░ рд╢рд╛рдпрдж рдЕрдВрддрддрдГ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рддрдХ рдкрд╣реБрдВрдЪрдирд╛ред рдЯреНрд░рд╛рдИрд╣рд╛рд░реНрдб рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЕрджреНрднреБрдд рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИред

рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдЕрдЧрд░

рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдпрджрд┐ @zeebo рдФрд░ рдЕрдиреНрдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдПрдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдлреЙрд░реНрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ != nil рдФрд░ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ:

if err return err
if err return errors.Wrap(err, "foo: failed to boo")
if err return fmt.Errorf("foo: failed to boo: %v", err)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд░рд▓, рд╣рд▓реНрдХрд╛ рдФрд░ рдкрдардиреАрдп рд╣реИред рджреЛ рднрд╛рдЧ рд╣реИрдВ:

  1. рдЕрдЧрд░ рдХрдерди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдЖрдо рддреМрд░ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░рддреЗ рд╣реИрдВ)ред IMHO рдпрд╣ рдШрдирддреНрд╡ рдХреЛ рдХрдо рдХрд░рдХреЗ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИред
  2. if variable return ... рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВред рдЪреВрдВрдХрд┐ return рдмрд╛рдИрдВ рдУрд░ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рд╕реНрдХрд┐рдо рдХрд░рдирд╛ рдЕрднреА рднреА рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ - рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдард┐рдирд╛рдИ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди ifs (?) рдХреЗ рдЦрд┐рд▓рд╛рдл рдореБрдЦреНрдп рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЧреЛ рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд╕рд╛рд▓ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ if рдХрдерди рд╕реЗ рдХреЛрд╖реНрдардХ рдХреЛ рд╣рдЯрд╛рдХрд░ред

рд╡рд░реНрддрдорд╛рди рд╢реИрд▓реА:

a, err := BusinessLogic(state)
if err != nil {
   return nil, err
}

рдПрдХ-рдкрдВрдХреНрддрд┐ рдпрджрд┐:

a, err := BusinessLogic(state)
if err != nil { return nil, err }

рдПрдХ-рдкрдВрдХреНрддрд┐ рдХреЙрдореНрдкреИрдХреНрдЯ рдпрджрд┐:

a, err := BusinessLogic(state)
if err return nil, err
a, err := BusinessLogic(state)
if err return nil, errors.Wrap(err, "some context")
func (c *Config) Build() error {
    pkgPath, err := c.load()
    if err return nil, errors.WithMessage(err, "load config dir")

    b := bytes.NewBuffer(nil)
    err = templates.ExecuteTemplate(b, "main", c)
    if err return nil, errors.WithMessage(err, "execute main template")

    buf, err := format.Source(b.Bytes())
    if err return nil, errors.WithMessage(err, "format main template")

    target := fmt.Sprintf("%s.go", filename(pkgPath))
    err = ioutil.WriteFile(target, buf, 0644)
    if err return nil, errors.WithMessagef(err, "write file %s", target)

    // ...
}

@eug48 #32611 рджреЗрдЦреЗрдВ

рдпрд╣рд╛рдБ рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдЖрдБрдХрдбрд╝реЗ рд╣реИрдВ (рд╡реЗрдВрдбрд░ рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЧреЛ рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 2,282,731):

--- stats ---
 117551 (100.0% of  117551) functions (function literals are ignored)
  35726 ( 30.4% of  117551) functions returning an error
 263725 (100.0% of  263725) statements in functions returning an error
  50690 ( 19.2% of  263725) if statements
  25042 ( 49.4% of   50690) if <err> != nil statements
  12091 ( 48.3% of   25042) try candidates
     36 (  0.1% of   25042) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
   3561 ( 14.2% of   25042) { return ... zero values ..., expr }
   3304 ( 13.2% of   25042) single statement then branch
   4966 ( 19.8% of   25042) complex then branch; cannot use try
    296 (  1.2% of   25042) non-empty else branch; cannot use try

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд▓реЛрдЧ рдЕрднреА рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реНрдпрд╛рдкрдХ рдЧреЛ рд╕рдореБрджрд╛рдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирдИ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдХреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореИрдВрдиреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреЗрдЦрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╛рдордХрд░рдг рдпрд╛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреА рд░рд╛рдп рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХреЛ рддрдЯрд╕реНрде рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред

рдпрджрд┐ рд▓реЛрдЧ рднрд╛рдЧ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓рд┐рдВрдХ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

https://forms.gle/gaCBgxKRE4RMCz7c7

рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдпрд╣ рдЪрд░реНрдЪрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

if err := os.Setenv("GO111MODULE", "on"); err != nil {
    return err
}

рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╕реНрдердЧрд┐рдд рд╣реИрдВрдбрд▓рд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдпрд╣ рдХрд╛рдлреА рддреЗрдЬреА рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдпрд╣ рдЕрдм рддрдХ рдХрд╛ рдорд╛рдирдХ рд╣реИред

рдУрд╣, рдФрд░ рдХреГрдкрдпрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ try , рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рднреА рдкрд╛рдП рдЧрдПред

--- stats ---
    929 (100.0% of     929) functions (function literals are ignored)
    230 ( 24.8% of     929) functions returning an error
   1480 (100.0% of    1480) statements in functions returning an error
    320 ( 21.6% of    1480) if statements
    206 ( 64.4% of     320) if <err> != nil statements
    109 ( 52.9% of     206) try candidates
      2 (  1.0% of     206) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
     53 ( 25.7% of     206) { return ... zero values ..., expr }
     18 (  8.7% of     206) single statement then branch
     17 (  8.3% of     206) complex then branch; cannot use try
      2 (  1.0% of     206) non-empty else branch; cannot use try

@lpar рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдРрд╕рд╛ рди рдХрд░реЗрдВред рдпрд╣ try рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рдЧреЛ-рдирдЯреНрд╕ред рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪрд░реНрдЪрд╛ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджреЗ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

@fabstu defer рд╣реИрдВрдбрд▓рд░ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ try ред рд╕рдВрд▓рдЧреНрди рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛:

func f() (err error) {
    defer func() {
       if err != nil {
          err = decorate(err, "msg") // here you can modify the result error as you please
       }
    }()
    ...
    if err := os.Setenv("GO111MODULE", "on"); err != nil {
        return err
    }
    ...
}

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо err рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ return err ; рдФрд░ err рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ return рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ if рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдпрд╛, try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬреЛ рд╕реНрдерд╛рдиреАрдп err рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛:

func f() (err error) {
    defer func() {
       if err != nil {
          err = decorate(err, "msg") // here you can modify the result error as you please
       }
    }()
    ...
    try(os.Setenv("GO111MODULE", "on"))
    ...
}

рдФрд░ рд╕рдВрднрд╡рддрдГ, рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд errors/errd рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:

func f() (err error) {
    defer errd.Wrap(&err, ... )
    ...
    try(os.Setenv("GO111MODULE", "on"))
    ...
}

рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдпрд╣ рдмрд╕ рд╣реЛрдЧрд╛:

func f() error {
    ...
    try(os.Setenv("GO111MODULE", "on"))
    ...
}

@fastu рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдк errors/errd рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рдирд╛ try рдХреЗ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:

func f() (err error) {
    defer errd.Wrap(&err, ... )
    ...
    if err := os.Setenv("GO111MODULE", "on"); err != nil {
        return err
    }
    ...
}

рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдБ рдЙрддрдирд╛ рд╣реА рдореБрдЭреЗ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рдЖрддрд╛ рд╣реИред
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддреА рд╣реИ, рд╡рд╣ рд╣реИ рд╣рд░ рдЬрдЧрд╣ рдирд╛рдорд╛рдВрдХрд┐рдд рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрддрдГ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдХрднреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА)?

рд╡реИрд╕реЗ рднреА, рдореЗрд░реЗ рд╕рднреА рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛?

func f() error {
  var err error
  defer errd.Wrap(&err,...)
  try(...)
}

@flibustenet рдирд╛рдорд╛рдВрдХрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдпрдВ рдПрдХ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ; рдирд╛рдорд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ naked returns ; рдпрд╛рдиреА, рдХреЛрдИ рднреА рдХреЗрд╡рд▓ return w/o рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ _рдХреЗ рд╕рд╛рде return _ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ (рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ!) рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рддрд░реНрдХ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдХреЗрд╡рд▓ return рдХрдерди рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЪреВрдХ рд╕рдХрддрд╛ рд╣реИ, рдЗрддреНрдпрд╛рджрд┐ред рддреЛ рдХреБрдЫ рдХреЛрдб рдЖрдзрд╛рд░реЛрдВ рдореЗрдВ, рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХреЛ рдХреЗрд╡рд▓ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЕрдорд╛рдиреНрдп рд╣реИрдВ, рддреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рдмрд╛рдХреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдирдЧреНрди рд╡рд╛рдкрд╕реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рд▓рдЧрд╛рддрд╛рд░ рд╕реЗрдЯ рд╣реЛред try рдареАрдХ рдпрд╣реА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ, рдирд╛рдорд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рддрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдЬрдм рдЖрдк defer рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреВрд░реА рддрд░рд╣ рдЦрддреНрдо рд╣реЛ рдЬрд╛рдПрдЧреАред

рдЖрдкрдХреЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ try _always_ _result error_ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдирд╛рдо рд╣реИ)ред рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд╛рдиреАрдп рдЪрд░ err рдШреЛрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ errd.Wrap рдЙрд╕реА рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ try рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рддреНрд╡рд░рд┐рдд рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ: рдореИрдВ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

func Handler(w http.ResponseWriter, r *http.Request) {
        ctx := r.Context()
        id := chi.URLParam(r, "id")

        var err error
        // starts as bad request, then it's an internal server error after we parse inputs
        var statusCode = http.StatusBadRequest

        defer func() {
            if err != nil {
                wrap := xerrors.Errorf("handler fail: %w", err)
                logger.With(zap.Error(wrap)).Error("error")
                http.Error(w, wrap.Error(), statusCode)
            }
        }()
        var c Thingie
        err = unmarshalBody(r, &c)
        if err != nil {
            return
        }
        statusCode = http.StatusInternalServerError
        s, err := DoThing(ctx, c)
        if err != nil {
            return
        }
        d, err := DoThingWithResult(ctx, id, s)
        if err != nil {
            return
        }
        data, err := json.Marshal(detail)
        if err != nil {
            return
        }
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusCreated)
        _, err = w.Write(data)
        if err != nil {
            return
        }
}

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ try рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрджреЗрд╢ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╕рднреА рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк try рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ error рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ func() error рдХреЗ рд╕рд╛рде рд╢рд░реАрд░ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ...рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдФрд░ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИред

@jonbodner

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (https://play.golang.org/p/NaBZe-QShpu):

package main

import (
    "errors"
    "fmt"

    "golang.org/x/xerrors"
)

func main() {
    var err error
    defer func() {
        filterCheck(recover())
        if err != nil {
            wrap := xerrors.Errorf("app fail (at count %d): %w", ct, err)
            fmt.Println(wrap)
        }
    }()

    check(retNoErr())

    n, err := intNoErr()
    check(err)

    n, err = intErr()
    check(err)

    check(retNoErr())

    check(retErr())

    fmt.Println(n)
}

func check(err error) {
    if err != nil {
        panic(struct{}{})
    }
}

func filterCheck(r interface{}) {
    if r != nil {
        if _, ok := r.(struct{}); !ok {
            panic(r)
        }
    }
}

var ct int

func intNoErr() (int, error) {
    ct++
    return 0, nil
}

func retNoErr() error {
    ct++
    return nil
}

func intErr() (int, error) {
    ct++
    return 0, errors.New("oops")
}

func retErr() error {
    ct++
    return errors.New("oops")
}

рдЖрд╣, рдкрд╣рд▓рд╛ рдбрд╛рдЙрдирд╡реЛрдЯ! рдЕрдЪреНрдЫрд╛ред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдХреЛ рдЕрдкрдиреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╣рдиреЗ рджреЗрдВред

рдореЗрд░реЗ рдХреБрдЫ рдХреЛрдбрдмреЗрд╕ рдкрд░ tryhard рджреМрдбрд╝рд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рдХреБрдЫ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ 0 рдмрд╣реБрдд рдмрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдЖрдЬрдорд╛рдПрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдмрдирд╛рддреЗ рд╕рдордп, рдореИрдВ рдЕрдкрдиреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдкрд░рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП SanitizedError s рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ error s рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрде рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд╣реИрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓реАрдХред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╡рд┐рдзрд┐ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:

func (a *App) GetFriendsOfUser(userId model.Id) ([]*model.User, SanitizedError) {
    if user, err := a.GetUserById(userId); err != nil {
        // (*App).GetUserById returns (*model.User, SanitizedError)
        // This could be a try() candidate.
        return err
    } else if user == nil {
        return NewUserError("The specified user doesn't exist.")
    }

    friends, err := a.Store.GetFriendsOfUser(userId)
    // (*Store).GetFriendsOfUser returns ([]*model.User, error)
    // This could be a SQL error or a network error or who knows what.
    return friends, NewInternalError(err)
}

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рддрдм рддрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬрдм рддрдХ рдХрд┐ рд╕рдВрд▓рдЧреНрди рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдХреЛрд╢рд┐рд╢ рдлрд╝рдВрдХреНрд╢рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреЛрдиреЛрдВ рдХреЗ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ? рдпрд╣ рдЕрднреА рднреА рдХрд┐рд╕реА рднреА рдареЛрд╕ рд╢реВрдиреНрдп -> тАЛтАЛрдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреНрд░рдо рд╕реЗ рдмрдЪ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдЬреИрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж, @jonbodner , рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдореИрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦреВрдВрдЧрд╛ (рдЕрдиреБрд╡рд╛рдж рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж):

func Handler(w http.ResponseWriter, r *http.Request) {
    statusCode, err := internalHandler(w, r)
    if err != nil {
        wrap := xerrors.Errorf("handler fail: %w", err)
        logger.With(zap.Error(wrap)).Error("error")
        http.Error(w, wrap.Error(), statusCode)
    }
}

func internalHandler(w http.ResponseWriter, r *http.Request) (statusCode int, err error) {
    ctx := r.Context()
    id := chi.URLParam(r, "id")

    // starts as bad request, then it's an internal server error after we parse inputs
    statusCode = http.StatusBadRequest
    var c Thingie
    try(unmarshalBody(r, &c))

    statusCode = http.StatusInternalServerError
    s := try(DoThing(ctx, c))
    d := try(DoThingWithResult(ctx, id, s))
    data := try(json.Marshal(detail))

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusCreated)
    try(w.Write(data))

    return
}

рдпрд╣ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ (29 рд▓рд╛рдЗрдиреЗрдВ рдмрдирд╛рдо 40 рд▓рд╛рдЗрдиреЗрдВ) - рдФрд░ рдореИрдВрдиреЗ рдЕрдЪреНрдЫреА рд░рд┐рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ - рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ defer рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ defer , рд╕рд╛рде рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЛ рдиреАрдЪреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ defer рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореВрд▓ рдХреЛрдб рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред рдирдпрд╛ рдХреЛрдб, рдЬрдмрдХрд┐ рдпрд╣ рдирд╛рдорд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдПрдХ рдирдЧреНрди рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ return statusCode, nil рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ) рд╕рд░рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ" рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред

рдмрд╕ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ рджреЛрдмрд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ https://github.com/golang/go/issues/32853#issuecomment -510340544

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ funcname рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╣реИред

func foo() error {
    handler := func(err error, funcname string) error {
        return fmt.Errorf("%s: %v", funcname, err) // wrap something
        //return nil // or dismiss
    }

    a, b := try(bar1(), handler) 
    c, d := try(bar2(), handler) 
}

@ccbrown рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдКрдкрд░ рдХреЗ рд╕рдорд╛рди рдЙрдкрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛; рдпрд╛рдиреА, рдЕрдЧрд░ рдпрд╣ рдХрд╛рд░рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдмрд╛рд░ (рдПрдХ рд╕рдВрд▓рдЧреНрди рдХрд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛) рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдЬрдЧрд╣ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп)ред рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ (рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдЬрд╛рдирдирд╛) рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рддреНрд░реБрдЯрд┐ рд▓рдкреЗрдЯрдиреЗ рдХреЛ рдХреЗрдВрджреНрд░реАрдХреГрдд рдХрд░реЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдореБрдЭреЗ try рдХреЛ рдПрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ (рдФрд░ рдПрдХ рдХреЛ рднреА рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВ)ред рдореБрдЭреЗ рдЗрд╕ рд╕рдордп рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИ (рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЗрд╕реЗ рд╕рдордЭрд╛рдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ) - рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░рдХрд╛рд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдЬрд▓реНрджреА рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ try рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ error рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░, рдФрд░ рдкрд░реАрдХреНрд╖рдг err != nil рддрдм рд╣реЛрдЧрд╛ x != zero рдмрдиреЗрдВ рдЬрд╣рд╛рдВ x err (рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ zero рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд╢реВрдиреНрдп рдорд╛рди x рд╣реИ bool рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди false рд╣реИ рдФрд░ ok != false рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИ рд╣рдо рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

@lunny try рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@griesemer рдУрд╣ред рдХрд┐рддрдиреЗ рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ! рдЕрдиреНрдпрдерд╛ рдореИрдВ github.com/pkg/errors рдФрд░ рд╕рднреА errors.Wrap рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВред

@ccbrown рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдКрдкрд░ рдХреЗ рд╕рдорд╛рди рдЙрдкрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛; рдпрд╛рдиреА, рдЕрдЧрд░ рдпрд╣ рдХрд╛рд░рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдмрд╛рд░ (рдПрдХ рд╕рдВрд▓рдЧреНрди рдХрд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛) рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдЬрдЧрд╣ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп)ред рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ (рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдЬрд╛рдирдирд╛) рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рддреНрд░реБрдЯрд┐ рд▓рдкреЗрдЯрдиреЗ рдХреЛ рдХреЗрдВрджреНрд░реАрдХреГрдд рдХрд░реЗрдЧрд╛ред

@griesemer рдПрдХ рд╕рдВрд▓рдЧреНрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп error рд▓реМрдЯрдиреЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдЖрдВрддрд░рд┐рдХ рддреНрд░реБрдЯрд┐, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреНрд░реБрдЯрд┐, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рддреНрд░реБрдЯрд┐ рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рд╣реИ, рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдФрд░ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ try рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди defer рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЕрднреА рднреА if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ рдЬрдмрдХрд┐ рдЖрдк try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ try рдФрд░ defer рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд┐рдирд╛ $ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕реЗ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдХреЗрд╡рд▓ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреНрдпрд╛рджрд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

@ccbrown рд╕рдордЭ рдЧрдпрд╛ред рдкреВрд░реНрд╡-рдирд┐рд░реАрдХреНрд╖рдг рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рд╕реБрдЭрд╛рдИ рдЧрдИ рдЫреВрдЯ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ (рдФрд░ рдорд┐рд▓рд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП try рдЖрд░рд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рди рдХреЗрд╡рд▓ error , рдЬрдм рддрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкрд░реАрдХреНрд╖рдг x != nil рд░рд╣рддрд╛ рд╣реИ . рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдпреЗред рдпрд╣ рдЬрд▓реНрджреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдкреВрд░реНрд╡-рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкрд┐рдЫрдбрд╝рд╛-рд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рдЬреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИред

@jonbodner рдЙрджрд╛рд╣рд░рдг , рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ @griesemer рдиреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рдХреЛрдб рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ try рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ try рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХреЛрдИ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реИ:

рдбреЗрдЯрд╛: = рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдЬреЗрд╕рдиред рдорд╛рд░реНрд╢рд▓ (рд╡рд┐рд╕реНрддрд╛рд░))

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рд╕рд╣реА рд▓рд╛рдЗрди рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рдореИрдВ рдпрд╣ рдЬрд╛рдирдХрд░ рдЕрд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдирдЧреНрди рддреНрд░реБрдЯрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд▓рд╛рдЗрди рдирдВрдмрд░/рдХреЙрд▓рд░ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓, рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рдХреЛ рдЬрд╛рдирдирд╛ рдЖрдорддреМрд░ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╕рдордп рдореИрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реВрдВред рд╢рд╛рдпрдж рдореИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБред

@griesemer рдореИрдВ рдпрд╣рд╛рдБ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рдерд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рд╕реБрдЭрд╛рддрд╛ рд░рд╣рддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд╕рдХреЗ рдЬреЛ рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

@ рдЯреНрд░реЗрдВрдб-рдЬреЗрдкреА рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХреА рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реВрдВ - рд╕рднреА рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рд╛рд░реНрдердХ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рдЖрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ json.Marshal рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдХреЙрд▓ рд╣реИ рдФрд░ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ if рдХрдерди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ json.Marshal рдХреЙрд▓ рд╣реИрдВ, рддреЛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ defer рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╛ рд╢рд╛рдпрдж рдЗрди рд╕рднреА рдХреЙрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдЕрдВрджрд░ рд▓рдкреЗрдЯрдХрд░ рдЬреЛ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдлрд╝реИрдХреНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛рдиреА, рдпрджрд┐ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдРрд╕реА рдХрдИ рдХреЙрд▓реЗрдВ рд╣реИрдВ) рддреЛ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред "рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд╛рди рд╣реИрдВ" рдпрд╣рд╛рдВ рднреА рд╕рддреНрдп рд╣реИ: рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреНрд░рдмрдВрдзрдиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

try рдЖрдкрдХреА рд╕рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рдпрд╣ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЯреВрд▓рдмреЙрдХреНрд╕ рдореЗрдВ рдмрд╕ рдПрдХ рдФрд░ рдЯреВрд▓ рд╣реИред рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдИ рдорд╢реАрдирд░реА рднреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХрд╛ рдПрдХ рд░реВрдк рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд▓рдЧрднрдЧ рдПрдХ рджрд╢рдХ рдХреЗ рджреМрд░рд╛рди рдЕрдХреНрд╕рд░ рджреЗрдЦрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рдмреВрдд рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреБрдЫ рдХреЛрдб рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ рдЕрдиреНрдп рдХреЛрдб рдореЗрдВ рднреА рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@ рдЯреНрд░реЗрдВрдб-рдЬреЗрдкреА

рдХреНрдпрд╛ рдЗрд╕реЗ defer рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

defer fmt.HandleErrorf(&err, "decoding %q", path)

рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд▓рд╛рдЗрди рдирдВрдмрд░ рднреА рд╣рд▓ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ: 'рдХреЛрд╢рд┐рд╢' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ ред

@ рдЯреНрд░реЗрдВрдб-рдЬреЗрдкреА @faiface рд▓рд╛рдЗрди рдирдВрдмрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рджреЗрдЧрд╛ред

рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред

рдпрд╣ рдХрдИ рдмрд╛рд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ panic() рдФрд░ recover() рднреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛, рдЖрдЗрдП рд╣рдо рдФрд░ рди рдЬреЛрдбрд╝реЗрдВред

@networkimprov рдиреЗ рд▓рд┐рдЦрд╛ https://github.com/golang/go/issues/32437#issuecomment -498960081:

рдпрд╣ рдЧреЛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИред

рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛ рд╕рдХрд╛ред

рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ, рдореИрдВ рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрдВрддреНрд░ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ (рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдПрдХ рд╣реИ), рдЗрд╕реЗ рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб (рдпрд╛ рдХреБрдВрдЬреА рдкреНрд░рддреАрдХ?) рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ go func() рдХреЛ go(func()) рд╣реЛ рддреЛ рдЖрдкрдХреЛ рдХреИрд╕рд╛ рд▓рдЧреЗрдЧрд╛?

try рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдмреИрдВрдЧ (!) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдпрд╣ рдХрд╛рд░реНрдп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ:

func foo() {
    f := os.Open!("")
    defer f.Close()
    // etc
}

func bar() {
    count := mustErr!().Read!()
}

@sylr

рдЖрдк рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ go func() рдЧреЛ (func()) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЪрд▓реЛ, рдпрд╣ рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ред

@sylr рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд╕реВрддреНрд░ рдкрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рдпрд╛рдЪрдирд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рд░рд╣рдиреЗ рдкрд░ рдЗрд╕реЗ рднреА рджреЗрдЦреЗрдВред

рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдЧреЛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рд╣реИ - рдпрд╣рд╛рдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд▓рдВрдмрд╛рдИ рдореЗрдВ рдмрддрд╛рдП рдЧрдП рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдЗрд╕рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ try рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рд╣реИ ( go рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛ рдЧреЛ рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдЧреЛ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдЬреИрд╕реЗ append , copy , рдЖрджрд┐ред рдмрд┐рд▓реНрдЯ-рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

(рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рд╣реИ, рдЕрдЧрд░ _that_ рд╣реА рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬ рд╣реИ рдЬреЛ try рдХреЛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдХреАрд╡рд░реНрдб рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)

рдореИрдВ рдмрд╕ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ try :

slurp, err := ioutil.ReadFile(path)
if err != nil {
    return err
}
return ioutil.WriteFile(path, append(copyrightText, slurp...), 0666)

рдмрди рд╕рдХрддрд╛ рд╣реИ:

return ioutil.WriteFile(path, append(copyrightText, try(ioutil.ReadFile(path))...), 0666)

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕рдХреА рдЖрджрдд рдбрд╛рд▓рдиреЗ рдХреА рдмрд╛рдд рд╣реЛ рд╕рдХрддреА рд╣реИред

@gbbr рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

slurp := try(ioutil.ReadFile(path))
return ioutil.WriteFile(path, append(copyrightText, slurp...), 0666)

рдЬреЛ рдЕрднреА рднреА рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрдЪрд╛рддрд╛ рд╣реИ рдлрд┐рд░ рднреА рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ try рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдирд┐рдЪреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

@griesemer рдпрд╣ рдЙрджрд╛рд╣рд░рдг _is_ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рд╣реИ, рдЖрдк рдХреЛрдб рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдЬ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ https://github.com/golang/go/issues/32825#issuecomment -507099786 / https://github.com/golang/go/issues/32825#issuecomment -507136111 рд╕реЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕ рдкрд░ рдЖрдк рдЙрддреНрддрд░ рджрд┐рдпрд╛ https://github.com/golang/go/issues/32825#issuecomment -507358397ред рдмрд╛рдж рдореЗрдВ рдЗрд╕реА рдореБрджреНрджреЗ рдкрд░ https://github.com/golang/go/issues/32825#issuecomment -508813236 рдФрд░ https://github.com/golang/go/issues/32825#issuecomment -508937177 - last рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИред рдЬрд┐рдирдореЗрдВ рд╕реЗ рдореИрдВ рдмрддрд╛рддрд╛ рд╣реВрдВ:

рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреЗ рдЦрд┐рд▓рд╛рдл рдореЗрд░рд╛ рдХреЗрдВрджреНрд░реАрдп рддрд░реНрдХ рдкрдврд╝рд╛: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрди рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИрдВред

_Or_ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реЛрдВ рддрд╛рдХрд┐ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рдЧреЛ рдХреЛрдб рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝реЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рдХрд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╕рднреА рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЖрджрд░реНрд╢ рд▓рд┐рдЦрд┐рдд рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реЗ рдХрдо рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛/рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдРрд╕реЗ рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ рдХрдИ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╕реНрддрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛, рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕реНрдерд╛рди рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╣рдЪрд╛рдиреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рд╡рд┐рдзрд┐ рдорд╛рдиреЛрдВ, рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрджрд┐ fn() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ?

fn := func(n int) (int, error) { ... }
return try(func() (int, error) { 
    mu.Lock()
    defer mu.Unlock()
    return try(try(fn(111111)) + try(fn(101010)) + try(func() (int, error) {
       // yea...
    })(2))
}(try(fn(1)))

рдореБрдЭреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдЪрд┐рдд рдХреЛрдб рд▓рд┐рдЦреЗ рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдПрдХ рдРрд╕рд╛ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рдХрднреА рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рдерд╛: рд╕реНрдкрд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдХреНрдпреЛрдВ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдореИрдВ рдХрднреА рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдореЗрд░рд╛ рд╕рдордп рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдмрд░реНрдмрд╛рдж рд╣реЛред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд░реВрдВрдЧрд╛, рдЕрдиреБрднрд╡ рдиреЗ рдореБрдЭреЗ рд╕рд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рддреЛ рдХреЛрдИ рдРрд╕рд╛ рдХрд░реЗрдЧрд╛ред рдХрд┐ рдХреЛрдИ рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рдмреЗрдЦрд╝рдмрд░ рд╣реЛрддрд╛ рд╣реИред

рдЧреЛ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рд╕рдВрднрд╡ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХрд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдорд╛рди рд╕рд╛рдВрд╕рд╛рд░рд┐рдХ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рднрд╛рд░реА рд▓рд╛рдн рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдЦреЛрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ "рдХреНрдпреЛрдВрдХрд┐ рдХреЛрд╢рд┐рд╢ рдХреЛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ" рдПрдХ рднрд╛рд░реА рд▓рд╛рдн рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рдХрд╛рд░рдг рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдПрдХ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╣реЛрдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдлрд▓ рдХрд╣рд╛рдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдорд┐рд╢реНрд░рдг рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдордЧреНрд░ рд╢рд╛рдмреНрджрд┐рдХ рдЬреЛрдбрд╝рдирд╛ рд╣реЛ? рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдЬ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдЧреЛ рд╕реНрдЯреИрдХ рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рдХреЗрд╡рд▓ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдлрд╝рдВрдХреНрд╢рди рдПрдВрдЯреНрд░реА рдПрдбреНрд░реЗрд╕ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдЪрдиреЗ рдпреЛрдЧреНрдп рдХреЙрд▓рдо рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдЪреАрдЬреЗрдВ рдореБрдЭреЗ рдЪрд┐рдВрддрд┐рдд рдХрд░рддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╕реНрдерд┐рд░рддрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

package main
import "fmt"
func dopanic(b bool) int { if b { panic("panic") }; return 1 }
type bar struct { a, b, d int; b *bar }
func main() {
    fmt.Println(&bar{
        a: 1,
        c: 1,
        d: 1,
        b: &bar{
            a: 1,
            c: 1,
            d: dopanic(true) + dopanic(false),
        },
    })
}

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдмрд╛рдПрдВ рд╣рд╛рде рдХреЗ рдбреЛрдкреИрдирд┐рдХ рдореЗрдВ рдХреИрд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рджрд╛рдИрдВ рдУрд░, рдлрд┐рд░ рднреА рджреЛрдиреЛрдВ рдПрдХ рд╕рдорд╛рди рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ:
https://play.golang.org/p/SYs1r4hBS7O
https://play.golang.org/p/YMKkflcQuav

panic: panic

goroutine 1 [running]:
main.dopanic(...)
    /tmp/sandbox709874298/prog.go:7
main.main()
    /tmp/sandbox709874298/prog.go:27 +0x40

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рд╡рд╛рд▓рд╛ + 0x41 рдпрд╛ 0x40 рдХреЗ рдмрд╛рдж рдХреБрдЫ рдСрдлрд╕реЗрдЯ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдШрдмрд░рд╛рд╣рдЯ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдореЗрдВ рд╕рд╣реА рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдСрдлрд╝рд╕реЗрдЯ рдорд┐рд▓реЗ, рддреЛ рднреА рдореИрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдлрд▓рддрд╛ рдХрд╣рд╛рдБ рд╣реБрдИред рдЖрдЬ рдпрд╣ рдПрдХ рдХрд┐рдирд╛рд░реЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╕рд╛рдордирд╛ рд╢рд╛рдпрдж рд╣реА рд▓реЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдХреЛрд╢рд┐рд╢ рдХрд╛ рдПрдХ рдиреЗрд╕реНрдЯреЗрдмрд▓ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрджрд░реНрд╢ рдмрди рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдПрдХ try() + try() strconv рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдФрд░ рд╕реНрд╡реАрдХрд╛рд░реНрдп рджреЛрдиреЛрдВ рд╣реИред

1) рдКрдкрд░ рджреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рддреЛ рдореИрдВ рдЕрднреА рднреА рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдХреЛрдб рдХрд╣рд╛рдВ рд╡рд┐рдлрд▓ рд╣реБрдЖ?

2) рдХреНрдпрд╛ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЖрдк рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рджреБрд░реБрдкрдпреЛрдЧ рдХреЛ рдХреИрд╕реЗ рд░реЛрдХреЗрдВрдЧреЗ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдорд╛рдирддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд▓реЛрдЧ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реВрдЪрд┐рдд рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХреЗрдВ рдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд░реНрд╡реЛрддреНрддрдо/рд╕рдЦреНрдд рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рджреЗрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА vet рд╕реАрдорд╛рдПрдВ рд▓рдЧрд╛рдИ рдЬрд╛рдПрдВрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреА рдЖрдкрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЕрдиреБрдЪрд┐рдд рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрдЪрд╛рд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдЕрдорд▓ рдореЗрдВ рдЖрдПрдЧрд╛?

3) рдХреНрдпрд╛ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдпрд╣ рдЧреЛ рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдмрд╕реЗ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдордЬреЛрд░ рддрд░реНрдХ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рддреЛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдХреБрдЫ рдирдпрд╛ рджрд░реНрдж рдмрд┐рдВрджреБ рдЙрднрд░ рдЖрддрд╛ рд╣реИ, рдореИрдВ рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдХрд┐ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдирдХрд╛рд░рд╛рддреНрдордХ рддрдм рддрдХ рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрдПрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЬрдВрдЧрд▓реА рдореЗрдВ рдкреНрд░рдХрдЯ рди рд╣реЛ рдЬрд╛рдПред рдиреЗрд╕реНрдЯрд┐рдВрдЧ https://github.com/golang/go/issues/32825#issuecomment -506882164 рдореЗрдВ рдмрддрд╛рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдЬ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ" рдХрд╣рд╛рдиреА рдХреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдареЛрд╕ рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлреАрдбрдмреИрдХ рдХреИрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ рд╣рд╛рдирд┐рдХрд╛рд░рдХ try() рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд░рдХреНрд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЖрдкрдХреЗ рдЖрджрд░реНрд╢ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ gophers рдореЗрдВ play.golang.org рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ рдФрд░ рдХрд┐рд╕реА рдиреЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ NaCl рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛, рддреЛ рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо/рдмрдЧред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдиреНрдп рдЖрд░реНрдХ рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореБрджреНрджреЗ рдЬреЛ рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ рдХрдИ рд░рд┐рдЯрд░реНрди рдкреЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреЛрдЬ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ рдХреЗрдВрджреНрд░ рд╕рдордЭрджрд╛рд░ рдФрд░ рд╕реНрд╡рдЪреНрдЫ рд╕рд┐рдВрдЧрд▓ рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИрдВред

рдЕрд░реЗ рдирд╣реАрдВ, рдХреГрдкрдпрд╛ рдЗрд╕ 'рдЬрд╛рджреВ' рдХреЛ рд▓реИрдВрдЧреЗрдЬ рдореЗрдВ рди рдЬреЛрдбрд╝реЗрдВред
рдпреЗ рдмрд╛рдХреА рд▓реИрдВрдЧреЗрдЬ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддреЗ рдФрд░ рдорд╣рд╕реВрд╕ рд╣реЛрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рд╣рд░ рдЬрдЧрд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред

a, b := try( f() )
if a != 0 && b != "" {
...
}
...

рдХреЗ рдмрдЬрд╛рдп

a,b,err := f()
if err != nil {
...
}
...

рдпрд╛

a,b,_:= f()

call if err.... рдкреИрдЯрд░рди рдореЗрд░реЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрдд рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рдерд╛ рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрджрдд рд╣реЛ рдЧрдИ рд╣реИ
рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд░реИрдкрд░/рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рдмрд╛рд░ рдирд┐рдХрд╛рд▓ рджрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдХреАрдмреЛрд░реНрдб рдХреЗ рдЬреАрд╡рди рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рджрд┐рди рдШрдмрд░рд╛ рдЬрд╛рдКрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдЕрдкрдиреА рдЖрджрддреЛрдВ рдХреЛ vbscript рдореЗрдВ рднреА рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ:

on error resume next
a = f()
if er.number <> 0 then
    ...
end if
...

рдореБрдЭреЗ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рднреА рдЪрд┐рдВрддрд╛рдПрдБ рдереАрдВ (рдЬреИрд╕реЗ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рди рдХрд┐ рдмрд┐рд▓реНрдЯ рдЗрди) рдХреЛ рдЧрд╣рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдпрд╣ 100% рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдП) рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмреА) рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд┐рдЫрдбрд╝реЗ рдХреЙрдореНрдкреИрдЯ рдФрд░ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдХреБрдЫ 'рдЬрд╛рджреВ' рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ defer рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдХреАрд╡рд░реНрдб рдмрдирд╛рдо рдмрд┐рд▓реНрдЯрд┐рди рдХрд╛ рдЕрдВрддрд░ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try() рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╣рд▓реЗ рд╣реА рд╡реНрдпрдХреНрдд рдХрд░ рджреА рдЧрдИ рдереАред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:

1) рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ () рд▓рдВрдмрд╡рдд рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ
2) рдиреЗрд╕реНрдЯреЗрдб рдЯреНрд░рд╛рдИ () рдХреЙрд▓ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рддрд░рд╣ рдкрдврд╝рдиреЗ рдореЗрдВ рдХрдард┐рди рд╣реИрдВ
3) рдЕрджреГрд╢реНрдп 'рд╡рд╛рдкрд╕реА' рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬреЛ рдиреЗрддреНрд░рд╣реАрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ ( return рдХреАрд╡рд░реНрдб рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдбреЗрдВрдЯреЗрдб рдмреНрд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ)
4) рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдЕрднреНрдпрд╛рд╕ рдХреЛ рдмрджрддрд░ рдмрдирд╛рддрд╛ рд╣реИ (рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрдЬрд╛рдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрджрд░реНрдн)
5) #golang рд╕рдореБрджрд╛рдп рдФрд░ рдХреЛрдб рд╢реИрд▓реА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ (gofmt рд╡рд┐рд░реЛрдзреА)
6) рджреЗрд╡реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ () рдХреЛ рдЕрдЧрд░-рдЧрд▓рддреА-рд╢реВрдиреНрдп рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЕрдХреНрд╕рд░ (рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдмрдирд╛рдо рдХреНрд▓реАрдирдЕрдк рд▓реЙрдЬрд┐рдХ / рдЕрддрд┐рд░рд┐рдХреНрдд рд▓реЙрдЧ / рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛) рдХрд░реЗрдВрдЧреЗ

@VojtechVitek рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЕрдВрдХ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд▓реЛрдЧ рдЗрд╕реЗ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рддрдХрдиреАрдХреА рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЬреНрдпрд╛рджрд╛ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ/рд╕рдЬрд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреИрдЯрд░реНрди рдореЗрдВ $#$1 defer #$ рдХреА рд╕рд╛рдзрд╛рд░рдг рд▓рд╛рдЧрдд рд╕реЗ рдкрд░реЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде try рдХреЛ рдЕрдкрдирд╛рдиреЗ рд╕реЗ $ err != nil рдЪреЗрдХ рдХреЗ рдмрд╛рдж рд╕реАрдзреЗ рдПрдХ рд▓рд┐рдкрдЯреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд▓рд╛рдЧрддреЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ:

  1. рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдкрдереЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдердЧрд┐рдд, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рдлрд▓ рднреА
  2. рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХрд╛ рдиреБрдХрд╕рд╛рди

рднрд▓реЗ рд╣реА defer рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдЖрдЧрд╛рдореА рдкреНрд░рджрд░реНрд╢рди рд╕реБрдзрд╛рд░ рд╣реЛрдВ, рд▓реЗрдХрд┐рди рд▓рд╛рдЧрдд рдЕрднреА рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред

try рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЧреЛ рдЯреАрдо defer рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░реНрд╡-рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд░реИрдкрд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХреЗред .

рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ" рдХрд╣рд╛рдиреА рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдареЛрд╕ рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХрд╣рд╛рдиреА рдкрд░реА рдХрдерд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рдХрд╕реНрдЯрдо рд╡рд╛рд▓реЗ рдкрд░ рдмреЗрдХрд╛рд░ рд╣реЛрдЧрд╛ред

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ,

рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдирд┐рд╣рд┐рддрд╛рд░реНрде, рдЯреНрд░реЗрдбрдСрдлрд╝ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдореБрджрд╛рдп-рд╡реНрдпрд╛рдкреА рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдЧреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реИред

рднрд╛рд░реА рд╕рдореБрджрд╛рдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдпрд╣рд╛рдВ рд╡реНрдпрд╛рдкрдХ рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрддрдХрдиреАрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдЗрд╕ рдЪрд░реНрдЪрд╛ рдиреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рд┐рдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрдеред

рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрдирд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рд╕рд╛рд░реНрдердХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╣рдо рдЕрднреА рднреА рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рд░реНрдердХ рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рд╕рдореБрджрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдХреМрди рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рд▓реВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рд╣реИ, рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЕрдЧрд╕реНрдд рдореЗрдВ " рдЧреЛ 2 рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░реЙрдмреНрд▓рдо рдУрд╡рд░рд╡реНрдпреВ " рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдкреАрдЫреЗ рдореБрдбрд╝рдХрд░ рджреЗрдЦрдиреЗ рдкрд░ рд╣рдордиреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдирд╣реАрдВ рджрд┐рдпрд╛ред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╕рд╣реА рдереАред try рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╣рд╛рдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ рдЗрди рд╢реБрд░реБрдЖрддреА рд╕рдорд╕реНрдпрд╛ рдмрдпрд╛рдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд╕рд╣рдорддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

(рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЙрд╕реА рджрд┐рди рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдврд╝рд╛-рдЪрдврд╝рд╛ рдХрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред)

рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╖рдп рдкрд░, рд╣рдореЗрдВ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдХреМрди рд╕реЗ рдкрд╣рд▓реВ рдЖрдкрдХреЗ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдФрд░ рдХрд╛рд░реНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рддрдирд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓реЗрдЧрд╛ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдРрд╕реА рдХреЛрдИ рд░рд┐рдкреЛрд░реНрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ Go2ErrorHandlingFeedback рдкреГрд╖реНрда рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред

рдпрд╣рд╛рдВ рдФрд░ рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдкрд░ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдЬреИрд╕рд╛ рдХрд┐ Russ Cox рдиреЗ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдореБрджрд╛рдп-рд╡реНрдпрд╛рдкреА рдЪрд░реНрдЪрд╛ рдЕрдкрдиреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рд░реВрдк рдореЗрдВ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ ред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рднреА рдХреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдореАрдХреНрд╖рд╛ рд╕рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд░реЙрдмрд░реНрдЯ рдЧреНрд░рд┐рд╕реЗрдорд░ред

рдХреЛрд╢рд┐рд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЧрдП рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЧреЛ рдЯреАрдоред рдФрд░ рдЙрди рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдПред рдХрднреА-рдХрднреА рдпреЗ рдЪреАрдЬреЗрдВ рдЦреБрдж рдХреА рдЬрд╛рди рд▓реЗ рд▓реЗрддреА рд╣реИрдВред рдЧреЛ рдЯреАрдо рдХреЛ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдирдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╡рд╛рд╣!

рдЗрд╕реЗ рд╣реИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж рддрд╛рдХрд┐ рд╣рдо рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ!

рдХреЙрд▓ рдЧреЛ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдЕрдиреБрднрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐,
рдореИрдВ рдФрд░ рдЯреАрдо xerrors.As, xerrors.Is рдФрд░ xerrors.Errorf рд╕реЗ рдмрд╣реБрдд рдЦреБрд╢ рд╣реИрдВред рдпреЗ рдирдП рдкрд░рд┐рд╡рд░реНрдзрди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд рддрд░реАрдХреЗ рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рдЕрдм рд╣рдордиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓ рд╣рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдЖрдИ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

@griesemer рдмрд╕ рдЖрдкрдХреЗ рдзреИрд░реНрдп рдФрд░ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (рдФрд░ рд╢рд╛рдпрдж рдЖрдкрдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЕрдиреНрдп) рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЕрдЪреНрдЫрд╛!

@griesemer рд╕рднреА рдлреАрдбрдмреИрдХ рдХреЛ рдЕрдердХ рд░реВрдк рд╕реЗ рд╕реБрдирдиреЗ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рднреА рд╡рд┐рд╡рд┐рдз рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдЯреАрдо рдХреЗ рдЕрдиреНрдп рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

рддреЛ рд╢рд╛рдпрдж рдЕрдм рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдЪреАрдЬреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реИ?

@griesemer @rsc рдФрд░ @all , рдХреВрд▓, рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдорд╣рд╛рди рдЪрд░реНрдЪрд╛/рдкрд╣рдЪрд╛рди/рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИред рдЬрд╛рдиреЗ рдореЗрдВ 'рддреНрд░реБрдЯрд┐' рдореБрджреНрджреЗ рдЬреИрд╕реЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХреА рд╡реГрджреНрдзрд┐, рдкрд╣рд▓реЗ рдореБрдЦреНрдп рдореБрджреНрджреЛрдВ рдХреА рдкрд╣рдЪрд╛рди / рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЦреБрд▓реА рдЪрд░реНрдЪрд╛ (рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ ...) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

ps, x/xerrors рдЕрднреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред

(рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рднреА рд▓реЙрдХ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ ...)

рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреАрдо рдФрд░ рд╕рдореБрджрд╛рдп рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБ рдХрд┐ рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдЧреЛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдореБрджрд╛рдп рдкрд╣рд▓реЗ рдкреНрд░рдпрд╛рд╕ рдФрд░ рдХреМрд╢рд▓ рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рджреЗрдЦрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╕рдЧрд╛рдИ рдХреА рднрд╛рд╡рдирд╛ рдиреЗ рд╣рдореЗрдВ рдЗрд╕ рдирд┐рд░реНрдгрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХреАред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЧреЛ рдХрд╛ рднрд╡рд┐рд╖реНрдп рдмрд╣реБрдд рдЙрдЬреНрдЬреНрд╡рд▓ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╣рдо рд╕рднреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрдирд╛рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

func рдПрдо () (рдбреЗрдЯрд╛, рддреНрд░реБрдЯрд┐) {
рдП, рдПрд░рд░1 := рдП ()
рдмреА, рдЧрд▓рддреА 2: = рдмреА ()
рд╡рд╛рдкрд╕реА рдмреА, рд╢реВрдиреНрдп
} => (рдЕрдЧрд░ err1 != nil) {рд░рд┐рдЯрд░реНрди a, err1}ред
(рдпрджрд┐ рдПрд░рд░2 != nil) {рд░рд┐рдЯрд░реНрди рдмреА, рдПрд░рд░2}

рдареАрдХ рд╣реИ... рдореБрдЭреЗ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕рдореБрджрд╛рдп рдФрд░ рдЧреЛ рдЯреАрдо рдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд▓рдЧреЗ, рд╡рд╣ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдХрднреА-рдХрднреА рдереЛрдбрд╝рд╛ рдХрдард┐рди рдерд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореЗрд░реЗ 2 рдкреНрд░рд╢реНрди рд╣реИрдВ:
1/рдХреНрдпрд╛ "рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди" рдЕрднреА рднреА рд╢реЛрдз рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИ?
2/рдХреНрдпрд╛ рдЖрд╕реНрдердЧрд┐рдд рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИ?

рдпрд╣ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рд╕рдореБрджрд╛рдп рдХреА рдмрд╛рдд рд╕реБрдиреА рдЬрд╛ рд░рд╣реА рд╣реИ рдФрд░ рд╡рд╣ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдЬреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╡реЗ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХрдбрд╝реА рдореЗрд╣рдирдд рдФрд░ рд╕рднреНрдп рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЧреЛ рдЯреАрдо рдФрд░ рд╕рдореБрджрд╛рдп рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!

рдЙрддреНрдХреГрд╖реНрдЯ!

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛я╝МрдХрд╛рдлреА рдорджрджрдЧрд╛рд░

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧреЛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рдмрд┐рдВрджреБ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреИрд╕реЗ
Russ рдиреЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛: рд╡рд╣рд╛рдБ рдПрдХ рдмрд┐рдВрджреБ рд╣реИ рдЬрд╣рд╛рдБ рд╕рдореБрджрд╛рдп рд╕рд┐рд░реНрдл a . рдирд╣реАрдВ рд╣реИ
рдмрд┐рдирд╛ рд╕рд┐рд░ рд╡рд╛рд▓рд╛ рдореБрд░реНрдЧреА, рдпрд╣ рдПрдХ рддрд╛рдХрдд рд╣реИ рдЬрд┐рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдЕрдкрдиреЗ рднрд▓реЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рдЧреЛ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╕рднреА рдХреЛ рдЧрд░реНрд╡ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░
рдирд┐рдГрд╕рдВрджреЗрд╣, рдЬрдм рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЕрдзрд┐рдХ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛрдВрдЧреА, рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЖрдЗрдП рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рджрд░реНрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реА рдЕрдЪреНрдЫреА рд╕реЗрд╡рд╛ рдХрд░реЗрдЧрд╛
(рдХреНрдпрд╛ рдпрд╣ рджреБрдЦрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛?)

рд▓реБрд╕рд┐рдпреЛред

рдореИрдВ рдлреИрд╕рд▓реЗ рдкрд░ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рдЧреЛ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред рдПрдХ рд╕рдореБрджрд╛рдп рд╡реНрдпрд╛рдкрдХ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдлреАрдбрдмреИрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрд╕реНрдердЧрд┐рдд-рдЕрдиреБрдХреВрд▓рди рднреА рдЖрдПрдВрдЧреЗред рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ xerrors рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИред

@pierrec рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдХреМрди рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдЖрдЧрд╛рдореА 1.13 рд░рд┐рд▓реАрдЬрд╝ (https://tip.golang.org/doc/go1.13#errors) рдореЗрдВ рд╣реЛрдВрдЧреЗ, рдФрд░ рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рджреМрд░рд╛рди рд╣рдордиреЗ рдХрдИ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рд▓реЛрдЧ рдорддрджрд╛рди рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдкреНрд░рддреАрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХреЗрдВред рдЕрдзрд┐рдХ рдЖрдо рддреМрд░ рдкрд░, рдЬреИрд╕рд╛ рдХрд┐ @griesemer рдиреЗ рдХрд╣рд╛, рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧреАред

рдпрд╣ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рд╣рдж рддрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ред

https://golang.org/cl/183677 рдореЗрдВ defer рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдзрд╛ рдирд╣реАрдВ рдЖрддреА рд╣реИ, рдореИрдВ рдЗрд╕реЗ 1.14 рд░рд┐рд▓реАрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред

@griesemer @ianlancetaylor @rsc рдХреНрдпрд╛ рдЖрдк рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдПрдХ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдЙрдард╛рдП рдЧрдП рдХреБрдЫ рдпрд╛ рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рддреЛ, рдкрд╛рд░реНрдЯреА рдХреЗ рд▓рд┐рдП рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП, рдЯрд░реНрдирд░реА рдЬреИрд╕реА рд╕рд╢рд░реНрдд рд╡рд╛рдкрд╕реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? (рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рдЕрдкрдиреЗ рд╕реНрдХреИрди рдореЗрдВ рдпрд╛ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП Russ Cox рдХреЗ рджреГрд╢реНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рджреЗрдЦрд╛ред) рдЙрджрд╛рд╣рд░рдг:

f, err := Foo()
return err != nil ? nil, err

рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рд╣реИ, рддреЛ nil, err рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рд╣реИ рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдлреЙрд░реНрдо рд╣реЛрдЧрд╛

return <boolean expression> ? <return values>

рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рд╣реЛрдЧреА:

if <boolean expression> {
    return <return values>
}

рдкреНрд░рд╛рдердорд┐рдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ check рдХреАрд╡рд░реНрдб рдпрд╛ try рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛ред return err != nil || f == nil ? nil, fmt.Errorf("failed to get Foo") , рдЕрдзрд┐рдХ рдкрд░ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдЧреИрд░-рд╢реВрдиреНрдп (рдЙрджрд╛ред return err != nil && err != io.EOF ? nil, err ), рдЖрджрд┐, рдЬрдмрдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)ред

рдпрд╣ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди _рд╕реНрдЯрд┐рд▓ рдХреЙрд▓ рд╕реНрдерд╛рди_ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ рдХреБрдЫ рд╕реНрдердЧрд┐рдд рдХрдерди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдпред рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдкрдХрдбрд╝ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ _рд╣реИрдВрдбрд▓рд┐рдВрдЧ_ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рддреЛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдЕрдкрд╡рд╛рдж рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЧреЛ рдХрд╛ рд╕рдВрдкреВрд░реНрдг _рдмрд┐рдВрджреБ_ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрдирдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреИрдХ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПред рдпреВрдкреАред рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрдкрд╖реНрдЯ, рдпрджрд┐ рд╕рд╢рд░реНрдд, рд╡рд╛рдкрд╕реА рд╡рд┐рд╡рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

@ngrilly рдЬреИрд╕рд╛ рдХрд┐ @griesemer рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдХреМрди рд╕реЗ рдкрд╣рд▓реВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд▓рдЧрддреЗ рд╣реИрдВред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреЛ рдереЛрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдЬ рднрд╛рд╖рд╛ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рд╣рд░ рдмрджрд▓рд╛рд╡ рдХреА рдПрдХ рдХреАрдордд рд╣реЛрддреА рд╣реИред рдЕрдЧрд░ рд╣рдо рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдиреЗ рдХрдо рд╡рд╛рдЪрд╛рд▓рддрд╛ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдИ рдЧрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рдереАред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рдмреАрдЪ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@kaedys рдпрд╣ рдмрдВрдж рдФрд░ рдЕрддреНрдпрдВрдд рд╡рд░реНрдмреЛрдЬрд╝ рдореБрджреНрджрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред

@ianlancetaylor

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдиреЗ рдХрдо рд╡рд╛рдЪрд╛рд▓рддрд╛ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдИ рдЧрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рдереАред

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕реНрд╡-рдЪрдпрди рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реИред рдЧреЛ рдЕрдкрдиреА рд╡рд░реНрдмреЛрдЬрд╝ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рдЬреЗрдирд░рд┐рдХ рдХреА рдХрдореА рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрди рджреЛ рдореБрджреНрджреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдмреАрдЪ, рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛рдУрдВ (рдЬрд╛рд╡рд╛, рд╕реА ++, рд╕реА #, рдкрд╛рдпрдерди, рд░реВрдмреА, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВ рдФрд░/рдпрд╛ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдУрдВ (рд░рд╕реНрдЯ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдХреЛрдЯрд▓рд┐рди, рд╕реНрд╡рд┐рдлреНрдЯ, рдПрд▓рд┐рдХреНрд╕рд┐рд░, рдЖрджрд┐) рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВред . рдореИрдВ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдЧреЛ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЦреЗрд▓ рдореЗрдВ рдПрдХ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реИред рдЬрдм рд▓реЛрдЧ рдЧреЛ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡рд░реНрдмреЛрдЬрд╝ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдХрдореА рдХрд╛ рдмрдЪрд╛рд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдЬреИрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдирд┐рд╖реНрдкрдХреНрд╖ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдЯреАрд╡ рдХреНрд▓реИрдмрдирд┐рдХ рдиреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ рд░реЗрдбрд┐рдЯ рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЯрд┐рдкреНрдкрдгреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреА рдереАред рд╡рд╣ рд░рд╕реНрдЯ рдореЗрдВ ? рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рдПрдХ рд╣реА рдмрд╛рдд рд▓рд┐рдЦрдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ" рдереЗ рдФрд░ рдпрд╣ "рдмрд╣реБрдд рдирд┐рд╣рд┐рдд" рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдм, рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, ? рдЙрдирдХреА рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

@ngrilly рдореИрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдЙрди рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣реЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╡рд░реНрдмреЛрдЬрд╝ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдЧреЛ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧреАред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдорд╛рдкрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрд╣ рднреА рд╕рдЪ рд╣реИ рдХрд┐ try рдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдПрдХ рдирдпрд╛ рдмрджрд▓рд╛рд╡ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд┐рд╕реЗ рджреЗрдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛, рдФрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ try рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ .

рд╕реНрдЯреАрд╡ рдХреНрд▓реИрдмрдирд┐рдХ рдХреЗ рдЙрджреНрдзрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЬрдмрдХрд┐ рдореИрдВ рднрд╛рд╡рдирд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рд╣рдордд рд╣реВрдВ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдХ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╕реНрдЯ рдЧреЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдзрд┐рдХ рдЗрдЪреНрдЫреБрдХ рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд░реНрдердХ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░рд╛рд╢ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдЕрдм рд╡рд╛рдкрд╕ рд▓реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЯреАрдо рдиреЗ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред

рдПрдХ рдмрд╛рдд рдЬреЛ рдЕрдм рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордореЗрдВ рд╕реЗ рдмрд╛рдХреА рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрдВрдж рдХрд░ рджреЗ .

рдореИрдВрдиреЗ рдХрд┐рддрдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдкрдврд╝рд╛ рд╣реИ, рдЗрд╕рдХреА рдЧрд┐рдирддреА рдЦреЛ рджреА рд╣реИ рдФрд░, рдЬрдмрдХрд┐ рдХреБрдЫ рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреЛрдИ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЕрдЧрд░ try рдзреВрд▓ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдереЗ рддреЛ рдЕрдкрдирд╛рдиреЗ рд▓рд╛рдпрдХ рдереЗред рдЗрд╕рд▓рд┐рдП рдЕрдм рдмреАрдЪ рдХреЗ рдХрд┐рд╕реА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЙрднрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдореБрдЭреЗ рджреВрд░ рдХреА рдХреМрдбрд╝реА рд▓рдЧрддреА рд╣реИред

рдЕрдзрд┐рдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдиреЛрдЯ рдкрд░, рд╡рд░реНрддрдорд╛рди рдЪрд░реНрдЪрд╛ рдиреЗ рдЙрди рддрд░реАрдХреЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдФрд░ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( defer рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ goto рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЬрд┐рд╕ рдкрд░ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЯреАрдо рдХрдо рд╕реЗ рдХрдо go fmt рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧреА рддрд╛рдХрд┐ рдПрдХрд▓ рдХрдерди if рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдЧрд╛ _look_ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ, рднрд▓реЗ рд╣реА рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред

@pierrec

1/рдХреНрдпрд╛ "рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди" рдЕрднреА рднреА рд╢реЛрдз рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИ?

рдпрд╣ 50 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд╣реИ! рд╕реБрд╕рдВрдЧрдд рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордЧреНрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдпрд╛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рднреА рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЧреЛ рд▓реИрдВрдб рдореЗрдВ (рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП) рддреНрд░реБрдЯрд┐ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рднреА рднреНрд░рдо рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдПрдХ EOF рдПрдХ рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рд╣реИ? рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рднреА рдРрд╕реЗ рдореБрджреНрджреЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдЪрд░реНрдЪрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣рд╛рдБ рдирд╣реАрдВ, рдпрджреНрдпрдкрд┐)ред

рдзрдиреНрдпрд╡рд╛рдж @griesemer @rsc рдФрд░ рдЕрдиреНрдп рд╕рднреА рдХреЛ рдкреНрд░рдкреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ред рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕реЗ рдКрдкрд░ рдХрд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ, рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЕрдЪреНрдЫреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдореЗрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рдЖрдкрдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

@ianlancetaylor

рд╕реНрдЯреАрд╡ рдХреНрд▓реИрдмрдирд┐рдХ рдХреЗ рдЙрджреНрдзрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЬрдмрдХрд┐ рдореИрдВ рднрд╛рд╡рдирд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рд╣рдордд рд╣реВрдВ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдХ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╕реНрдЯ рдЧреЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдзрд┐рдХ рдЗрдЪреНрдЫреБрдХ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд░рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░реНрдЪрд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рд░рд╕реНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдорд╛рди рд╣реИрдВ рдЬреИрд╕реЗ рд╡реЗ рдЧреЛ рдореЗрдВ рд╣реИрдВред рдЖрдк рдорд╛рдирдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЧреЛ рдореЗрдВред рд░рд╕реНрдЯ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдерд╛, рдЬреИрд╕реЗ рдЧреЛ рдореЗрдВред рдлрд┐рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ try! рдореИрдХреНрд░реЛ рдкреЗрд╢ рдХрд┐рдпрд╛, рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ try рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдВрддрддрдГ ? рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рд╛, рдЬреЛ рдПрдХ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рднрд┐рдиреНрдирддрд╛ рд╣реИ рдФрд░ try! рдореИрдХреНрд░реЛ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ try рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░ рддрдереНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдХрд┐ рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдХреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкрдЫрддрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЧреЛ рдФрд░ рд░рд╕реНрдЯ рдХреЗ рдмреАрдЪ рдмрдбрд╝реЗ рдЕрдВрддрд░ рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╡рд╛рдХрд┐рдл рд╣реВрдВ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЗ рд╡рд┐рд╖рдп рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЕрдиреБрднрд╡ рдЧреЛ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝реЗрдмрд▓ рд╣реИред try! рдФрд░ ? рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд RFC рдФрд░ рдЪрд░реНрдЪрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкрдХреНрд╖ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдореЗрдВ рдореБрджреНрджреЗ рдФрд░ рддрд░реНрдХ рдХрд┐рддрдиреЗ рд╕рдорд╛рди рд╣реИрдВред

@griesemer , рдЖрдкрдиреЗ try рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЙрд╕рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд░реВрдк рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрдгрдп рдХреА рдШреЛрд╖рдгрд╛ рдХреА, рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рдХрд┐ рдЧреЛ рдЯреАрдо рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реА рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдПрдХ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЬреЛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЙрдард╛рдП рдЧрдП рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ (рдкреНрд░рд┐рдВрдЯ рдбрд┐рдмрдЧрд┐рдВрдЧ, рдХреЛрдб рдХрд╡рд░реЗрдЬ, рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ, рдЖрджрд┐)?

рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд░рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░реНрдЪрд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдЕрдиреНрдп рдЕрднреА рднреА рдЕрдкрдиреЗ рджреЛ рд╕реЗрдВрдЯ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЬрдЧрд╣ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ 1987 рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдЧреЛ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓рдЧрднрдЧ 18 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЬрдм рдореИрдВ рдХреБрдЫ рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рддреЛ рдореИрдВрдиреЗ рдЧреЛ рдФрд░ рд░рд╕реНрдЯ рджреЛрдиреЛрдВ рдХреЛ рджреЗрдЦрд╛ред рдореИрдВрдиреЗ рдЧреЛ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЧреЛ рдХреЛрдб рд╕реАрдЦрдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдерд╛, рдФрд░ рдЧреЛ рдХреЛрдб рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рд╢рдмреНрджреЛрдВ рдХреЛ рдЕрд░реНрде рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджреЛрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ рдмрдЬрд╛рдп рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреНрд░рддреАрдХреЛрдВ рдХреЗред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рджреБрдЦ рд╣реЛрдЧрд╛ рдХрд┐ рдЧреЛ рдЕрдзрд┐рдХ рдЬрдВрдЧ рдЬреИрд╕рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдмрд┐рдВрджреБ ( ! ) рдФрд░ рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди ( ? ) рдХрд╛ рдЕрд░реНрде рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЗрд╕реА рддрд░рд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рд╢реБрд░реВрдЖрдд рдЧреЛ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рдмрджрд▓ рджреЗрдЧреА рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧреЛ рдХреА рд╣рдЬрд╛рд░реЛрдВ рдмреЛрд▓рд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА рдЬреИрд╕рд╛ рд░реВрдмреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдХрднреА рднреА рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рддреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреА рдмрд╣реБрдд рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдЖрдИрдПрдордУред

рдЬреЗрдПрдордЯреАрд╕реАрдбрдмреНрд▓реНрдпреВ

@ianlancetaylor

рд╡рд░реНрдмреЛрдЬрд╝ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдЧреЛ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧреАред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдорд╛рдкрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдпрд╣ рдкреНрд░рддрд┐ "рдорд╛рдк" рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИрдХрд░ рд╕рдорд╛рдЪрд╛рд░ рдЪрд░реНрдЪрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рджрд╕рд┐рдпреЛрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдирд╛рдЦреБрд╢ рд╣реИрдВ (рдФрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЙрдирдХреЗ рддрд░реНрдХ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджреЗрддреА рд╣реИрдВ): https://news.ycombinatorред рдХреЙрдо/рдЖрдЗрдЯрдо?рдЖрдИрдбреА=20454966.

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдкрд░ рд╕рд╣рд╛рдпрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж, рднрд▓реЗ рд╣реА рд╡рд╣ рдирд┐рд░реНрдгрдп рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрддреЛрд╖рдЬрдирдХ рди рд╣реЛред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЯреАрдо рдкреНрд░рдпрд╛рд╕ рдерд╛, рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрд╢реА рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдПрдХ рд╕рдордЧреНрд░ рдирд╛рдЧрд░рд┐рдХ рдФрд░ рд╕рдореНрдорд╛рдирдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЧрд╣рди рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╕рдлрд▓ рд░рд╣реЗред

@ngrily рд╕рд┐рд░реНрдл рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЖрдзреЗ рд╕рд╛рд▓ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реЗ 3 рдорд╣реАрдиреЛрдВ рдореЗрдВ рдЗрд╕ рдкрд░ рдХрд╛рдлреА рд╕рдордп рдФрд░ рдКрд░реНрдЬрд╛ рд╕рдорд░реНрдкрд┐рдд рдХреА рд╣реИ, рдФрд░ рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдХрд╛рдлреА рдЦреБрд╢ рдереЗ, рдлрд┐рд░ рднреА рд╣рдордиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХрд╛ рд╣реИред рдЕрдм рдпрд╣ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреЗрдВ, рдкрдЪрд╛ рд▓реЗрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВ, рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдЪрд░рдгреЛрдВ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд╕реАрдорд┐рдд рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдЕрдиреНрдп рдореЛрд░реНрдЪреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рдЧрддрд┐ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмреИрдХ-рдмрд░реНрдирд░ рдкрд░ рдЬрд╛рдПрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВ, рдХрдо рд╕реЗ рдХрдо рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдХреБрдЫ рдорд╣реАрдиреЗред if err != nil рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддрддреНрдХрд╛рд▓ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╕рднреА рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рд╕реЗ рд╣рдЯ рдЬрд╛рдПрдВ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ (рдпрджрд┐ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ), рдпрд╛ рдЕрдиреНрдп рдордВрдЪреЛрдВ рдореЗрдВ рдЦреБрд▓реА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реИред рдЖрдЦрд┐рд░ рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕реНрд╡-рдЪрдпрди рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реИред

рдореИрдВ рдпрд╣рд╛рдВ рдФрд░ рдЕрднреА рдПрдХ рдирдпрд╛ рд╢рдмреНрдж рдЧрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: "рдирд┐рд░реНрдорд╛рддрд╛ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣"ред рдЕрдЧрд░ рдХреЛрдИ рдХрд╛рдо рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реИ рддреЛ рдЙрд╕реЗ рд╕рдВрджреЗрд╣ рдХрд╛ рд▓рд╛рдн рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореВрдВрдЧрдлрд▓реА рдЧреИрд▓рд░реА рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрдмрдВрдзрд┐рдд рдордВрдЪреЛрдВ рдкрд░ рдЬреЛрд░ рд╕реЗ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЪрд┐рд▓реНрд▓рд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЛ рдХреИрд╕реЗ рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП 3-рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдЕрдзреВрд░рд╛ рдкреНрд░рдпрд╛рд╕ рд▓рд┐рдЦрдирд╛ рднреА рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП)ред рдпрджрд┐ рдХреЛрдИ рдпрдерд╛рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕рд╣рдордд рд╣реИ, рддреЛ рдареАрдХ рд╣реИред рдирд┐рд╖реНрдкрдХреНрд╖ рдмрд┐рдВрджреБред рдкреВрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ -10k рдЕрдВрдХ рдорд┐рд▓рддреЗ рд╣реИрдВред

рдореИрдВ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рдпрд╛ рдХреЛрд╢рд┐рд╢ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рдЧреЛ рдЯреАрдо рдХреЗ рдлреИрд╕рд▓реЗ рдкрд░ рднрд░реЛрд╕рд╛ рд╣реИ, рдЕрдм рддрдХ рдЙрдирдХреЗ рдлреИрд╕рд▓реЗ рдиреЗ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рднрд╛рд╖рд╛ рдкреНрд░рджрд╛рди рдХреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЬреЛ рднреА рддрдп рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдпрд╛ рди рдХрд░реЗрдВ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рд╣рдореЗрдВ рдмрд╛рд╣рд░реА рд▓реЛрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЗ рдкрд╛рд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡реНрдпрд╛рдкрдХ рджреГрд╢реНрдпрддрд╛ рд╣реИред рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рдо рдкреВрд░реЗ рджрд┐рди рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рд╕рдордп рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдЙрдирдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд╣реИрдВ рдФрд░ рднрд╛рд╖рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдирдП (рдЧреИрд░-рдкрд┐рдЫрдбрд╝реЗ-рдмреНрд░реЗрдХрд┐рдВрдЧ) рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реИрдВ рдпрджрд┐ рдХреЛрдИ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЖрдк рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧреАред

рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП 3-рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдЕрдзреВрд░рд╛ рдкреНрд░рдпрд╛рд╕ рд▓рд┐рдЦрдирд╛ рднреА рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП)ред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рдореИрдВ (рдФрд░ рдХрдИ рдЕрдиреНрдп) try рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд╡рд╣ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рдерд╛ рдЬреЛ рдЗрд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐ рдХреЗ рдПрдХ рд▓рд┐рдкрдЯреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рдерд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдирд╣реАрдВ рдУред

рд╕рдордЭрд╛ред рдЬрд╛рдУ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЪрд░реНрдЪрд╛ рд╢рд╛рдпрдж рдХрд╣реАрдВ рдФрд░ рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реИред

рдпрд╣ рдорд╕рд▓рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрддрдирд╛ рд▓рдВрдмрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рддрд╛рд▓рд╛ рд▓рдЧрд╛рдирд╛ рд╣реА рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИред

рд╣рд░ рдХреЛрдИ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдХреА рдЧрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВред

рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреЛрд╢рд┐рд╢ рд╢рдмреНрдж рд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рд╡рд╛, рд╕реА * рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ 'рдХреЛрд╢рд┐рд╢' рди рдХрд░реЗрдВ рдмрд▓реНрдХрд┐ 'рд╕рд╣рд╛рдпрддрд╛' рдпрд╛ 'рдорд╕реНрдЯ' рдпрд╛ 'рдЪреЗрдХ рдПрд░рд░' рдЬреИрд╕реЗ рдЕрдиреНрдп рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ .. (рдореБрдЭреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ)

рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреЛрд╢рд┐рд╢ рд╢рдмреНрдж рд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рд╡рд╛, рд╕реА * рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ 'рдХреЛрд╢рд┐рд╢' рди рдХрд░реЗрдВ рдмрд▓реНрдХрд┐ 'рд╕рд╣рд╛рдпрддрд╛' рдпрд╛ 'рдорд╕реНрдЯ' рдпрд╛ 'рдЪреЗрдХ рдПрд░рд░' рдЬреИрд╕реЗ рдЕрдиреНрдп рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ .. (рдореБрдЭреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ)

рд╣рдореЗрд╢рд╛ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдХреАрд╡рд░реНрдб рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реЛрдВрдЧреА рдЬрд┐рдирдореЗрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЫреЛрдЯреЗ рдпрд╛ рдмрдбрд╝реЗ рдЕрд░реНрде рд╕рдВрдмрдВрдзреА рдЕрдВрддрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдирд┐рдХрдЯ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд╕реА-рдкрд╛рд░рд┐рд╡рд╛рд░рд┐рдХ рднрд╛рд╖рд╛рдПрдВ)ред рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рднрд╛рд╖рд╛ рдХреЗ рднреАрддрд░ рд╣реА рднреНрд░рдо рдкреИрджрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдорддрднреЗрдж рд╣рдореЗрд╢рд╛ рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред

рдЦрд░рд╛рдмред рдпрд╣ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рд╣реИ, рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рдЕрдирд╛рджрд░ рд╣реИ

@alersenkevich рдХреГрдкрдпрд╛ рд╡рд┐рдирдореНрд░ рд░рд╣реЗрдВред рдХреГрдкрдпрд╛ https://golang.org/conduct рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рдиреЗ рдХреЗ рдлреИрд╕рд▓реЗ рд╕реЗ рдЦреБрд╢ рд╣реВрдВред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рд╣реИрдХ рдХреА рддрд░рд╣ рд▓рдЧрд╛ рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╣реИред рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдЫреЛрдЯреА-рдЫреЛрдЯреА рдмрд╛рддреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдирд░ рдХреАрд╡рд░реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рдЧреЛ рдХреЛ рдмреНрд▓реЛрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реНрд╡рдЪреНрдЫ рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддрд╛рд╡ https://github.com/golang/go/issues/32620 рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдмрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЪрд░реНрдЪрд╛ рд╡рд╣рд╛рдВ рдЪрд▓ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рди рд╕реЛрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ C/C++ рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИред рдореИрдХреНрд░реЛрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА рдХреЛрд╢рд┐рд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╕рдВрдж рдЖрдПрдЧреА рдЬреЛ рд╡рд░реНрддрдорд╛рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди https://github.com/golang/go/issues/33161 рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рднреА рдЧрд▓рдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ рд╕рдмрд╕реЗ рд╕рдордЭрджрд╛рд░ рд╣реИред

@OneOfOne рд╕рдореНрдорд╛рдирдкреВрд░реНрд╡рдХ, рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕реВрддреНрд░ рдиреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдорд╛рдПрдБ рд╣реИрдВред рд╢рд╛рдпрдж рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ "рд╕рдордЭрджрд╛рд░" рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ: рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдЕрднреА рднреА рдЕрдзрд┐рдХ рд╕рдордЭрджрд╛рд░ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ if err != nil рдЧреЛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ- рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рд▓рдХреНрд╖рдг рддрд░реАрдХрд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдкреАрдЫреЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓рд╛рдЧрдд рдХрднреА рднреА рдкрдардиреАрдпрддрд╛ IMHO рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬрд╛рдиреЗ рдореЗрдВ "рд▓реЙрдиреНрдЧрд╣реИрдВрдб" рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкрдардиреАрдпрддрд╛ рдЕрдХреНрд╕рд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИред рдЧреЛ рдХреЗ рдпрд╣рд╛рдВ рдФрд░ рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдкрд░ рдХрдИ рд╕реНрдерд╛рдкрд┐рдд рдкреИрдЯрд░реНрди рд╣реИрдВ рдЬреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░, рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рд╣реИ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ рдкреВрд░реЗ рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдкрдврд╝рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдУрд╡рд░рд╣реЗрдб рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдЧрдд рд╣реИред

рдХреЗ рдмрдЬрд╛рдп:

f := try(os.Open(filename))

рдореИрдВ рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛:

f := try os.Open(filename)

рд╣рд░ рдХреЛрдИ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдХреА рдЧрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВред
тАФ@ianlancetaylor

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

// Generic Error Handler
handler := func(err error) error {
    return fmt.Errorf("We encounter an error: %v", err)  
}
a := "not Integer"
b := "not Integer"

try(handler){
    f := os.Open(filename)
    x := strconv.Atoi(a)
    y, err := strconv.Atoi(b) // <------ If you want a specific error handler
    if err != nil {
        panic("We cannot covert b to int")   
    }
}

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЯрд┐рдкреНрдкрдгреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрд▓реАрдирд░ рд▓рдЧрддрд╛ рд╣реИред рдХрд╛рд╢ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрд░ рдкрд╛рддрд╛ред

рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдпрд╛ #35179

рд╡реИрд▓: = рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ f () (рдЧрд▓рддреА) {
рдШрдмрд░рд╛рд╣рдЯ (рдЧрд▓рддреА)
}

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ:

i, err := strconv.Atoi("1")
if err {
    println("ERROR")
} else {
    println(i)
}

рдпрд╛

i, err := strconv.Atoi("1")
if err {
    io.EOF:
        println("EOF")
    io.ErrShortWrite:
        println("ErrShortWrite")
} else {
    println(i)
}

@myroid рдореБрдЭреЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг switch-else рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

```рдЬрд╛рдУ
рдореИрдВ, рддреНрд░реБрдЯрд┐:= strconv.Atoi("1")
рд╕реНрд╡рд┐рдЪ рдЧрд▓рддреА! = рд╢реВрдиреНрдп; рдЧрд▓рддреА {
рдорд╛рдорд▓рд╛ рдЖрдИрдУ.рдИрдУрдПрдл:
рдкреНрд░рд┐рдВрдЯреНрд▓рди ("рдИрдУрдПрдл")
рдорд╛рдорд▓рд╛ io.ErrShortWrite:
println ("рдПрд░рд░рд╢реЙрд░реНрдЯрд░рд╛рдЗрдЯ")
} рдЕрдиреНрдп {
рдкреНрд░рд┐рдВрдЯреНрд▓рди (i)
}

@piotrkowalczuk рдЖрдкрдХрд╛ рдХреЛрдб рдореЗрд░реЗ рд╕реЗ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

i, err := strconv.Atoi("1")
switch err {
case io.EOF:
    println("EOF")
case io.ErrShortWrite:
    println("ErrShortWrite")
} else {
    println(i)
}

рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЖрдВрдЦ рд╣реЛрдЧреА

рд╡рд╣рд╛рдБ рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ
рдорд╛рдорд▓рд╛ рддреНрд░реБрдЯрд┐!=рд╢реВрдиреНрдп

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛

рд╢реБрдХреНрд░, 8 рдирд╡рдВрдмрд░ 2019, 12:06 рдпрд╛рдВрдЧ рдлреИрди, рд╕реВрдЪрдирд╛рдПрдВ @github.com рдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ:

@piotrkowalczuk https://github.com/piotrkowalczuk рдЖрдкрдХрд╛ рдХреЛрдб рдмрд╣реБрдд рджрд┐рдЦрддрд╛ рд╣реИ
рдореЗрд░реЗ рд╕реЗ рдмреЗрд╣рддрд░ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ, рддреНрд░реБрдЯрд┐: = strconv.Atoi ("1") рд╕реНрд╡рд┐рдЪ рдЧрд▓рддреА {рдХреЗрд╕ io.EOF:
println ("EOF") рдХреЗрд╕ io.ErrShortWrite:
println ("рдПрд░рд░рд╢реЙрд░реНрдЯрд░рд╛рдЗрдЯ")
} рдЕрдиреНрдп {
рдкреНрд░рд┐рдВрдЯреНрд▓рди (i)
}

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=ABNEY4VH4KS2OX4M5BVH673QSU24DA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXGED43VMVYBW63LNMV55GO59KT рдореБрджреНрджрд╛ , 5ZPTN
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABNEY4W4XIIHGUGIW2KXRPTQSU24DANCNFSM4HTGCZ7Q
.

switch рдХреЛ else рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдореЗрдВ default рд╣реИред

рдореИрдВрдиреЗ https://github.com/golang/go/issues/39890 рдЦреЛрд▓рд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ guard рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

  • рдмрд╣рд╛рд╡ рдХреЛ рдХрд╛рдмреВ рдХрд░реЗрдВ
  • рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕реНрдерд╛рди
  • рдкрдардиреАрдпрддрд╛

рдЗрд╕рдиреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░реНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

OneOfOne picture OneOfOne  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

enoodle picture enoodle  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stub42 picture stub42  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ajstarks picture ajstarks  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rsc picture rsc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ