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
. рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ: рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЖрдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ред
рдореИрдВ рдмрд╛рдЗрдХрд╢реЗрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ (рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ), рд▓реЗрдХрд┐рди рд░рд╕реНрдЯ рд╡рд╣рд╛рдВ рдЧрдпрд╛ рдФрд░ рдЕрдВрддрддрдГ рдмрдврд╝реА рд╣реБрдИ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп ?
рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдмрд╕ рдЧрдпрд╛ред
рдЧреЛрдлрд░рдХреЙрди рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ ?
рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рддреАрди рдХрд╛рд░рдг рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреНрдпреЛрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛: рдкрд╣рд▓рд╛ ("рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ") рдФрд░ рддреАрд╕рд░рд╛ ("рд╣реИрдВрдбрд▓рд░ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ" рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде, рдЗрд╕рд▓рд┐рдП рдЪреЗрдХ рднреА рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП") рдЕрдм рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рджреВрд╕рд░рд╛ рд╢реИрд▓реАрдЧрдд рд╣реИ: рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐, рднрд▓реЗ рд╣реА рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрджрддрд░ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ:
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 ...
рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдврд╝рд╛рдпрд╛ рдФрд░ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд▓рд┐рдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпреЗ рджреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рдХреЗрд╡рд▓ рдЧрд╛рдпрдм рдЪреАрдЬреЗрдВ рд╣реИрдВ:
рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдХреНрдпрд╛ рд╣реЛрдЧрд╛
try(foobar())
рдЕрдЧрд░ foobar
рд╡рд╛рдкрд╕ (error, error)
рдореИрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗрддрд╛ рд╣реВрдВ рдФрд░ рдЕрдм рдореИрдВ ?
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрддрд╛ред рдореИрдВ рдШреБрдЯрдиреЗ рдХреЗ рдмрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рдпрджрд┐ рдореБрджреНрджрд╛ _after_ рдкреВрд░реНрдг рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрдкрд▓рдмреНрдз рдерд╛) рджрд╛рдпрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрддрд╛ред
рдореИрдВ рд╕рд░рд▓реАрдХреГрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╣рд╛рд░реА рд╣реБрдИ рд▓рдбрд╝рд╛рдИ рд╣реИред try
рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдмреБрд░рд╛ рддрд░реАрдХрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
@webermaster рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо error
рдкрд░рд┐рдгрд╛рдо try
рдХреЛ рдкрд╛рд░рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред
@dominikh рдХреА рддрд░рд╣, рдореИрдВ рднреА рд╕рд░рд▓реАрдХреГрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред
рдпрд╣ рд▓рдВрдмрд╡рдд рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред
рдЕрдЧрд░ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдирд╛ рдерд╛ , рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрдЧрд╛ред
рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде (рд╕реНрд╡реАрдХреГрдд-рдиреЗрд╕ рдХреЗ рдХреБрдЫ рдЪрд░рдг рдореЗрдВ) рдЧреЛ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рддреНрд░реБрдЯрд┐-рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдХреБрдЫ рд╕рдмрд╕реЗрдЯ рдореЗрдВ try
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдмрд┐рдирд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╢рдмреНрджрд╛рд░реНрде рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рддреАрди рд▓рд╛рдн рд╣реЛрддреЗ рд╣реИрдВ:
try
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредtry
рдЧреЛ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдХреЛрдб рдмрджрд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЖрд╕рд╛рди рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реЗрдЧреАредtry
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдиреЗ рд╕реЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред (рд╢реБрджреНрдзрддрд╛, рдкреНрд░рджрд░реНрд╢рди, рдФрд░ рдХреЛрдб рдЖрдХрд╛рд░, рдХрд╣рддреЗ рд╣реИрдВред) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдирдЧрдгреНрдп рд╡рд┐рдЪрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗредрдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдВрдЧреЗ try(foo())
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рд╣рдо рджреГрд╢реНрдп рдХреНрдпреВ рд╕реЗ рджреВрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╡рд╛рд╣ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж try
рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ try
рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдИрдбреАрдИ рд╕рдорд░реНрдерди (рдпрд╛ рдХреБрдЫ рдРрд╕реЗ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА /рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рддреНрд░
рдЬрд┐рд╕ рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рд╕реНрдердЧрд┐рдд рдмрдпрд╛рди рдЦреБрд╢ рд╣реЛред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдордЧреНрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдореБрджрд╛рдп рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рд╡рд╣ if err != nil
рдХреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИред рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдПрдХ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдзреВрд░рд╛ рд╕рдорд╛рдзрд╛рди рдмрди рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрди 2 рдЪреАрдЬреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдореМрдХрд╛ рджреЗрдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВ:
err
рдШреЛрд╖рд┐рдд рдХрд░реЗрдВредfunc sample() (string, error) {
var err error
defer fmt.HandleErrorf(&err, "whatever")
s := try(f())
return s, nil
}
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()
рдХреЗ рдХрдИ рд▓рд╛рднреЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦреЗрдЧрд╛:
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
#$ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
panic
рд╢реБрд░реБрдЖрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬреЛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕рд╣рдЬ рд╣реИ, рдпрд╣ рд╕реНрдЯреИрдХ рдХреЛ рдЦреЛрд▓рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдХрд┐рд╕реА рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ panic
рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рд╢реБрд░реБрдЖрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ recover
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╢реБрд░реБрдЖрддреА рдЖрдорддреМрд░ рдкрд░ рдкреИрдирд┐рдХ рд░рд┐рдХрд╡рд░реА рдореИрдХреЗрдирд┐рдЬреНрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рд╡реЗ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдХреЗрд╡рд▓ рдШрдмрд░рд╛рд╣рдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХрдо рдЕрдиреБрдХреВрд▓ рд╣реЛрддреЗ рд╣реИрдВред
panic
рдПрдХ рдРрд╕рд╛ рдирд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдЪрд┐рдВрддрд╛ рд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ panic
рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреИрд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдпрд╣ рдорд╛рдореВрд▓реА рд╣реЛред
рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╕реЗ рдкреАрдЫреЗ рд╣рдЯрддреЗ рд╣реБрдП, panic
рдХреЛ рдХреЙрд▓ рдореЗрдВ рдиреЗрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмреЗрд╣рдж рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдпрд╣ рд╕рд╣рдЬ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред
try
рдлрд╝рдВрдХреНрд╢рди рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреЛрдИ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рдХрд┐ try
рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рджреЗрдЦреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдХрдИ рднрд╛рд╖рд╛рдПрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ред
try
рдореЗрд░реА рдирдЬрд░ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╣реИред _рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ_ рдЬрдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЗрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░реЗрдЧрд╛ред _ESPECIALLY_ рдЬрд╛рд╡рд╛ рдЬреИрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд╣рд╛рдВ try
рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдХрд╛рд░рдг)ред
рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА 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
рдХреА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
рдпрд╣ рдЧреЛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИред рд▓реЛрдЧ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд╛рдж рдореЗрдВ рд╢реВрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд┐рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЧреЛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЬрд╛рдБрдЪ/рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрд░рд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдиреЗ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛; рдпрд╣рд╛рдВ _рдЖрд╡рд░реНрддреА рдереАрдо_ рджреЗрдЦреЗрдВ:
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
рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИ, рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХреНрд░рдо рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддреА рд╣реИ, рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рддреА рд╣реИред рдорд╛рдорд▓реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЙрд▓ рдЕрдиреБрдХреНрд░рдо рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ:
try(step4(try(step1()), try(step3(try(step2())))))
рдЕрдм рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рднрд╛рд╖рд╛ рдордирд╛ рдХрд░рддреА рд╣реИ:
f(t ? a : b)
рдФрд░ f(a++)
рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ред рдЬрд╛рдВрдЪ/рд╕рдВрднрд╛рд▓ рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рддрд░реНрдХ рд╕рдВрджрд░реНрднреАрдХрд░рдг рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдерд╛ред
рдпрд╣ error
рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдФрд░ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЕрдЧрд░ рд╣рдореЗрдВ рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ/рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВ: if errno := f(); errno != 0 { ... }
рдпрд╣ рдХрдИ рд░рд╛рд╕реНрддреЗ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдЬреЛ рд╕реНрдЯреЛрд░реЗрдЬ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЧрд▓рдд рдЗрдирдкреБрдЯ рдпрд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рдХреЛрдб рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ return err
рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
@gopherbot Go2, LanguageChange рдЬреЛрдбрд╝реЗрдВ
рдХреИрд╕реЗ рдХреЗрд╡рд▓ ?
rust
рдХреА рддрд░рд╣ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ
рдЬрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ рд╣рдо try() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрд╢рдп рдореЗрдВ рд╣реИрдВ, рд╡рд╣ рджреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдФрд░ рдХреЛрд╢рд┐рд╢ () рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ () рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирд┐рдпрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИред рд▓реЗрдХрд┐рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
func doSomething() (int, %error) {
f := try(foo())
...
}
%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
рднреА рдПрдХ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдкрд░рд┐рд╡рд░реНрддрдирдХрд╛рд░реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИред
panic(...)
рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рдЕрдкрд╡рд╛рдж рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ) рдХрд┐ return
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдПрдХ рддрд┐рд╣рд╛рдИ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдФрдЪрд┐рддреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде 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
$ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдЪрд╛рд╣рд┐рдП, рдпрд╣ рди рдХреЗрд╡рд▓ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд▓реНрдХрд┐ рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рдЬрдЯрд┐рд▓рддрд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред
"рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред" тАФ рд░реЛрдм рдкрд╛рдЗрдХ
рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ, рд╣рдо рдЗрд╕ рд╕реНрд▓рд╛рдЗрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдПрдХ рд╕реНрдерд┐рддрд┐ рдЬрд╣рд╛рдВ рдореБрдЭреЗ 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] рдореЗрдВ рд╣реИред
рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕, рдЬрд┐рдирдХреЗ рдЯрд╛рдЗрдк рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЛ рднрд╛рд╖рд╛ рдХреЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдПрдХ рдПрд╕реНрдХреЗрдк рд╣реИрдЪ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ (рдФрд░ рдкреИрдирд┐рдХ) рдХреЛ рддреБрд░рдВрдд рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЧреЛ (рдФрд░ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ) рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреВрд░ рдХреА рдХреМрдбрд╝реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдХреЛрд╢рд┐рд╢ рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдкрд╣рдЪрд╛рди рд▓реЗрдВрдЧреЗ, рдЬрдм рдХреБрдЫ рдХреЛ рдЗрд╕рдХреА рдЖрджрдд рд╣реЛ рдЬрд╛рдПрдЧреА, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рд╣рдо рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЪреНрдЫрд╛ рдЖрдИрдбреАрдИ рд╕рдорд░реНрдерди рднреА рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рджреВрд░ рдХреА рдХреМрдбрд╝реА рд╣реИред 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
рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реБрджреНрдз рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣реБрдб рдХреЗ рддрд╣рдд рдПрдХ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИредрдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:
рдирдВрдмрд░ 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
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕реЗ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ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
рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓рд╛ рдХрджрдо рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП
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
}
рдпрд╣ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реБрдП рдЕрдВрддрд░рд┐рдХреНрд╖ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╣реИред
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:
defer
рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдорд┐рдд рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рди рдХреЗрд╡рд▓ рдЧреЛрдбреЛрдХ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рднрдпрд╛рдирдХ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реИред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рдЪреАрдЬ рдХреЛ рдПрдХ рдФрд░ func()
рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдмреБрд░реЗ рдЕрднреНрдпрд╛рд╕" рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИредрдХреЛрдИ рднреА рдЖрдкрдХреЛ рдХреЛрд╢рд┐рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдореИрдВ рдПрдХ рдмрд┐рдВрджреБ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдПрдХ рджреЛрд╖ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реЛред
try(try(try(to()).parse().this)).easily())
рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛редрдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ 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
}
рдлрд┐рд░, рдЖрдк
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
}
рдЖрджрд┐ред
рдлрд┐рд░ рд╕реЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ
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 рдХрд╛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдореБрджрд╛рдп рдХреЛ рд╕реБрдирд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
- @pierrec рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ gofmt рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рднрд╛рд╡реЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдПрдХ рдкрдВрдХреНрддрд┐ (@zeebo) рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдердиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gofmt рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдХреЛрдИ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
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
рддреНрд░реБрдЯрд┐-рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛? рд╣рдореЗрдВ "рджреГрд╢реНрдп рд╕реБрд░рд╛рдЧ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдпрд╣ рдЙрди рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ
try
рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдм рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдирдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рдЗрддрдирд╛ рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реИредрдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рд╣реЛрдирд╛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ: рд╕рд╛рдорд╛рдиреНрдп, рдЕрдиреБрд╢рдВрд╕рд┐рдд рдорд╛рдорд▓рд╛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдпрд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╣реИ, рди рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ред рдпрд╣ рдЧреЛ рд╕рдореБрджрд╛рдп рдХреА рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрд╢рдВрд╕рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред
рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрдВрдЧреЗред рд╣рд░ рдЬрдЧрд╣ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдХреЛрд╢рд┐рд╢ рдХреА рдПрдХ рднреА рдШрдЯрдирд╛ рдпрд╛рдж рдЖрддреА рд╣реИред рдЗрддреНрдпрд╛рджрд┐ред
рдПрдХ рд╕реНрдкрд╖реНрдЯ 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
рдХреАрд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВ рд╣реИ, рдХреЛ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:
рдЙрди рджреЛ рдЖрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЦрдВрдбрди рдХреНрд░рдорд╢рдГ рд╣реИ:
try
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ" / рдпрд╣ 100% рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИ (рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛)ред рд▓реЗрдХрд┐рди 2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд╕реНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рди рддреЛ tryf
рдкреНрд░рддрд┐-рдкреНрд░рд╕реНрддрд╛рд╡ (рдЬрд┐рд╕реЗ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рджреЛ рдмрд╛рд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рди рд╣реА try(X, handlefn)
рдкреНрд░рддрд┐-рдкреНрд░рд╕реНрддрд╛рд╡ (рдЬреЛ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛) рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереАред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрд░реНрдХ рджреЗрдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ try
, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд╕рдЬрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдФрд░ рдПрдХрд▓ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐-рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХреА рдУрд░ рдзрдХреЗрд▓ рджреЗрдЧрд╛ред
рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдФрд░ рдореИрдВ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
defer
рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред defer
рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдмреНрджрд┐рдХ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЕрд░реНрдерд╛рддdefer func(...) {...}
defer packageName.functionName
рдЬрдм рдШрдмрд░рд╛рд╣рдЯ рдпрд╛ рдЖрд╕реНрдердЧрд┐рдд рд╡рд╛рдкрд╕реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕реНрдердЧрди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреА рд╣реИ, рддреЛ рд╡реЗ рдЕрдкрдиреЗ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ
try
рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдиреЗ рджреЗрдВ
рдЬрдм 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 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡реЗ рд╣реИрдВ:
try
defer
рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВtry
рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓реЗрдВ рдЬрдм рдпрд╣ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╕реНрдердЧрд┐рдд рдХреЙрд▓ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИредcheck/handle
рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрди рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рднреВрдорд┐ рджреЗрдЦрдХрд░ рд╕реБрдЦрдж рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдирд┐рд░рд╛рд╢ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдЗрддрдирд╛ рдзрдХреНрдХрд╛-рдореБрдХреНрдХреА рд╣реБрдИ рд╣реИред
рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреБрд╢-рдмреИрдХ рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдмреЛрд╕рд┐рдЯреА (рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╕реНрдерд┐рддрд┐) рд╕реЗ рдХрд╛рдлреА рдЦреБрд╢ рд╣реИрдВ рдФрд░ рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдордореЗрдВ рд╕реЗ рдмрд╛рдХреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рд░рд▓ рдФрд░ рдЧреЛ-рд▓рд╛рдЗрдХ рд╣реЛрдиреЗ рдХреЗ рдордзреБрд░ рд╕реНрдерд╛рди рдХреЛ рд╣рд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЖрдк рд╣рдореЗрд╢рд╛ рд╡рд╛рдкрд╕ рдЧрд┐рд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ try
рдиреЗ рдареАрдХ рд╡реИрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬреИрд╕рд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗред
рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:
рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдирд╛рдкрд╕рдВрдж рд╣реИ, рдЬрдм defer
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирд╛рдорд┐рдд рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐, рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛, рдЬреЛ рдмрд╛рдзрд╛рдУрдВ рдкрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдмрд╛рдХреА рднрд╛рд╖рд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ try
рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЗрд▓рддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдЕрдкрдирд╛ рдкрд╕рдВрджреАрджрд╛ рд╕рдорд╛рдзрд╛рди рдПрдХ рджреВрд╕рд░рд╛ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди (рд╢рд╛рдпрдж ptry
рдпрд╛ must
) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрд╢рд╛ рдШрдмрд░рд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( main
рд╕рд╣рд┐рдд)ред рдпрджреНрдпрдкрд┐ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ 'рдирд┐рдХрдЯ рдХреЙрд▓' рдерд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ рдХрд┐ go try(f)
рдпрд╛ defer try(f)
рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рдереЗ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдЬреЛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рддрдХрдиреАрдХ рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА рдпрджрд┐ 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
рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ
рдЗрд╕ рддрд░рд╣, рдпрд╣ рдПрдХ рдмрд┐рд▓рд┐рди рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕рднреА рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ:
рдЬрдмрдХрд┐ рджреЛрд╣рд░рд╛рд╡ 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
}
рддреНрд░реБрдЯрд┐-рд╕реНрдердЧрд┐рдд рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВ:
f
рдХреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде g
f
рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИf
рдХреЗрд╡рд▓ рддрднреА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рди рд╣реЛ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 рд╣рд╛рдБ рдпрд╣ рдЖрд╕рд╛рди рд╣реИ рд▓реЗрдХрд┐рди ...
рдореИрдВрдиреЗ рджрд░реНрдЬрдиреЛрдВ рдмрд╛рд░ рд╕рдордХрдХреНрд╖ рдХрд╛рд░реНрдп рд▓рд┐рдЦрд╛ рд╣реИред
рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд╛рдн рд╣реИрдВ:
@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 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╕рдмрдорд┐рдЯ рдХрд┐рдП рдЧрдП рдПрдХ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреА рдЧрдИ рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдПрдХ рд╕реАрдзрд╛ рдЙрджреНрдзрд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ _(рдореИрдВ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд▓реЗ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рд▓реЛрдЧреЛрдВ рдХреЗ рдмрдЬрд╛рдп рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ):_
_"рдПрдХ рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рднреА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рдпрд╛ рдХреЛрдИ рднреА рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛; рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рд╡реЗ рднрд╛рд╖рд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдФрд░ рд╕рднреА рдХреЛ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВ? рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рд╣реИрдВ рдпрд╣рд╛рдВ рдорд╛рдорд▓реЗ рд╣реИрдВ? рд▓реЛрдЧ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд▓реЛрдЧ рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рд╕рдХреНрд╖рдо рд╣реЛрдВ ... рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рд╡реЗ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдкрдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХрд░рддрд╛ рд╣реИ...?"_
тАФ рдПрдХ рдХреЛрд░ рдЧреЛ рдЯреАрдо рд╕рджрд╕реНрдп
рд╕рдЪ рдХрд╣реВрдВ рддреЛ рдЬрдм рдореИрдВрдиреЗ рдЙрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИ рддреЛ рдореИрдВрдиреЗ рджреЛ рднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рд╣реИ:
рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реА рднрд╛рд╡рдирд╛рдПрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдереАрдВ/рд╣реИрдВ; рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдФрд░ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЬрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ рдЧреЛ рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪреБрдирддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рднрд╛рд╖рд╛ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдИрд░реНрд╖реНрдпрд╛рдкреВрд░реНрдг рд░рдЦрд╡рд╛рд▓реА рд╣реИред
рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдореБрдЭреЗ рдЗрддрдирд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдХреЛрд░ рдЯреАрдо рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЙрд╕реА рд╕реНрддрд░ рдкрд░ рдЦреБрджрд╛рдИ рдХрд░ рд░рд╣реА рд╣реИ, рдЬреЛ рд╣рдардзрд░реНрдорд┐рддрд╛ рд╕реЗ рдПрдХ рдЧреВрдврд╝ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдирд░рдХ рдореЗрдВ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЛ рд╕рдореБрджрд╛рдп рдХрднреА рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
_(рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЯреАрдо рд╕рдВрджреЗрд╢рд╡рд╛рд╣рдХ рдХреЛ рдЧреЛрд▓реА рдирд╣реАрдВ рдорд╛рд░реЗрдЧреА рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреА рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдЧреА рдЬреЛ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХреЛ рд╣рдо рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ "рд╡реНрдпрдХреНрддрд┐рддреНрд╡рд╣реАрди" рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдХреЛрд░ рдЯреАрдоред)_
рдпрджрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рдПрдХ рд╕рдореНрдореЛрд╣рдХ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рднреА рд╕рдореБрджрд╛рдп-рдЬрдирд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ _ рд╕рднреА _ рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдмрд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдпрд╣ рднреА рдХреБрдЫ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ try()
рдФрд░ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдмреАрдЪ рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓рдЧрднрдЧ 18 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЧреЛ рдЯреАрдо рдХреЗ рдПрдХ рдЕрдиреНрдп рд╕рджрд╕реНрдп рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:
_"рдЬрдм "рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" (рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдореЗрдВ рдмрдбрд╝реА рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдмрдбрд╝реЗ рдХреЛрдб рдЖрдзрд╛рд░), рдХреЛрдб рдХреЛ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рд▓реЗрдЦрди рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд▓рд┐рдПред"_
рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП _рдкреНрд░рд╛рдердорд┐рдХ_ рдмрддрд╛рдП рдЧрдП рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдФрд░/рдпрд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ рднреА рдиреЗрд╕реНрдЯреЗрдб try()
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреИрд╕реЗ try(try(try(to()).parse().this)).easily())
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдпрд╣реА рд╕рдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░рдг рдпрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╡реЗ _"рдПрдХреНрд╕рдкреНрд░реЗрд╢рди"_ рд╣реИрдВ, рдЗрд╕ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ try()
рдПрдХ рдиреЗрд╕реНрдЯреЗрдмрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рднреА рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ?
рдЕрдм рдпрд╣рд╛рдБ рдХрд┐рд╕реА рдиреЗ рдХрд╣рд╛ _"рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ [рдиреЗрд╕реНрдЯреЗрдб try()
s] рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВ"_ рдФрд░ рдЙрд╕ рдХрдерди рдХреЛ рдЪреБрдиреМрддреА рдирд╣реАрдВ рджреА рдЧрдИ рдереАред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд▓реЛрдЧ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ try()
рдШреЛрдВрд╕рд▓рд╛ рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗ, рддреЛ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╡рд╣реА рд╕рдореНрдорд╛рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд▓реЛрдЧ рдХрд╣рддреЗ рд╣реИрдВ _ "рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВ?"_
рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рддрд░реНрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдиреНрдп рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рднреА рдЗрд╕ try()
рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╡реИрдз рддрд░реНрдХ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп 58%
рдбрд╛рдЙрди рд╡реЛрдЯ 42%
рдЕрдк рд╡реЛрдЯреЛрдВ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рднрд╛рдЬрдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдмреЛрд░реНрдб рдкрд░ рд▓реМрдЯрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
рдкреАрдПрд╕ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬреАрдн-рдЧрд╛рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпреЛрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдЬреНрдЮрд╛рди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
_"рдХреЛрдИ
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
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
try
рдХреЗ рд╕рд╛рде, рдпрджрд┐ рд╣рдо рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рдЧрдВрднреАрд░ рдХрдореА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ super(arg1, ..., argn)
рдмрд┐рд▓реНрдЯрд┐рди рдХреЙрд▓рд░ рдХреЗ рдХреЙрд▓рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдКрдкрд░ рдПрдХ рд╕реНрддрд░, рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП arg1,...argn, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реБрдкрд░ рд░рд┐рдЯрд░реНрди рдЕрдЧрд░ рдЖрдк рдХрд░реЗрдВ рддреЛредtry
рдореИрдВрдиреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИредрдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдорд╕реНрдпрд╛ 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) рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реИ
func
/рдХреНрд▓реЛрдЬрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред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
}
рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ рдЬреЛ рдПрдХ рдЪрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдЧрд░ рдЧрд▓рддреА рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рд╡рд╛рдкрд╕реА! = рд╢реВрдиреНрдп рдорд╛рдорд▓рд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рд░рд┐рдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдирд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рд╕реНрдЯреИрдВрдбрдкреЙрдЗрдВрдЯ рд╕реЗ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ
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")
}
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВ:
err
_"рдЬрд╛рджреБрдИ"_ рдШреЛрд╖рд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдЬрд╛рджреВ рдХрдо рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд╣реАрдВ? рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:f, err := os.Open("foo.txt"); err {
return errors.Wrap(err, "some context")
}
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
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдЕрдЧрд░ рджрд░реНрдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рдордд рдХрд░реЛ" рдХреЗ рдмреИрдирд░ рддрд▓реЗ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИредрд╢реНрд░реЗрдп: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реА рдмрд╛рд░ @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 рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
рдореИрдВ рдЗрд╕реЗ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдмрдпрд╛рди рджреЗрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдЕрд░реНрдерд╛рдд, рд╡реНрдпрдХреНрддрд┐рдЧрдд "рдХреЛрд╢рд┐рд╢" рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛)ред рд╣рд╛рдВ, рдпрд╣ рдмрд╛рд╣рд░реА рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд░рдВрддрд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдПрдХ рдФрд░ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдкрдардиреАрдпрддрд╛/рд░рдЦрд░рдЦрд╛рд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд░реВрдк рдореЗрдВ "рдХреЛрд╢рд┐рд╢" рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдо рдкрдардиреАрдпрддрд╛, рдЖрдИрдПрдордУ рдмреЗрд╣рддрд░ рд╕рдВрддреБрд▓рди рд╣реЛрдЧрд╛ред
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
}
рдЖрд╡рд╢реНрдпрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдВрдЧреЗ:
for error{}
рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, $#$3 for range{}
#$ рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд░ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред
<object>.Error() string
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрднреА рдЬрдм for error{}
рдирд┐рд░реНрдорд╛рдг рдЙрд╕реА func
рдХреЗ рднреАрддрд░ рдореМрдЬреВрдж рд╣реЛред
рдЬрдм рдХреЛрдИ func
рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рд░рд┐рдЯрд░реНрди рдорд╛рди рдореЗрдВ _"рддреНрд░реБрдЯрд┐"_ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ for error{}
рдирд┐рд░реНрдорд╛рдг рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
рдПрдХ _"рддреНрд░реБрдЯрд┐"_ рд▓реМрдЯрд╛рддреЗ рд╕рдордп рдЧреЛ рдЙрд╕ рдлрдВрдХ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ <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()
рдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИ
рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЖрдЬрдорд╛ рд╕рдХрддрд╛ рдерд╛ред рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдерд╛
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:")
}
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
рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╣реИ:
рджреВрд╕рд░реА рдУрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 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
рдХреЗ рдЪрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдВрдЧреЗ:
defer
рдХрдерди рджреНрд╡рд╛рд░рд╛ рд╕рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ defer
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ (рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдлрд┐рд░ рд╢реВрдиреНрдп рд▓реМрдЯрдиреЗ) рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬрд╝ рд╣реИред рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдЬрд┐рд╕реЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ рд╡рд╣ рдЕрдм рднреА #2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд▓реЗрдмрд▓/рдХреЛрдб рдХреЛ рдлрдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдХреЗ рдкрд╛рд╕ рд░рдЦрдирд╛ рдФрд░ рдлрдВрдХреНрд╢рди рдмреЙрдбреА рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЬрд╛рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╛ рддреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реЗ рдЕрдЬреАрдм рдЕрд╡рд╕рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рд╡рд░реНрддрди рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдмрд▓ рдФрд░ goto
рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рд╖рдп рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ @josharian рдиреЗ рдХрд╣рд╛) #26058 рдкрд░ рдкрд╣рд▓реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдмрд▓ рдХрд╛ рдирд╛рдо panic
рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ #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
рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИредрд╣реИрдВрдбрд▓рд░ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдХреНрд╕рд░ рджреЛ рдкреНрд░рдореБрдЦ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ:
рдЗрд╕реЗ if x, err := thingie(); err != nil { handle(err) }
рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ try x := thingie else err { handle(err) }
рдХреА рддрд░реНрдЬ рдкрд░ рд╕реБрдЭрд╛рд╡ рдЙрд╕ рдмрд╛рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗред рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ if
рдХрд╣реЗрдВ?
рдпрд╣ 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 }
рдкрд░ рдЧреНрд▓реЗрдЬрд╝ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ рдЖрдЧреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдкрд░, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рд▓рд╛рдпрдХ рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдмреЙрдпрд▓рд░ рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрдо рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред IMHO рдпрд╣ рдХреЛрдб рдХреЛ "рдЕрд╕реНрд╡реАрдХрд╛рд░" рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдордЬрдмреВрдд рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЬрд╛рдУ
рдЗрд╕рдХрд╛ рдирд╛рдо рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдирд╣реАрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╕рд░рд▓рддрдо рд░реВрдк рдореЗрдВ, рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ: "рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреЙрд▓рд░ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ" рд▓реЗрдХрд┐рди рд╡рд╣ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ :-) рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рддреНрд░реБрдЯрд┐ рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЕрдирд┐рдЪреНрдЫрд╛ рд╕реЗ рдЕрдкрд╡рд╛рдж рдкреНрд░рдмрдВрдзрди рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣реА рд╣реИ рдХрд┐ рдпрджрд┐ рдП рдХреЙрд▓ рдПрдХ рдХреЛрд╢рд┐рд╢ рдЧрд╛рд░реНрдб рдореЗрдВ рд╣реИ рдФрд░ рдмреА рдПрдХ рдХреЛрд╢рд┐рд╢ рдЧрд╛рд░реНрдб рдореЗрдВ рд╕реА рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реА рдПрдХ рдХреЛрд╢рд┐рд╢ рдЧрд╛рд░реНрдб рдореЗрдВ рдбреА рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдбреА рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рддреЛ рдЖрдкрдиреЗ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рдЧреЛрдЯреЛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рднреА "рдЬрд╛рджреБрдИ" рд▓рдЧрддрд╛ рд╣реИред
рдФрд░ рдлрд┐рд░ рднреА рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рд╡рд╣ рд╡рд┐рдХрд▓реНрдк рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
@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
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() ) рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЕрднреА рднреА рдПрдХ рдирд╛рдЧ рд╣реИ
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ (рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ: рдкреА) рдЗрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ:
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
рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ @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
рджреЛ рд╕рд╡рд╛рд▓:
рдПрд▓рдПрдордХреЗрдбрдмреНрд▓реНрдпреВрд╡рд╛рдИрдЯреАред
рд╢реВрдиреНрдп рдЖрд░реНрдЧ (рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдмрд┐рд▓рд┐рди) рдХреЗ рд╕рд╛рде 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() рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдЧрд╛ред
рдЖрдк рд╣рдореЗрд╢рд╛ рдЖрд╕реНрдердЧрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрд╡рд┐рдЪ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдЧрд╛ (рдпрд╛ рдирд╣реАрдВ)ред
рдЕрдм рддрдХ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреЛ рдЯреАрдо рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ - рдореБрдЭреЗ рдордЬрдмреВрдд рдзрд╛рд░рдгрд╛ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдХрд┐ рдЯреАрдо рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реА рд╣реИ рдЬреЛ рдореЗрдЬ рдкрд░ рд╣реИред рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдПрдХ рдЕрдиреБрд░реЛрдз:
рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдИрдПрдордУ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд░реЗрдкреЛ рдореЗрдВ рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рдПрдХ рдЧреИрд░-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред рдореЗрд░реА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рдПрдВрдЧреЗ, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЕрдкрд╡рд╛рдж рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп try()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрдиреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдкреНрд░рдЪрд▓рд┐рдд рднрд╛рд╡рдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЕрдм рдХреЛрдИ рднреА рднрд╡реНрдпрддрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╣рд╛рд░реА рд╣реБрдИ рд▓рдбрд╝рд╛рдИ рд▓рдбрд╝ рд░рд╣реА рд╣реЛрдЧреА рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рд┐рд░реНрдл рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЖрдкрддреНрддрд┐ рджрд░реНрдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЯреАрдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддреА рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП 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) рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдирд╣реАрдВ, рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рди рдХреЗрд╡рд▓ рднрд╛рд╖рд╛ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рд╡рд╣реА рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ:
рдЖрдк рдкрд░рд┐рдгрд╛рдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВред рддреЛ рдореИрдВ рднреА рдРрд╕рд╛ рд╣реА рдХрд░реВрдВрдЧрд╛ред
рдореИрдВ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП рдЬреЛ 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
рдЪрд▓рддреА рд╣реИ рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ рддреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдирд┐рдХрд╛рд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
(рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЬреЛ рд╡рд╣ рдореБрдЭреЗ рдиреАрдЪреЗ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рддреНрд░реБрдЯрд┐ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рднреА рдпрд╣ рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди "рд░рди рдХрд╛рдЗрдВрдб" рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИ рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░ рдЧрдпрд╛)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдзреНрд╡рдЬ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╕рднреА рдЧреЛ рдХреЛрдб рд╕реНрд░реЛрдд рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬрд┐рд╕рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 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
рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдХрд░рддреЗ рд╣реИрдВред
рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдкреИрдЯрд░реНрди рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрджрд▓рддреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдкреНрд░рддрд┐ рд▓рдЪреАрд▓рд╛ рд╣реИ; рдирдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд╛рд░реНрдп рдХреЛрдб рдХреЛ рддреЛрдбрд╝рдирд╛ рдкрдбрд╝реЗред рдФрд░ рдпрд╣ рдПрдХ рдХреНрд▓реАрдирд░ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдИрдПрдордУ рд╣реИ рдЬреЛ рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд╛рдкрд╕ рдХреВрджрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реИред
рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП @ 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()
рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдпрд╛рд╕ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ рдФрд░ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред"_
рдпрд╣ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдПрдХ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИред
рдФрд░ рдпрд╣ рджреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рджреБрдЦреА рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░рдг:
рдпрд╣ рд╕рдЬрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХрд╛ рдорд╛рд░реНрдЧ рдмрдирд╛ рджреЗрдЧрд╛ - рдмрд╣реБрдд рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ - рдФрд░ рдХрдИ рд▓реЛрдЧ рдЙрд╕ рдХреЛрдб рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрдо рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХреЛрдб рдХрдо рдордЬрдмреВрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди / рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ .
рдореЗрд░реЗ рдЬреИрд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ 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_ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреАрдИ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрдпрд╛рдирдХ рдХреЛрдб рдЧрд╛рд▓реА рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЖрдИрдбреАрдИ рд╕рдорд░реНрдерди рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЖрдкрддреНрддрд┐тАФрд▓реЛрдЧ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБрдд рдЦрд░рд╛рдм рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВтАФрд╣рд░ рднрд╛рд╖рд╛ рдореЗрдВ рд╣рд░ рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреА рд╣рд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдард╛рдИ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ ?
рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ?
рдирд╣реАрдВред рд╣рдо "рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдкрдардиреАрдп рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдардиреАрдп рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ" рдФрд░ "рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдкреНрд░рдореБрдЦ рдЙрдкрдпреЛрдЧ рдЕрдкрдардиреАрдп рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛" рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕реА рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐? : рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рдореЗрдВ рдЖрддрд╛ рд╣реИред (рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрднреА рднреА ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреЛрдб рджреЗрдЦрд╛ рд╣реИ: рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдХрд░ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯ рд░рд╣рд╛ рд╣реИред)
рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕
рдЗрд╕ рдЪрд░реНрдЪрд╛ рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ:
f := try(os.Open(file))
, рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ (рдмрд┐рд▓реНрдЯрд┐рди рдлрдВрдХреНрд╢рди)f := try os.Open(file)
, рдПрдХ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ (рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб)f := os.Open(file)?
, рдЬреИрд╕реЗ рдЬрдВрдЧ рдореЗрдВ (рдХреЙрд▓-рдкреНрд░рддреНрдпрдп рдСрдкрд░реЗрдЯрд░)f := os.Open?(file)
, @rogpeppe рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ (рдХреЙрд▓-рдЗрдирдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░)try f := os.Open(file)
, @thepudds рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ (рдХрдерди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)try ( f := os.Open(file); f.Close() )
, @bacul рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ (рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдмреНрд▓реЙрдХ)(рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореБрдЭреЗ рдореВрд▓ рдХрд╣рд╛рдирд┐рдпрд╛рдВ рдЧрд▓рдд рд▓рдЧреАрдВ!)
рдЗрди рд╕рднреА рдХреЗ рдкрдХреНрд╖ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВ, рдФрд░ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд╕рднреА рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдЧреЗ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рдЙрджрд╛рд╣рд░рдг @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)
)
рдпрд╣ рдмрд╕ рдЗрддрдирд╛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рд▓реМрдЯрд╛рдИ рдЧрдИ рдХреЛрдИ рднреА рддреНрд░реБрдЯрд┐ рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдпрд╛рд╕ рдмреНрд▓реЙрдХ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдереАред
рддреБрдордиреЗ рдХрд╣рд╛ рдерд╛
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдореВрд▓ рддрд░реНрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛! рдЬреЛ рддрдереНрдп рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдХреЗрд╡рд▓ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИред рдореИрдВ рдПрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рд┐рд╡рд╛рдп рдЬрдм рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред
рдХреБрдЫ рдФрд░ рдмрд┐рдВрджреБ рдЬреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
try(try(foo(try(bar)).fum())
рдЬреИрд╕реЗ рднрд╛рд╡реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдпреЛрдЧ рдкрд░ рдард╣рд╛рдХрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рдРрд╕реЗ рдЙрдкрдпреЛрдЧреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░рдиреА рдкрдбрд╝рддреА рд╣реИ рдФрд░ рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рд╕реНрддрд░ рдкрд░ рд╕рднреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдирд┐рдЪреЛрдбрд╝рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИредtry
$#$ рдХреЗ рдмрдЬрд╛рдп return-on-error
рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред рдмреНрд▓реЙрдХ рд╕реНрддрд░ рдкрд░ рдирд┐рдЧрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ!рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдЕрднреА рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред
@ рдЖрд░рдПрд╕рд╕реА
[...]
рдореБрдЦреНрдп рдПрдХ рдпрд╣ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ рдЬрдЯрд┐рд▓, рдЕрдкрдардиреАрдп рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдРрд╕рд╛ рдХреЛрдб рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ @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)ред рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЬреНрдЮрд╛рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ!
@ рдЖрд░рдПрд╕рд╕реА
рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕
рдЗрд╕ рдЪрд░реНрдЪрд╛ рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИ:
f := try(os.Open(file))
, рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ (рдмрд┐рд▓реНрдЯрд┐рди рдлрдВрдХреНрд╢рди)f := try os.Open(file)
, рдПрдХ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ (рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб)f := os.Open(file)?
, рдЬреИрд╕реЗ рдЬрдВрдЧ рдореЗрдВ (рдХреЙрд▓-рдкреНрд░рддреНрдпрдп рдСрдкрд░реЗрдЯрд░)f := os.Open?(file)
, @rogpeppe рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ (рдХреЙрд▓-рдЗрдирдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░)try f := os.Open(file)
, @thepudds рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ (рдХрдерди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)try ( f := os.Open(file); f.Close() )
, @bacul рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ (рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдмреНрд▓реЙрдХ)
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;
}
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореЗрд░рд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдореЗрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрд▓реЛрдЪрдирд╛ рдХрд╛рдлреА рд╣рдж рддрдХ рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рдЙрдЪреНрдЪ рдЙрдореНрдореАрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╣реЛрддрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдРрд╕реА рдЙрдЪреНрдЪ рдЕрдкреЗрдХреНрд╖рд╛рдПрдБ рдЙрдЪрд┐рдд рдереАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬреЛ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓, рд╡реНрдпрд╛рдкрдХ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬреЛ рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд 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 рдорд╛рди рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЖрдкрдХреЗ рдХрд░реНрдХрд╢ рдЪреЗрд╣рд░реЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдмрд╛рдд рдирд╣реАрдВ рдереАред :рдЖрдБрдЦ рдорд╛рд░рдирд╛:
рдореИрдВ рдХрд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЧреЛ рдореАрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░рджрд░реНрд╢рди рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдХреБрдЫ рдирдП рд╡рд┐рдЪрд╛рд░ рд╕реБрди рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ (рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдпрд╛ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЗ) рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рддрд┐рднрд╛рдЧреА рд╡реЗ рд╣реИрдВ рдЬреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ "рдФрд╕рдд рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ" (рд╕рд┐рд░реНрдл рдПрдХ рдХреВрдмрдбрд╝)ред
рдРрд╕рд╛ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмреИрдардХ рдХреА рдереА рдФрд░ рджреЛ рдкреИрдЯрд░реНрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдереА:
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))
...
}
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░реНрдХрд╕рдВрдЧрддрддрд╛ рдФрд░ рд╕рдлрд▓рддрд╛ рдЗрди рдорд╛рдиреНрдпрддрд╛рдУрдВ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдХрджрдореЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ:
рдпрджрд┐ рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдпрд╛ рддрд╛рд░реНрдХрд┐рдХ рдХрджрдо рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд▓рдд рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рд╣рдореЗрдВ рдмрддрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдЖрдзрд╛рд░реЛрдВ рдореЗрдВ рд╕рд╛рдХреНрд╖реНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реИред рд╣рдореЗрдВ рдЙрди рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрдиреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдПрдВ рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЕрдиреБрдЪрд┐рдд рд╣реИ рдпрд╛ рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рдЦрд░рд╛рдм рдХрд░ рджреЗрддрд╛ рд╣реИред рд╣рдореЗрдВ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдПрдВ рдЬрд╣рд╛рдВ рдХреЛрд╢рд┐рд╢ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рдереАред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдЖрдзрд╛рд░ рдПрдХ рддрд░рдл рдпрд╛ рджреВрд╕рд░реЗ рдкрд░ рдХрд┐рддрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдбреЗрдЯрд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред
рдзрдиреНрдпрд╡рд╛рджред
рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрдн рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @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() рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ ?
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
рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреА рдпрд╛ рдЪреЛрдЯ рд▓рдЧреЗрдЧреАред рдпрд╣рд╛рдВ рдХреБрдЫ рддрд░реАрдХреЗ рджрд┐рдП рдЧрдП рд╣реИрдВ:
outf.Close()
рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВредfunc foo() (err error) {
outf := try(os.Create())
defer func() {
cerr := outf.Close()
if err == nil {
err = cerr
}
}()
...
}
defer outf.Close()
рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ try(outf.Close())
рдХрд░рддрд╛ рд╣реИред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 рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХреБрдЫ рдмрд╛рддреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред
_рдирд╛рдорд╛рдВрдХрд┐рдд рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдоред_ рдирд╛рдорд┐рдд рддреНрд░реБрдЯрд┐ рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЪрд┐рдВрддрд╛ рд╣реИред рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрддреАрдд рдореЗрдВ рдЗрд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╕рдореНрдореЗрд▓рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдХрд┐рд╕реА рднреА рдордЬрдмреВрдд рдирд┐рд░реНрдгрд╛рдпрдХ рдХрд╛рд░рдХ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рдЪреБрдирд╛ рд╣реИред рдФрд░ рдЕрддреАрдд рдореЗрдВ рднреА, рдПрдХ рдордЬрдмреВрдд рдирд┐рд░реНрдгрд╛рдпрдХ рдХрд╛рд░рдХ рдЬреИрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛, рдЕрдирд╛рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкрд░рдВрдкрд░рд╛ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЧрдпрд╛ред рдЕрдм рдПрдХ рджреВрд╕рд░рд╛ рдордЬрдмреВрдд рдирд┐рд░реНрдгрд╛рдпрдХ рдХрд╛рд░рдХ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдирд╛рдордХрд░рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдЖрдкрддреНрддрд┐рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рдкрд░ рдХрд╛рдлреА рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡реНрдпрдХреНрдд рдХреА рд╣реИ, рдФрд░ рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпреЛрдВред рдпрд╣ рд▓рдЧрднрдЧ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд▓реЛрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реВрдЪрд┐рдпреЛрдВ (рддрдерд╛рдХрдерд┐рдд "рдирдЧреНрди рд░рд┐рдЯрд░реНрди") рдХреЗ рдмрд┐рдирд╛ рдирд╛рдо рд╡рд╛рд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд░рд┐рдЯрд░реНрди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдЯрд░реНрди рдмрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рднреНрд░рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓рдВрдмреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрди рд░рд┐рдЯрд░реНрди рд╕реЗ рдмрдЪрдХрд░ рдЙрд╕ рднреНрд░рдо рд╕реЗ рдмрдЪрдирд╛ рдЕрдХреНрд╕рд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдПрдХ рд╣реА рдмреНрд░рд╢ рд╕реЗ рдирд╛рдорд╛рдВрдХрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреЗрдВрдЯрд┐рдВрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
_рдПрдбреНрд░реЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди._ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдЪрд┐рдВрддрд╛ рдЬрддрд╛рдИ рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдбреНрд░реЗрд╕-рдСрдл рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
_рд╕реНрд╡рдпрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░реЗрдВред_ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдлрд┐рд░ рд╕реЗ рдПрдХ рднрд╛рд╖рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ defer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдЬрддрд╛рдИ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдбреНрд░реЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреА рддрд░рд╣, рдбрд┐рдлрд░ рдПрдХ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдВрддрддрдГ рд╕реАрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред defer f.Close()
рдФрд░ defer l.mu.Unlock()
рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдорд╛рдирдХ рдореБрд╣рд╛рд╡рд░реЗ рдЗрддрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ рдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ рдХреЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ defer рд╕реЗ рдмрдЪрдиреЗ рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
_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 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЛрдб рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ:
рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдПрдХ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдВ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рджрд┐рд╢рд╛ рд▓реЗрдиреА рд╣реИред рдирддреАрдЬрддрди, рдкрд╣рд▓реА рджрд┐рд╢рд╛ "рдЕрдЧрд░ рдЧрд▓рддреА! = рд╢реВрдиреНрдп {рд╡рд╛рдкрд╕реА рдЧрд▓рддреА}" рд╕реНрдЯрдЯрд░ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдШреГрдгрд╛ рдХреА рд╣реИ рд▓реЗрдХрд┐рди рдЬрд╛рдиреЗ рдореЗрдВ рд╡реНрдпрд╡рд╕рд╛рдп рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рд╣реИред
рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ, рдХрд┐ рдореИрдВ рдЗрдирд▓рд╛рдЗрди рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдореИрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ
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)
ред рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдмрд┐рдВрджреБ рд╢рд╛рдпрдж рд╡рд┐рд╖рдп рд╕реЗ рджреВрд░ рд╣реИ; рдЧреИрд░-рдХреЛрд╢рд┐рд╢ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐редрдХреНрдпрд╛ рдпрд╣ рдЙрд╕ рд╕реНрд░реЛрдд рдкрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдЕрдиреБрднрд╡реА рдЧреЛрдлрд╝рд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреБрдирд░реАрдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИрдВ? рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдЙрд╕ "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
рдмрд╣реБрдд рдмрджрд╕реВрд░рдд рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рдХреЛрдб рдмрдирд╛рдПрдЧрд╛редos.Exit
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреАредрдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдПрдХ рдкреИрдХреЗрдЬ (рд╡рд┐рдХреНрд░реЗрддрд╛ рдХреЗ рд╕рд╛рде) рдкрд░ tryhard
рдЪрд▓рд╛рдпрд╛ рдФрд░ рдЗрд╕рдиреЗ 2478
рдХреА рд╕реВрдЪрдирд╛ рджреА, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рд╕рдВрдЦреНрдпрд╛ 873934
рд╕реЗ 851178
рд╣реЛ рдЧрдИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реЗ рдХрд┐рддрдирд╛ рдУрд╡рд░-рд░реИрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реИ (stdlib рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ-рдЯреНрд░реЗрд╕ рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдХрдореА рд╣реИ) рдпрд╛ рдЙрд╕ рдХреЛрдб рдХрд╛ рдХрд┐рддрдирд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдореИрдВрдиреЗ рдХреЙрдкреА-рдкрд╛рд╕реНрддрд╛ рдЬреИрд╕реЗ if err != nil { return nil }
рдФрд░ error: cannot process ....file: cannot parse ...file: cannot open ...file
рдЬреИрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╢рд░реНрдордирд╛рдХ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ред
\
рдореИрдВ рдЕрдкреАрд▓-рдЯреВ-рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рднреА рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдирд╣реАрдВ рд▓реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╡рд╣реА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдирдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЙрдирдХреА рдЕрдкрдиреА рдЕрдЬреНрдЮрд╛рдирддрд╛ рдФрд░/рдпрд╛ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
\
рд╣рдордиреЗ 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 рд╕рд╣рдордд - рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕реБрдЭрд╛рд╡ рдкрд╣рд▓реЗ рднреА рд▓рд╛рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рджрд┐рдиреЛрдВ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдЖрдВрддрд░рд┐рдХ рдХреЛрдбрдмреЗрд╕ рдкрд░ рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ (рдХреЗрд╡рд▓ рд╣рдорд╛рд░рд╛ рдХреЛрдб, рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ):
рдкрд╣рд▓реЗ:
рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдХреЗ рдмрд╛рдж:
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЕрдм рдЬрдм @griesemer рдиреЗ рд╕рд╛рд░рд╛рдВрд╢ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдЗрд╣рд╛рд░реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдБ рдХреБрдЫ рдФрд░ рд╣реИрдВ:
if
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ 39.2% if <err> != nil
рд╣реИ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
рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рджреЗрддрд╛ рд╣реИ:
- **if err := **json.NewEncoder(&buf).Encode(in)**; err != nil {**
- **return err**
- **}**
+ try(json.NewEncoder(&buf).Encode(in))
рдЬрдмрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ:
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдореИрдВ try
рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдХреЛрдб рдкрд░ рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ $.02
рдмреЗрдХрд╛рд░ рд╕реБрд╡рд┐рдзрд╛я╝М рдпрд╣ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдмрдЪрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдмрд▓реНрдХрд┐ рдкреБрд░рд╛рдирд╛ рддрд░реАрдХрд╛ рдЪреБрдирддрд╛ рд╣реВрдВред
рдЕрдзрд┐рдХ рдПрд░рд░ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦреЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдЯрд┐рдВрдЧ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреАред
рдмрд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░...
рд╡рд╣ рдореБрд╣рд╛рд╡рд░рд╛ рдЪрд▓рддреЗ-рдлрд┐рд░рддреЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╣ рдмрд╕ рдЗрддрдирд╛ рд╣реА рд╣реИ: рдПрдХ рдореБрд╣рд╛рд╡рд░рд╛ рдЬреЛ рдЖрдкрдХреЛ рдЕрд╡рд╢реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рдХреЛ рдкрдврд╝рд╛рдирд╛ред рдПрдХ рдирдП рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпрд╣ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рд╡реЗ
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ "рдЫрд┐рдкреА рд╣реБрдИ" рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдиреЗ рдХрд╛ рднреА рд▓реБрддреНрдл рдЙрдард╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рднреА
рдЙрд╕ рдореБрд╣рд╛рд╡рд░реЗ (рдХрд╛рдлреА рд╡рд┐рдкрд░реАрдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рднреВрд▓ рди рдЬрд╛рдПрдВ
рддрд░реАрдХреЛрдВ рдХреА рдЧрд┐рдирддреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЖрдЗрдП рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ try рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ рдореБрд╣рд╛рд╡рд░рд╛ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛
рд╡рд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛? рдорд╛рдирддреЗ рд╣реБрдП:
рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рдХреЛрд╢рд┐рд╢ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред
рдПрдо рдЯреЗрд░, 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))) {
}
рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП ("рдЯреНрд░рд╛рдИрд╣рд╛рд░реНрдб рдиреЗ рдореЗрд░реА рдХрд┐рддрдиреА рдорджрдж рдХреА"):
$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 рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ:
if ... { return err }
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП 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) рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдореЗрд░реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рд╕рд░рд▓ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЖрд╢реАрд░реНрд╡рд╛рдж рджрд┐рдпрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╡реНрдпрд╛рдкрдХ рдирд╣реАрдВ рд╣реИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдЪреНрдЫреЗ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рд░ рдЪреАрдЬ рдХреА рддрд░рд╣, рдЧреЛ рдЯреАрдо рдХреЗ рджрд┐рд╢рд╛-рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдиреЛрдЯ рдХрд╛ рдПрдХ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдЬрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреБрдЫ рд╕реНрдерд╛рди рдРрд╕реЗ рд╣реЛрдВрдЧреЗ рдЬрд╣рд╛рдБ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдЬрд╛рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рд╕реНрдерд╛рди рдЬрд╣рд╛рдБ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рдорд╣рд╛рди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рдереЗ, рд▓реЛрдЧреЛрдВ рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рд░ рдмрд╛рд░ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╣реАрдВ рдЦреБрд▓рдиреЗ рдкрд░ рд╣рдореЗрд╢рд╛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░ "рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: conf.json" рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд: "рдЕрдХреНрд╖рдо" рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдбреАрдмреА рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: рд╕рд┐рд╕реНрдЯрдо рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде: conf.json"ред
рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде, рдЕрдм рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдорд┐рд▓ рд░рд╣реЗ рд╣реИрдВред рд╡рд░реАрдпрддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ:
рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЛрд╢рд┐рд╢ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдФрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдЪреАрдЬреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВ:
рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА 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%)
рдлрд╝рд╛рдЗрд▓ рдкрджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)
645 (1383 рдХрд╛ 46.6%) рд░рд┐рдЯрд░реНрди ...,
рдмрдпрд╛рди
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%)
рдлрд╝рд╛рдЗрд▓ рдкрджреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)
5545 (6555 рдХрд╛ 84.6%) рд░рд┐рдЯрд░реНрди ...,
рдмрдпрд╛рди
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
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдирд╣реАрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ ... рдХрд╛рд░рдг рджреЛ рдЧреБрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
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
}
рдпрд╛рдиреА рдЯреНрд░рд╛рдИрд░рд┐рдЯрд░реНрди рд╕рднреА рдорд╛рдиреЛрдВ рдХреА рд╡рд╛рдкрд╕реА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЕрдВрддрд┐рдо рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:
рдорд╛рди, рдЕрдиреНрдпрдерд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд╣реИред
рдЬрд┐рди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ:
-
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
}
рдЬрд┐рди рдЪреАрдЬреЛрдВ рд╕реЗ рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ:
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)
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд░реЛрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдиреНрдпреВрдирддрдо рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХреЗ рд╕рд╛рде, рд╕рдВрддреБрд▓рди рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реВрдВред рдореИрдВ рдПрдХ рднрд╛рд░реА рдЧреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрддреА рдЕрдкрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ рдФрд░ рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХреЛрдб рд╣реИред рдореИрдВ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдореЗрдВ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рд╕рдореВрд╣ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рд╛рд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЧреЛ-рдЖрдзрд╛рд░рд┐рдд рд╕реЗрд╡рд╛ рдЬрд╛рд░реА рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдкрд╣рд▓рд╛ рдЪреЗрдХ-рдЗрди рдХрд╛рдлреА рд╣рдж рддрдХ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреВрдврд╝рд╛ рдЖрджрдореА рд╣реВрдВ, рд╕реА, рдкрд░реНрд▓, рдЬрд╛рд╡рд╛ рдФрд░ рд░реВрдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдорд╛рд░реНрдЧ рд╣реИред рдореЗрд░реЗ рдореБрджреНрджреЗ рдкрд╣рд▓реЗ рднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╡рд╛рдж-рд╡рд┐рд╡рд╛рдж рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рджреЛрд╣рд░рд╛рдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВред
if err != nil { return }
рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ?) рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд╛рдорд┐рдд рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкрд╕рдВрдж рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдирд╛рдорд┐рдд рдЧрд▓рддреА рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рдЕрдиреБрдкрд╛рдд рд╣реЛрдЧрд╛ рдПрдХрд░рд╕ рд╡реГрджреНрдзрд┐; рдЬреЛ рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИредрдлрд┐рд░ рд╕реЗ, рдЕрдЪреНрдЫреЗ рд╕реНрд╡рдЪреНрдЫ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╕рдореБрджрд╛рдп рдХреЛ рдмрдзрд╛рдИред
рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЕрдкрд░рд┐рдЪрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдпрд╛ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдХреВрджрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИред рдЯреЗрдбрд┐рдпрдо рдХреЗ рдмрд╛рд╡рдЬреВрдж, 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()
рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рдЪрд┐рдВрддрд╛ рдХреЗ рдмрд┐рдВрджреБ рд╣реИрдВ рд╡реЗ рд╣реИрдВ:
try()
рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдУрд╡рд░рд╣реЗрдб рд╣реИ рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рдХреЛрдИ рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛редerr != nil
рдореЗрдВ try()
рдХреЗ рдХрд▓реНрдкрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмреЗрдХ рдХрд░рдХреЗ, рднрд╛рд╖рд╛ рд╕реНрдЯреИрдХ рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ err
рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХ рд░рд╣реА рд╣реИредtry()
рдЬрдмрд░реНрджрд╕реНрддреА рдЪрддреБрд░рд╛рдИ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдЪрддреБрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░ рд╕рдХреЗ рдЬреЛ рдХрд┐ рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╕рдВрдж рд╣реИред рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдорд╛рдирджрдВрдб рд╕реЗ рдЬреБрдбрд╝реА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЛрдВ рдХреА рддрд░рд╣, рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрд╡рд╛рдж рдФрд░ рдЕрдиреБрднрд╡ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдорд╛рдкрдирд╛ рдХрдард┐рди рд╣реИред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
}
рдореИрдВрдиреЗ рдЗрд╕ рд╕реВрддреНрд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХреЗ рдЙрддрдирд╛ рдкрдврд╝рд╛ рд╣реИред рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ рдЬреИрд╕реЗ рд╡реЗ рд╣реИрдВред
рдореЗрд░реЗ рдХрд╛рд░рдг:
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢рд╛рдпрдж рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЧрд▓рдд рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрдо рддреМрд░ рдкрд░, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ try
рдирд┐рд░реНрдорд╛рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреЛрдб рдХреА рдХрдИ рд▓рд╛рдЗрдиреЗрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдЧреНрд░рд┐рдо рддреНрд░реБрдЯрд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рдпрд╛рд╕ред
рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд┐рдпрд╛ рд╣реИ), рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЬреЛ рдХреЛрдб рдХреЛ рд▓рдВрдмрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЧреЛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди try
рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реИ, рддреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрдЧрд╛ред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рд╡рдЬрди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреА рдЕрдкрдиреА рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдХрд▓реНрдкрдирд╛ рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ, рдпреЗ рджреЛ рдЕрдиреБрд░реЛрдз рд╣реИрдВ:
рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧреЛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред
...
рдЗрд╕рд▓рд┐рдП рд╣рдо рдбрд┐рдлрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рднреА рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред
рдпрд╣ рдкрд╣рд▓рд╛ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдпрд╣ рд╕рддреНрдп рд╣реИ (рдЖрдк defer
рдФрд░ go
a panic
рднреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдПрдХ рдирдпрд╛ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рдЪрд╛рд░ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝рд╛ рдкреВрдЫрдирд╛ рд╣реИ рдФрд░ рдЬрд╛рдиреЗ рдХреЗ рдЕрд░реНрдердкреВрд░реНрдг рд╕рдордиреНрд╡рдп рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рд╣рд░ рджреВрд╕рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЯреЛрдХрди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИред
рдореЗрд░реА рд╢рд┐рдХрд╛рдпрдд рдХрд╛ рдкреНрд░рддрд┐рд╡рд╛рдж рдпрд╣ рд╣реИ рдХрд┐ defer
рдФрд░ go
a panic
рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╢рд╛рдпрдж рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореЗрд░рд╛ рдХрд╣рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рд╕рд╛рдордВрдЬрд╕реНрдп рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ defer
рдФрд░ go
рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╕рдВрднрд╡рдд: рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреИрд░-рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ defer
рдпрд╛ go
рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╡реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдмрд┐рд▓реНрдЯрд┐рди рдХреЛ рдЪрд▓рддреЗ-рдлрд┐рд░рддреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЕрдиреБрдмрдВрдз рд╕реЗ рдЫреВрдЯ рдХреНрдпреЛрдВ рдорд┐рд▓рддреА рд╣реИ?
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ @griesemer рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реМрдВрджрд░реНрдп рд╕рдВрдмрдВрдзреА рд░рд╛рдп рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реМрдВрджрд░реНрдпрд╡рд╛рджреА рд░реВрдк рд╕реЗ рд╡рд┐рджреНрд░реЛрд╣ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдлреА рдЬреЛрдбрд╝ рдирд╣реАрдВ рд╣реИред
рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ:
рд╣рдо рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рд┐рдЧреНрдиреЗрдЪрд░ (рдЫрджреНрдо рдХреЛрдб) рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ
func try(expr) (T1, T2, тАж Tn)
рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреЛрдИ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ (рдЬрд┐рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ)ред рдпрд╣, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ, рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдмрд╛рд░ рдХрд╛ рдореИрдХреНрд░реЛ рд╣реИ (рдпрджрд┐ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛)ред рдЗрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдПрдХ рдмреБрд▓рд╛рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдирд╛ред рд╣рд░ рдмрд╛рд░ рдЬрдм "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐" рд╢рдмреНрдж рдХрд╛ рдкреНрд░рдпреЛрдЧ рдпреБрдХреНрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдПрдХ рдЕрдирдХрд╣рд╛ рдХрд╛рд░реНрдп рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рд╣реИ рдХрд┐ рдПрдХ "рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╣рд░ рджреВрд╕рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп рд╣реЛрддреЗ рд╣реИрдВред рдЖрдИрдИ рд╣рдо рдПрдХ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рдЕрдкрд╡рд╛рдж, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, go
рдФрд░ defer
рд╣реИрдВ, рдЬреЛ рджреЛрдиреЛрдВ рдХрдЪреНрдЪреЗ рдЯреЛрдХрди рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВред
рд╕рд╛рде рд╣реА рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд▓рдд рдорд┐рд▓рддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ:
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
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
рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд┐рд▓реНрдЯрд┐рди рдлрд╝рдВрдХреНрд╢рди рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рдмрд┐рд▓реНрдЯрд┐рди рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдпрдо рддреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ:
panic
рдФрд░ os.Exit
рдХрд░рддреЗ рд╣реИрдВ)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, 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
рдЖрдБрдХрдбрд╝реЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред ;-)
рдпреЗ рд╡реЗ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╣реИрдВ рдЬреЛ 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
рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдХрдо рдХреНрдпреЛрдВ рд╣реИ
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
рдЬреЛ рдореВрд▓реНрдп рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд▓рд╛ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рдЙрди рд╕рдВрднрд╛рд╡рд┐рдд рдореБрджреНрджреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдЬреЛ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЬреЛ рд╣реИрдВ:
try
рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред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)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд░рд▓, рд╣рд▓реНрдХрд╛ рдФрд░ рдкрдардиреАрдп рд╣реИред рджреЛ рднрд╛рдЧ рд╣реИрдВ:
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
рдЪреЗрдХ рдХреЗ рдмрд╛рдж рд╕реАрдзреЗ рдПрдХ рд▓рд┐рдкрдЯреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд▓рд╛рдЧрддреЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ:
рднрд▓реЗ рд╣реА 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
рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдЗрд╕рдиреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░реНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ,
рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдирд┐рд╣рд┐рддрд╛рд░реНрде, рдЯреНрд░реЗрдбрдСрдлрд╝ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдореБрджрд╛рдп-рд╡реНрдпрд╛рдкреА рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдЧреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реИред
рднрд╛рд░реА рд╕рдореБрджрд╛рдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдпрд╣рд╛рдВ рд╡реНрдпрд╛рдкрдХ рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрддрдХрдиреАрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдЗрд╕ рдЪрд░реНрдЪрд╛ рдиреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рд┐рдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрдеред
рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрдирд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рд╕рд╛рд░реНрдердХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╣рдо рдЕрднреА рднреА рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рд░реНрдердХ рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рд╕рдореБрджрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдХреМрди рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рд▓реВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рд╣реИ, рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЕрдЧрд╕реНрдд рдореЗрдВ " рдЧреЛ 2 рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░реЙрдмреНрд▓рдо рдУрд╡рд░рд╡реНрдпреВ " рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдкреАрдЫреЗ рдореБрдбрд╝рдХрд░ рджреЗрдЦрдиреЗ рдкрд░ рд╣рдордиреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдирд╣реАрдВ рджрд┐рдпрд╛ред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╕рд╣реА рдереАред
try
рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╣рд╛рдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдореЗрдВ рдЗрди рд╢реБрд░реБрдЖрддреА рд╕рдорд╕реНрдпрд╛ рдмрдпрд╛рдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд╕рд╣рдорддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред(рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЙрд╕реА рджрд┐рди рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдврд╝рд╛-рдЪрдврд╝рд╛ рдХрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред)
рдЧреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╖рдп рдкрд░, рд╣рдореЗрдВ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдХреМрди рд╕реЗ рдкрд╣рд▓реВ рдЖрдкрдХреЗ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдФрд░ рдХрд╛рд░реНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рддрдирд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓реЗрдЧрд╛ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдРрд╕реА рдХреЛрдИ рд░рд┐рдкреЛрд░реНрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ Go2ErrorHandlingFeedback рдкреГрд╖реНрда рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред
рдпрд╣рд╛рдВ рдФрд░ рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдкрд░ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдЬреИрд╕рд╛ рдХрд┐ Russ Cox рдиреЗ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдореБрджрд╛рдп-рд╡реНрдпрд╛рдкреА рдЪрд░реНрдЪрд╛ рдЕрдкрдиреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рд░реВрдк рдореЗрдВ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ ред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рднреА рдХреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдореАрдХреНрд╖рд╛ рд╕рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд░реЙрдмрд░реНрдЯ рдЧреНрд░рд┐рд╕реЗрдорд░ред