Go: рдкреНрд░рд╕реНрддрд╛рд╡: рдпреБрдХреНрддрд┐: рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ / рд╡рд┐рднреЗрджрд┐рдд рд╕рдВрдШ рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 6 рдорд╛рд░реНрдЪ 2017  ┬╖  320рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: golang/go

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

  • рд╡реЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬреИрд╕реЗ structs
  • рдЙрдирдореЗрдВ рдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рддрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ

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

Go2 LanguageChange NeedsInvestigation Proposal

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

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

Go . рдореЗрдВ рдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░

рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ "|" рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдСрдкрд░реЗрдЯрд░ред

type: type1 | type2 ...

рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдзрд╛рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред NS
рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ
рдореВрд▓реНрдп рдЬреЛ рдЗрд╕реЗ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, "рд╢реВрдиреНрдп" рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рдирд╛ред

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

type maybeInt nil | int

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

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

рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ
рдпреЛрдЧред

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

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

var x int|float64 = 13

рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ int рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди

var x int|float64 = 3.13

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдлреНрд▓реЛрдЯ64 рд╡рд╛рд▓рд╛ рдорд╛рди рд╣реЛрдЧрд╛ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

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

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

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

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

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

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

рдкрд┐рдЫрд▓реА рдХреБрдЫ рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП https://www.reddit.com/r/golang/comments/46bd5h/ama_we_are_the_go_contributors_ask_us_anything/d03t6ji/?st=ixp2gf04&sh=7d6920db рджреЗрдЦреЗрдВред

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

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

Go . рдореЗрдВ рдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░

рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ "|" рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдСрдкрд░реЗрдЯрд░ред

type: type1 | type2 ...

рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдзрд╛рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред NS
рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ
рдореВрд▓реНрдп рдЬреЛ рдЗрд╕реЗ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, "рд╢реВрдиреНрдп" рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рдирд╛ред

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

type maybeInt nil | int

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

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

рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ
рдпреЛрдЧред

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

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

var x int|float64 = 13

рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ int рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди

var x int|float64 = 3.13

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдлреНрд▓реЛрдЯ64 рд╡рд╛рд▓рд╛ рдорд╛рди рд╣реЛрдЧрд╛ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

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

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

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

@rogpeppe рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░реЗрдЧрд╛? рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛) рдкрд░ case рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рдЬреЛ рдпреЛрдЧ рдХрд╛ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдЧреИрд░-рд╡рд┐рд╕реНрддреГрдд рд╕реНрд╡рд┐рдЪ рд╣реЛрдирд╛ рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА?

рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ

type T int | interface{}

рдФрд░ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ:

switch t := t.(type) {
  case int:
    // ...

рдФрд░ t рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ int рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ case interface{} ?

рдпрд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?

type T interface{} | nil рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЕрдЧрд░ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ

var t T = nil

рдЯреА рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдпрд╛ рд╡рд╣ рдирд┐рд░реНрдорд╛рдг рд╡рд░реНрдЬрд┐рдд рд╣реИ? рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдкреНрд░рд╢реНрди type T []int | nil рд▓рд┐рдП рдЙрдарддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

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

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рддреНрд░реБрдЯрд┐ рд╣реИ рддреЛ рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func addOne(x int|float64) int|float64 {
    switch x := x.(type) {
    case int:
        return x + 1
    case float64:
         return x + 1
    }
}

рдФрд░ рдЖрдк рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдорд▓рд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВред

рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ

рдЯрд╛рдЗрдк рдЯреА рдЗрдВрдЯ | рдЗрдВрдЯрд░рдлреЗрд╕{}

рдФрд░ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ:

рд╕реНрд╡рд┐рдЪ рдЯреА: = рдЯреАред (рдкреНрд░рдХрд╛рд░) {
рдХреЗрд╕ рдЗрдВрдЯ:
//...
рдФрд░ t рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ int рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ рдХреЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╣реИ?

t рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ {} рдЬрд┐рд╕рдореЗрдВ рдПрдХ int рд╣реЛред рдЯреА рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ
рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реА рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓
рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдЧрдгрд┐рдд рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддрд░рд╣ {} рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ {} рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЗрдВрдЯ рд╣реЛред

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

type R io.Reader | io.ReadCloser

рдЯрд╛рдЗрдк рдЯреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ {} | рд╢реВрдиреНрдп? рдЕрдЧрд░ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рд╡рд░ рдЯреА рдЯреА = рд╢реВрдиреНрдп

рдЯреА рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдпрд╛ рд╡рд╣ рдирд┐рд░реНрдорд╛рдг рд╡рд░реНрдЬрд┐рдд рд╣реИ? рдЯрд╛рдЗрдк рдЯреА []int | . рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╢реНрди рдЙрдарддрд╛ рд╣реИ рд╢реВрдиреНрдп, рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕{} | рд╢реВрдиреНрдп рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдмреЗрдорд╛рдиреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {}
рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

[]int | . рдХреЗ рд▓рд┐рдП nil, рдПрдХ nil []int рдПрдХ nil рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП
([]int|nil)(nil) рдХрд╛ рдареЛрд╕ рдореВрд▓реНрдп []int(nil) рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдХрд┐рдП nil ред

[]int | nil рдорд╛рдорд▓рд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ nil рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ "рд╢реВрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди" рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ

type T []int | nil
var x T = nil

рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ x nil рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, nil []int ред

рд╡рд╣ рдорд╛рди рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП nil []int рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛:

var y T = []int(nil)  // y != x

рдХреНрдпрд╛ рдпреЛрдЧ рд╣рдореЗрд╢рд╛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рд╣реЛрдиреЗ рдкрд░ рднреА рд╢реВрдиреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА? рдЕрдиреНрдпрдерд╛ var x int64 | float64 рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░, рдЕрдиреНрдп рдирд┐рдпрдореЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛, рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ var x interface{} | int рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЬреИрд╕рд╛ рдХрд┐ @bcmills рдмрддрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдпреЛрдЧ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗред рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рди рд╣реЛрдиреЗ рдкрд░ рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рдЦрд╛рд▓реА default: рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

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

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

type T []int | nil
var x T = nil

x рдореЗрдВ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ []int рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ nil []int рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ []int рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп []int (рд╢реВрдиреНрдп) рдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдпреЛрдЧ рд╣рдореЗрд╢рд╛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рд╣реЛрдиреЗ рдкрд░ рднреА рд╢реВрдиреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА? рдЕрдиреНрдпрдерд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ var x int64 | рдлреНрд▓реЛрдЯ64 рд╣реЛ?

рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ "рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ
рдпреЛрдЧред", рддреЛ рдЙрддреНрддрд░ int64(0) рд╣реИред

рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░, рдЕрдиреНрдп рдирд┐рдпрдореЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛, рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ var x рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} | рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред NS? рдЬреИрд╕рд╛ рдХрд┐ @bcmills рдмрддрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд░рд╛рд╢рд┐ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдпреЛрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИред

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

рддреЛ (stuff) | nil рдХреЗрд╡рд▓ рддрднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм (рд╕рд╛рдорд╛рди) рдореЗрдВ рдХреБрдЫ рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ nil | (stuff) рдЕрд░реНрде рдХреБрдЫ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рди рдореЗрдВ рдХреБрдЫ рднреА рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд╢реВрдиреНрдп рдХреНрдпрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ?

@ianlancetaylor рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдХрдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдПрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ (рдмрдВрдж) рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк C . рдореЗрдВ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ

struct {
    int which;
    union {
         A a;
         B b;
         C c;
    } summands;
}

рдпрджрд┐ which рд╕рдВрдШ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ 0 = a, 1 = b, 2 = c, рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рд╢реВрдиреНрдп рд╣реЛрддреА рд╣реИред рдФрд░ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд╣реАрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЬрд╣рд╛рдВ рднреА рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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

рдХреНрдпрд╛ рд╕рднреА рд╢реВрдиреНрдп рдорд╛рди рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдЬреЛ рдкреНрд░рдХрд╛рд░ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛:

type A = B|C
struct A {
  choice byte // value 0 or 1
  value ?// (thing big enough to store B | C)
}

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

рд╕реЙрд░реА @jimmyfrasche рдиреЗ рдореБрдЭреЗ рдкрдВрдЪ рдорд╛рд░ рджрд┐рдпрд╛ред

рдХреНрдпрд╛ рд╢реВрдиреНрдп рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛

type S int | string | struct{}
var None struct{}

?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рднреНрд░рдо рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ, рдХрдо рд╕реЗ рдХрдо)

рдпрд╛ рдФрд░ рдЕрдЪреНрдЫрд╛

type (
     None struct{}
     S int | string | None
)

рдЗрд╕ рддрд░рд╣ рдЖрдк None рдкрд░ рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ None{} рд╕рд╛рде рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@jimmyfrasche struct{} рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ nil ред рдпрд╣ рдПрдХ рдорд╛рдореВрд▓реА рд╡рд┐рд╡рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ (?) рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рдХреЛ рдЕрд▓рдЧ рдХрд░ рджреЗрдЧрд╛ред

@bcmills рдЕрдиреНрдпрдерд╛ рджрд╛рд╡рд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ

@rogpeppe рдпрд╣ рдХреНрдпрд╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ?

// r is an io.Reader interface value holding a type that also implements io.Closer
var v io.ReadCloser | io.Reader = r
switch v.(type) {
case io.ReadCloser: fmt.Println("ReadCloser")
case io.Reader: fmt.Println("Reader")
}

рдореИрдВ "рдкрд╛рдардХ" рдорд╛рдиреВрдВрдЧрд╛

@jimmyfrasche рдореИрдВ рдорд╛рди ReadCloser , рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

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

@bcmills рдпрд╣ рд╡рд╣ https://play.golang.org/p/PzmWCYex6R

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

рджрд┐рдпрд╛ рдЧрдпрд╛:

 var x int | nil = nil

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

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

var t nil | int
var u float64 | t

@jimmyfrasche рдореИрдВ ReadCloser рдорд╛рдиреВрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

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

@bcmills рдпрд╣ рд╡рд╣ https://play.golang.org/p/PzmWCYex6R

рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд░реАрдбрдХреНрд▓реЛрдЬрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП "рдпрд╣ [...] рдорд╛рдиреНрдп рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛"
рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣, рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрд╕рдореЗрдВ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдареЛрд╕ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

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

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

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ io.ReadCloser | . рд╣реИ io.Reader рдЬрдм рдЖрдк рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ io.Reader рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ io.ReadCloser рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЕрдирдмреЙрдХреНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд░реАрдмреЙрдХреНрд╕ рдХрд░рддрд╛ рд╣реИред

рджреВрд╕рд░реА рддрд░рдл рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ io.Reader | io.ReadCloser рдпрд╣ рдпрд╛ рддреЛ рдХрднреА рднреА io.ReadCloser рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдпреЛрдЧ рдореЗрдВ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдорд┐рд▓рд╛рди" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

@griesemer рд╣рд╛рдБ, рдпрд╣ рд╕рд╣реА рд╣реИред

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

@jimmyfrasche

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ io.ReadCloser | . рд╣реИ io.Reader рдЬрдм рдЖрдк рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ io.Reader рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ io.ReadCloser рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЕрдирдмреЙрдХреНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд░реАрдмреЙрдХреНрд╕ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ io.Reader рд╣реЛрддрд╛ рд╣реИ (рдпрд╛ рд╢реВрдиреНрдп, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА io.Reader рднреА рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рджреЛ рд╡рд┐рдХрд▓реНрдк рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВ - рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдПрдХ "рд╕рдорд╛рд╡реЗрд╢реА рдпрд╛" рд╣реИ рди рдХрд┐ "рдЕрдирдиреНрдп рдпрд╛"ред

рджреВрд╕рд░реА рддрд░рдл рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ io.Reader | io.ReadCloser рдпрд╣ рдпрд╛ рддреЛ рдХрднреА рднреА io.ReadCloser рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдпреЛрдЧ рдореЗрдВ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдорд┐рд▓рд╛рди" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ "рджреВрд╕рд░реЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЬрд╛рдХрд░", рдЖрдкрдХрд╛ рдорддрд▓рдм рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реИ, рддреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ:

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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ io.ReadCloser рдПрдХ io.Reader рдФрд░ рдПрдХ io.ReadCloser рджреЛрдиреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ io.Reader рдЪреБрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдкреНрд░рдХрд╛рд░ io.Reader рдФрд░ рдкреНрд░рдХрд╛рд░ io.Reader | . рдХреЗ рдмреАрдЪ рдХреЛрдИ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ io.ReadCloser, рдХреНрдпреЛрдВрдХрд┐ io.Reader io.Reader рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рдзрд╛рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ {} рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдпреЛрдЧреНрдпрддрд╛рдПрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдЬреЛрдбрд╝рддреА рд╣реИрдВред

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

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

рдЖрдЗрдП, рдлрд┐рд▓рд╣рд╛рд▓, рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдХрд╣реЗрдВ рдХрд┐ рдЖрд░рд╕реА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ io.ReadCloser рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдЧрд░ рддреБрдо рдпрд╣ рдХрд░рддреЗ рд╣реЛ

var v io.ReadCloser | io.Reader = RC{}

рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ

var r io.Reader = RC{}
var v io.ReadCloser | io.Reader = r

рдХреЗрд╡рд▓ рд╕рдордЭрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ io.Reader рдХреЗ рд░реВрдк рдореЗрдВ v store r рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рдЖрдк v рдкрд░ рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рдХрд┐ рдЬрдм рдЖрдк io.Reader рдХреЗрд╕ рдХреЛ рд╣рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирд╣реАрдВ рд╣реИ рдЖрдИрдУ.рд░реАрдбрдХреНрд▓реЛрдЬрд░ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

switch v := v.(type) {
case io.ReadCloser: useReadCloser(v)
case io.Reader:
  if rc, ok := v.(io.ReadCloser); ok {
    useReadCloser(rc)
  } else {
    useReader(v)
  }
}

рдЕрдм, рдПрдХ рд╕рдордЭ рд╣реИ рдЬрд┐рд╕рдореЗрдВ io.ReadCloser <: io.Reader, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рд╣реИ рдФрд░ рдЧреЛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрд░рдорд╢рдГ рдП (), рдмреА (), рдФрд░ рд╕реА () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдП, рдмреА, рдФрд░ рд╕реА рддреАрди рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдФрд░ рддреАрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдПрдмреАрд╕реА рд╣реИред A, B, рдФрд░ C рдЕрд╕рдВрдпреБрдХреНрдд рд╣реИрдВ рдЗрд╕рд▓рд┐рдП A | рдмреА | рд╕реА рдФрд░ рдЗрд╕рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд╕рднреА рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ

var c C = ABC{}
var v A | B | C = c

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

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдмрдВрдз рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдИ рднреА рд╕рд╛рд░рд╛рдВрд╢ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

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

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

@jimmyfrasche рдЖрджреЗрд╢рд┐рдд рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ? рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдмреЙрдХреНрд╕ structs рдХреЗ рд╕рд╛рде рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ:

type ReadCloser struct {  io.ReadCloser }
type Reader struct { io.Reader }

var v ReadCloser | Reader = Reader{r}

@bcmills рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рдФрд░

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

рд╕рднреА рдЧрд╛рд░рдВрдЯрд┐рдпрд╛рдВ рдЬреЛ рдЖрдк рдПрдХ рд░рд╛рд╢рд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЪрд╛рд╣рддреЗ рд╣реИрдВ

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

рдпрд╣реА рд╣реИ, рдпрджрд┐ рдХрд┐рд╕реА рдорд╛рди рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ-рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде, рд╣рдо рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рд╕рджрд╕реНрдп рд░рд╣рд╛ рд╣реИ
"рдЪреБрдирд╛ рд╣реБрдЖ" - рд╣рдо рдХреЗрд╡рд▓ рдорд╛рди рдХреЛ рд╣реА рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВред рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬрдм рдЖрдк рдПрдХ io.Reader рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП {}, рдЖрдк рд╕реНрдерд┐рд░ io.Reader рдкреНрд░рдХрд╛рд░ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдорд╛рди рд╣реА рд╣реЛрддрд╛ рд╣реИ
рдЬреЛ io.Reader рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:

var c C = ABC{}
var v A | B | C = c

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

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

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ type U I | *T рдЬрд╣рд╛рдВ I рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ *T рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ I ред

рджрд┐рдпрд╛ рдЧрдпрд╛

var i I = new(T)
var u U = i

u рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ *T , рдФрд░ in

var u U = new(T)

рдЖрдк рдЙрд╕ *T рдХреЛ I рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╡реЛ рд╕рд╣реА рд╣реИ?

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

рдпрд╣ var v uint8 | int32 | int64 = i рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рднреА рд╣реЛрдЧрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдмрд╕ рд╣рдореЗрд╢рд╛ рдЙрди рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдЬреЛ рднреА i , рднрд▓реЗ рд╣реА i рдПрдХ int64 рдЬреЛ uint8 рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рдЧрддрд┐!

рд╡рд╛рд╣!

рдЖрдк рдЙрд╕ * рдЯреА рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЗ рд╕рд╛рде I рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╡реЛ рд╕рд╣реА рд╣реИ?

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

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

рд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ (рдмреЗрд╢рдХ рд╕рдВрдХрд▓рдХ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЪреБрдирдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреЛрдИ рдЦреЛрдЬ рдирд╣реАрдВ рд╣реИ)ред

рдпрд╣ var v uint8 | . рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рднреА рд╣реЛрдЧрд╛ int32 | int64 = i рдЬреЛ, рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рдореЗрд╢рд╛ рдЙрди рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдЬреЛ рднреА рд╣реЛ, рдореИрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рдореИрдВ рдПрдХ int64 рдерд╛ рдЬреЛ uint8 рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред

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

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

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

рддреЛ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рд╕реЗ I | *T рдкреНрд░рдХрд╛рд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╡рд╣реА рд╣реИ рдЬреИрд╕реЗ I рдФрд░ io.ReadCloser | io.Reader рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ io.Reader рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реИ?

рдпреЗ рд╕рд╣реА рд╣реИред рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдореЗрд░реЗ рд╕реБрдЭрд╛рдП рдЧрдП рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдХрд┐ рд╕рдВрдХрд▓рдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдорд╛рди рдпрд╛ рд╕рдорд╛рди рдирд┐рдпрдо int|int рдЬреИрд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рд╕реЛрдЪрд╛: рдпрд╣ рд╢рд╛рдпрдж unintuitive рд╣реИ рдХрд┐ int|byte рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ byte|int , рд▓реЗрдХрд┐рди рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╢рд╛рдпрдж рдареАрдХ рд╣реИред

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

рд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ (рдмреЗрд╢рдХ рд╕рдВрдХрд▓рдХ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЪреБрдирдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреЛрдИ рдЦреЛрдЬ рдирд╣реАрдВ рд╣реИ)ред

рдореИрдВ рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрдврд╝рд╛ (рдЬреЛ рдХрд┐ рдЬреЛ рдЗрд░рд╛рджрд╛ рдерд╛ рдЙрд╕рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) I рдФрд░ T-рдЙрдкрдХрд░рдг- I рдХреЗ рд╕рдВрдШ U рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред

1a) U u = t рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░, рдЯреИрдЧ рдХреЛ T рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рдЪрдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо T рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдЧ рдПрдХ T рд╣реЛрддрд╛ рд╣реИред
1b) U u = i (i рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ T рд╣реИ) рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░, рдЯреИрдЧ I рдкрд░ рд╕реЗрдЯ рд╣реИред рдмрд╛рдж рдореЗрдВ рдЪрдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо T рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдЧ рдПрдХ I рд╣реИ рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдЪреЗрдХ рд╣реИ (рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ T I рдФрд░ T рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ) рдпреВ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ) рдПрдХ рдЯреА рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред

2a) 1a . рдХреА рддрд░рд╣
2b) U u = i рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░ (i рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ T рд╣реИ), рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рди (i) рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ T рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ T рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ I рдФрд░ T рднреА U рдХрд╛ рд╕рджрд╕реНрдп рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реИ, рдЯреИрдЧ рдЯреА рдкрд░ рд╕реЗрдЯ рд╣реИред рдмрд╛рдж рдореЗрдВ рдЪрдпрди рд╕реАрдзреЗ рдЯреА рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрдм T, V, W рд╕рднреА I рдФрд░ U = *T | *V | *W | I , рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ U u = i рд▓рд┐рдП 3 рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореВрд▓ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдирд╣реАрдВ рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рдпрд╣ рдерд╛?

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

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

рджреЛрдиреЛрдВ рдЙрдк-рд╕реБрдЭрд╛рд╡ рд╕реНрдереВрд▓ рд╣реИрдВ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдореЗрдВ рдХрдЯреНрдЯрд░ рд╕рдорд░реНрдердХреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА (?) рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреАред

рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдШ рдХреЗ рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХрд╛ рдкрддрд╛ рд▓реЗрдирд╛ рдареАрдХ рдирд╣реАрдВ рд╣реИ

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

рдпреВ рдпреВ = рдЖрдИ (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЯреА рд╣реИ) рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░, рдЯреИрдЧ I рдкрд░ рд╕реЗрдЯ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд░реВрдХреНрд╕ рд╣реИ - рдХреЛрдИ рдЯреИрдЧ I рдирд╣реАрдВ рд╣реИред

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

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

рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореВрд▓ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдирд╣реАрдВ рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рдпрд╣ рдерд╛?

рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@ dr2chase рдореЗрд░реА рд╕рдордЭ рдЕрдм рддрдХ рдпрд╣ рд╣реИ рдХрд┐, рдпрджрд┐ рдХрд┐рд╕реА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ (рд╡рд┐рдзрд┐ рд╕реЗрдЯреЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рд╡рд╛рд▓реЗ) рд▓реЗрдХрд┐рди рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрднреА рднреА рд╣реИрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛

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

рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ? рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪрдпрдирд┐рдд/рдЬреЛрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд╣реА рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдХрд╣рд╛/рдирд┐рд╣рд┐рдд рд╣реИ рдЬрдм рд╕рдВрдШ рдХреЛ рдПрдХ рдореВрд▓реНрдп рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдиреНрдпрдерд╛ рд╣рдо int8 рдмрдирд╛рдо int16 рдмрдирд╛рдо int32, рдЖрджрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд╛рдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, int8 | uint8 ред

рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ?

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

рдЕрдиреНрдпрдерд╛ рд╣рдо int8 рдмрдирд╛рдо int16 рдмрдирд╛рдо int32, рдЖрджрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд╛рдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, int8 | uint8.

рдпрд╣рд╛рдБ рдЖрдкрдХреА рдХреНрдпрд╛ рдЪрд┐рдВрддрд╛ рд╣реИ?

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

рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЖрдк рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ред

рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ, рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ

union {
  T0
  T1
  //...
  Tn
}

рд╕рдВрдШ рдореЗрдВ рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ (T0, T1, ..., Tn) рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЛрдИ рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд (рдирд╛рдорд┐рдд) рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рдПрдХ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реИрдз рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╕рдВрдШ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдХрд┐ type S struct { S } рдЕрдорд╛рдиреНрдп рд╣реИред

рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди-рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣рд░ рд╕рдордп рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИред

рдЦрд╛рд▓реА рд╕рдВрдШ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдЕрджреНрд╡рд┐рддреАрдп рд╣реИред рдПрдХ рдЧреИрд░-рд░рд┐рдХреНрдд рд╕рдВрдШ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╕рдВрдШ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИред

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

рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдореВрд▓реНрдп U рдХреЛ рджреВрд╕рд░реЗ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ V рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ V(U{}) рдпрджрд┐ U рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реЗрдЯ рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реИ V рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реЗрдЯред рдЕрд░реНрдерд╛рддреН, рдЖрджреЗрд╢ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП, U рдореЗрдВ V рдХреЗ рд╕рдорд╛рди рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ U рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рдЬреЛ V рдмрд▓реНрдХрд┐ V рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ U ред

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

рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдорд╛рди, T , рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ U рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ U рдПрдХ рдЪрд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдбрд╛рдпрдирд╛рдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ T рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрдЧрдд рдорд╛рди рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ:

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

рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред

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

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

рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдпрд╛ рддреЛ рд╕рдВрдкреВрд░реНрдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рд╕рд╣рд┐рдд, рдпрд╛ рдЙрдирдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

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

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

union{...} рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреЛ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдЕрдЪреНрдЫреЗ рдЧреБрдгреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╕рдВрдпреЛрдЧ рд╕реЗ рдпрд╣ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рд╕рдВрдШ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдХреБрдЫ рдЕрдЬреАрдм рдпреВрдирд┐рдпрдиреЛрдВ рдЬреИрд╕реЗ union{} рдФрд░ union{ int } ред рдкрд╣рд▓рд╛ рдХрдИ рдЕрд░реНрдереЛрдВ рдореЗрдВ struct{} (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдФрд░ рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, type Id union { int } рдмрд╣реБрдд рд╣рдж рддрдХ type Id struct { int } рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдг idValue.int рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

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

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

рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╡реИрдз рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХреЛ рд▓реЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдШ рдкрд░ рд╣реА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЧрд▓рддреА рд╕реЗ рдЕрд╡рд╛рдВрдЫрд┐рдд рддрд░реАрдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдЪрд╛рд░ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╕рд░рд▓, рд╕реНрдкрд╖реНрдЯ рд░реИрдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдкрд░ U рдЬрд┐рд╕рдХреЗ рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ fmt.Stringer :

func (u U) String() string {
  return u.(fmt.Stringer).String()
}

рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд░реЗрдбрд┐рдЯ рдереНрд░реЗрдб рдореЗрдВ, rsc рдиреЗ рдХрд╣рд╛:

рдпреЛрдЧ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ {X; Y } рдпреЛрдЧ {Y; рдПрдХреНрд╕ }ред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд░рдХрдо рдЖрдорддреМрд░ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред

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

рдпрд╣ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред

рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛

type (
  Undefined = struct{}
  UndefinedOrInt union { Undefined; int }
)

рдмрдирд╛рдо

type (
  Illegal = struct{}
  IntOrIllegal union { int; Illegal }
)

UndefinedOrInt рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рдЬрдм рдпрд╣ рд╣реЛрдЧрд╛, рддреЛ рдпрд╣ int рдорд╛рди рд╣реЛрдЧрд╛ред рдпрд╣ *int рд╕рдорд╛рди рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ (1 + int) рдХреЛ рдЕрдм рдЧреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рдорд╛рди рднреА рд╕рдорд╛рди рд╣реИред

рджреВрд╕рд░реА рдУрд░, IntOrIllegal , рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ int 0 рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЕрд╡реИрдз рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА *int рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рдорд╛рди рдЗрд░рд╛рджреЗ рдХрд╛ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ new(int) ред

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

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

рдпрджрд┐ рдпреЛрдЧ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдПрдХ рджрд┐рди рдереЗ (рдкреНрд░рддреНрдпреЗрдХ рджрд┐рди рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд struct{} ), рдЬреЛ рднреА рдкрд╣рд▓реЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИ рд╡рд╣ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рдкрд╣рд▓рд╛ рджрд┐рди рд╣реИ, iota -рд╕реНрдЯрд╛рдЗрд▓ рдПрдирдо рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред

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

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

рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП: рд╕рдВрдШ c/c++ рд╢реБрджреНрдзрддрд╛рд╡рд╛рджрд┐рдпреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡реЗрд░рд┐рдПрдВрдЯ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ COBRA рдФрд░ COM рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЬрд╣рд╛рдВ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рд╕рдВрдШ рдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЗрдЯ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╕рдВрдЬреНрдЮрд╛ рд╣реИред рдореБрдЭреЗ рдХреАрд╡рд░реНрдб _pick_ рдкрд╕рдВрдж рд╣реИред рд▓рд┐рдореНрдмреЛ рдиреЗ _pick_ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕реАрдорд┐рдд рд╕реЗрдЯ рд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрд░рд╛рджреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдирд╛рдо/рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдЪреБрдирдирд╛ рдареАрдХ рд░рд╣реЗрдЧрд╛ред

рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдХреЛрдИ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗрдЯ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

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

@jimmyfrasche

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ 'рдкрд┐рдХ' рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рдХрдореА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ 'рдкрд┐рдХ' рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╣рд╛рди рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд░рд╛ рджреЗрдЧрд╛ - рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рдЖрдк рдПрдХ рдРрд╕реЗ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдпрд╛ рддреЛ рдПрдХ io.Reader рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ StringReader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ 'рдкрд┐рдХ' рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░, рдпрджрд┐ рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ 2 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рджрд╕реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдПрдХ рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд▓рдЧреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

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

@ianlancetaylor рд░реЙрдмрд░реНрдЯ рдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИ: https://github.com/golang/go/issues/19412#issuecomment -288608089

@ianlancetaylor
рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рдЧреЛ рдХрд╛ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢ рд╣реИред Json.Token рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐, рджреВрд╕рд░реА рдУрд░, рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ

type Token Delim | bool | float64 | Number | string | nil

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

рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рдЧреЛ рдХрд╛ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢ рд╣реИред

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

@cznic

рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред

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

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

//vet:types Delim | bool | float64 | Number | string | nil
type Token interface{}

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

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

@ianlancetaylor рдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдлрд┐рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХреА: https://github.com/BurntSushi/go-sumtype

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

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

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

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

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

@ianlancetaylor

рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЗ рдмрдЬрд╛рдп рднрд╛рд╖рд╛ рдкрдХреНрд╖ рдкрд░ рдХреНрдпреЛрдВ рдЖрддреА рд╣реИ?

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

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

рдЧреЛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ vet рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд░рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рдЧреЛ 1 рд╕рдВрдЧрддрддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ vet рдореЗрдВ рди рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг

switch x := somepkg.SomeFunc().(type) {
тАж
}

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

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

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

рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЗ рдмрдЬрд╛рдп рднрд╛рд╖рд╛ рдкрдХреНрд╖ рдкрд░ рдХреНрдпреЛрдВ рдЖрддреА рд╣реИ?

рдЖрдк рдЙрд╕реА рдкреНрд░рд╢реНрди рдХреЛ рдЯреНрдпреВрд░рд┐рдВрдЧ-рдкреВрд░реНрдг рдХреЛрд░ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ....

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

(рдФрд░, рд╣рд╛рдБ, рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЖрдпрд╛рддрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред)

рдореИрдВ рдпрд╣ рджрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рддрд░реНрдХ рдирд┐рд░реНрдгрд╛рдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рдмрд╣реБрдд рд╣реА рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рднрд╛рд╖рд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИред рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЖрдкрдХреЛ рдордЬрдмреВрдд рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдореЗрд░реЗ рдирдЬрд░рд┐рдП рд╕реЗ рд╡реЗ рдордЬрдмреВрдд рддрд░реНрдХ рдЕрднреА рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрдП рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдордиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЛрдЪрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди рд╣реИ (https://golang.org/doc/faq#variant_types)ред

@ianlancetaylor

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ? "рдпреЛрдЧ рдХрд╛ рд╢реВрдиреНрдп-рдорд╛рди рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп-рдорд╛рди рд╣реИ" рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛ @jimmyfrasche рдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ (https://github.com/golang/go/issues/19412#issuecomment-289319916) рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдЧрд╛ред

@urandom рдореИрдВ рдПрдХ рд▓рдВрдмреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ

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

рд╕рдВрдШ рдХреЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ "рдлрд╝реАрд▓реНрдб рдирд╛рдо" рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрд╛рдж "рдЯреИрдЧ рдирд╛рдо" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

union { //or whatever
  None, invalid struct{} //None is zero value
  Good, Bad int
  Err error //okay because it's explicitly named
}

рдЕрднреА рднреА рдХреЛрдИ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рдЯреИрдЧ рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рд░рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред

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

рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдп рдирд┐рд░реНрдорд╛рдг: U{v} рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдорд╛рдиреНрдп рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЗрд╕реЗ U{Tag: v} ред

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

рдПрдХ рд╕рдВрдШ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдВрдЧрдд рд╕рдВрдШ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╛рдВрдЫрд┐рдд рдЯреИрдЧ рдирд╛рдо рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: v.Good = 1 рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рдХреЛ рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

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

g := v.[Tag] //may panic
g, ok := v.[Tag] //no panic but could return zero-value, false

v.Tag rhs рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред

рдЯреИрдЧ рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреА рддрд░рд╣ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ switch v.[type] рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреЗрд╕ рдпреВрдирд┐рдпрди рдХреЗ рдЯреИрдЧ рд╣реЛрддреЗ рд╣реИрдВред

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

рдХреБрдЫ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди a, b рджрд┐рдП рдЧрдП рд╣реИрдВ, a == b рдпрджрд┐ рдЙрдирдХреЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рд╕рдорд╛рди рд╣реИред

рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рд╣реИ, рдПрдХ рдЯреИрдЧ рдЕрднрд┐рдХрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

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

рдИ: рдиреЗрд╕реНрдЯреЗрдб рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рджрд┐рдпрд╛ рдЧрдпрд╛

type U union {
  A union {
    A1 T1
    A2 T2
  }
  B union {
    B1 T3
    B2 T4
  }
}
var u U

u рдХрд╛ рдорд╛рди рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ A рд╣реИ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ A1 рдХреЗ рд╕рд╛рде рдЕрдирд╛рдо рд╕рдВрдШ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди T1 рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИред

u.B.B2 = returnsSomeT3()

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

v := u.[A].[A2]

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

рд╕рдВрдкрд╛рджрд┐рдд 2: рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЛрдВ рдкрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред

рджрд┐рдпрд╛ рдЧрдпрд╛

type U union {
  Exported, unexported int
}
var u U

u.(int) рдЬреИрд╕рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИред рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░, рд╡рд╣ рд╣рдореЗрд╢рд╛ рд░рд╣реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ u рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рддреЛ u.(int) рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рдХреЗ unexported рдХреЗ рд▓реАрдХ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдШрдмрд░рд╛рдПрдЧрд╛ред рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЗ рд▓рд┐рдПред

@ianlancetaylor рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдорджрдж рдХрд░реЗрдЧреА:

  1. рдХреБрдЫ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП go/ast ) рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдмрдбрд╝реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭреЗ рдмрд┐рдирд╛ рдЗрди рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдЕрдзрд┐рдХ рднреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ, рдХрднреА-рдХрднреА рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ go/ast.Node ), рджреВрд╕рд░реА рдмрд╛рд░ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ (рдЬреИрд╕реЗ go/ast.Object.Decl )ред

  2. рдкреНрд░реЛрдЯреЛрдмрдл oneof рдлреАрдЪрд░ рдХреЛ рдЧреЛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдПрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдмрджрд▓реЗ рдореЗрдВ oneof рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЕрдХреНрд╖рд░ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдХрдард┐рди рд╣реИ:

    &sppb.Mutation{
               Operation: &sppb.Mutation_Delete_{
                   Delete: &sppb.Mutation_Delete{
                       Table:  m.table,
                       KeySet: keySetProto,
                   },
               },
    }
    

    рдХреБрдЫ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рднреА рдирд╣реАрдВ) oneofs рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

    type ObjectAttrs struct {
       ContentType string
       ...
    }
    

    рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ

    type ObjectAttrsToUpdate struct {
       ContentType optional.String
       ...
    }
    

    рдЬрд╣рд╛рдВ optional.String рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ ( Godoc ):

    // String is either a string or nil.
    type String interface{}
    

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

    type ObjectAttrsToUpdate struct {
       ContentType string | nil
       ...
    }
    
  4. рдХрдИ рдлрд╝рдВрдХреНрд╢рди xor рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде (T, error) рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ (T рдЕрд░реНрдердкреВрд░реНрдг рд╣реИ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рд╣реИ)ред рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ T | error рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝реЗрдЧреА, рдФрд░ рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рд╣реЛрдВрдЧреЗред рднрд▓реЗ рд╣реА рд╣рдо (рд╕рдВрдЧрддрддрд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ) рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЙрд╕ рдорд╛рди рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд┐рд╕реА рдЪреИрдирд▓ рдкрд░ рд▓рд┐рдЦрдирд╛ред

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

chan *Response | error

рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХрдИ рдмрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИред

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

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

рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЖрдИрдУрдЯрд╛, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВред

рдпреЛрдЯрд╛

рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордХрдХреНрд╖ рд╣реИрдВ:

type Stoplight union {
  Green, Yellow, Red struct {}
}

func (s Stoplight) String() string {
  switch s.[type] {
  case Green: return "green" //etc
  }
}

рддрдерд╛

type Stoplight int

const (
  Green Stoplight = iota
  Yellow
  Red
)

func (s Stoplight) String() string {
  switch s {
  case Green: return "green" //etc
  }
}

рд╕рдВрдХрд▓рдХ рд╕рдВрднрд╡рддрдГ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХреЛрдб рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдЧрд╛ред

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

рдмреЗрд╢рдХ, рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдЖрдИрдУрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдВрдХреЗрдд

рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордХрдХреНрд╖ рд╣реИрдВ

type MaybeInt64 union {
  None struct{}
  Int64 int64
}

рддрдерд╛

type MaybeInt64 *int64

рд╕реВрдЪрдХ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИред рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд┐рдЯ (рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╢рдмреНрдж рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдорд╛рди рдХрд╛ рдЖрдХрд╛рд░ рд╕рдВрднрд╡рддрдГ https://golang.org/pkg/database/sql/ рдЬреИрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ред

рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд░рд╛рджреЗ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИред

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

рдЗрдВрдЯрд░рдлреЗрд╕

рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордХрдХреНрд╖ рд╣реИрдВ

type AB union {
  A A
  B B
}

рддрдерд╛

type AB interface {
  secret()
}
func (A) secret() {}
func (B) secret() {}

рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдП рдФрд░ рдмреА рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ- рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ json.Token рдЙрджрд╛рд╣рд░рдг @urandom рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

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

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

рдмреЗрд╢рдХ, рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╛рд░рд╛рдВрд╢

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдУрд╡рд░рд▓реИрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ рдУрд╡рд░рд▓реИрдк рд╣реЛред

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

рдЖрдИрдУрдЯрд╛ рдФрд░ рдкреЙрдЗрдВрдЯрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдХреНрд▓рдВрдХреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг "рдПрдХ рдЕрдирдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб рдореЗрдердб рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕" рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ map[string]interface{} рдФрд░ (рдЧреИрд░-рдЦрд╛рд▓реА) рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде func рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдзрд┐ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдард┐рди рдФрд░ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

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

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

@jimmyfrasche

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

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЖрдкрдХрд╛ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

union {
    struct{}
    int
    err
}

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдРрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЬреИрд╕реЗ v.struct{} = struct{}

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

рдЕрдм, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

[union|sum|pick|oneof] {
    type1
    package1.type2
    ....
}

рдЙрдкрд░реЛрдХреНрдд рдЕрдзрд┐рдХ рдЬрд╛рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИред

рджреВрд╕рд░реА рдУрд░, type1 | package1.type2 рдЖрдкрдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ '|' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИред рдкреНрд░рддреАрдХ, рдЬрд┐рд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ OR рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЧреВрдврд╝ рд╣реБрдП рдмрд┐рдирд╛ рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред

@urandom рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ "рдЯреИрдЧ рдирд╛рдо" рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ interface{} рдореЗрдВ рдЧрд┐рд░рдиреЗ рджреЗрдВред рд╡реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдмрдирдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рдЪреАрдЬ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЯреИрдЧ рдирд╛рдо рдЙрдиреНрд╣реЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рд░рдЦрддреЗ рд╣реИрдВред

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

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

type Counter union {
  Successes, Failures uint 
}

рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП

type (
  Success uint
  Failures uint
  Counter Successes | Failures
)

рдФрд░ рдХрд╛рдо рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣реЗ рд╣реИрдВ c = Successes(1) рдХреЗ рдмрдЬрд╛рдп c.Successes = 1 ред рдЖрдкрдХреЛ рдЬреНрдпрд╛рджрд╛ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

type Failure union {
  Local, Remote error
}

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

рдЯреИрдЧ рдирд╛рдо рд╕рдВрдШ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖ рди рддреЛ рдЙрдкрдирд╛рдо рдФрд░ рди рд╣реА рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрдИ "рдЯреИрдЧ" рд╣реЛрдирд╛ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИ: рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ (рдЬрд┐рд╕реЗ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ) рдХрд░рддрд╛ рд╣реИред

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

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

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

рдЙрд╕ рдкрд░ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдХ рдЙрджрд╛рд╣рд░рдг @rogpeppe io.Reader | io.ReadCloser ред рдЯреИрдЧ рдХреЗ рдмрд┐рдирд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛, рдпрд╣ io.Reader рдЬреИрд╕рд╛ рд╣реА рд╣реИред

рдЖрдк рдПрдХ ReadCloser рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд░реАрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдП рдЦреЛ рджреЗрддреЗ рд╣реИрдВ | рдмреА рдХрд╛ рдЕрд░реНрде рд╣реИ рдП рдпрд╛ рдмреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ред

рдпрджрд┐ рдЖрдкрдХреЛ рдХрднреА-рдХрднреА io.ReadCloser рдХреЛ io.Reader рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдЖрдкрдХреЛ рд░реИрдкрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ type Reader struct { io.Reader } рдЖрджрд┐ рдФрд░ рдкреНрд░рдХрд╛рд░ Reader | ReadCloser ред

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

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

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

рдЖрдк рдЯреИрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣ рд╕рдм рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

union { R io.Reader | RC io.ReadCloser } рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд░реАрдбрдХреНрд▓реЛрдЬрд░ рдХреЛ рдПрдХ рдкрд╛рдардХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдП рдпрджрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреЛрдИ рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдЯреИрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдЯреИрдЧ рд╣реИ рдпрд╛ рджреВрд╕рд░рд╛ред

рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐, рдпрджрд┐ рдЖрдкрдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕реЗ рдПрдХ io.Reader рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдХреЛрдИ chan рд░рд┐рд╕реАрд╡ рдпрд╛ func рдХреЙрд▓ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ io.ReadCloser рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЙрдЪрд┐рдд рдЯреИрдЧ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ io рдкрд░ assert рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХрд░реАрдм рдкрдврд╝реЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЖрд╢рдп рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИтАФрдареАрдХ рд╡рд╣реА рдЬреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХреЛрдб рдореЗрдВ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдЧ рдЕрднрд┐рдХрдерди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдХрдердиреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ io.Reader рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЯреИрдЧ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

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

рд╕рдВрдШ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЬрд╛рдУ:

type fail union { //zero value: (Local, nil)
  Local, Remote error
}

func (f fail) Error() string {
  //Could panic if local/remote nil, but assuming
  //it will be constructed purposefully
  return f.(error).Error()
}

type U union { //zero value: (A, "")
  A, B, C string
  D, E    int
  F       fail
}

//in a different package

func create() pkg.U {
  return pkg.U{D: 7}
}

func process(u pkg.U) {
  switch u := u.[type] {
  case A:
    handleA(u) //undefined here, just doing something with unboxed value
  case B:
    handleB(u)
  case C:
    handleC(u)
  case D:
    handleD(u)
  case E:
    handleE(u)
  case F:
    switch u := u.[type] {
    case Local:
      log.Fatal(u)
    case Remote:
      log.Printf("remote error %s", u)
      retry()
    } 
  }
}

рд╡рд░реНрддрдорд╛рди рдЧреЛ рдореЗрдВ рдЕрдиреВрджрд┐рдд:

(рд▓рд┐рдкреНрдпрдВрддрд░рдг рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреЛрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)

const ( //simulates tags, namespaced so other packages can see them without overlap
  Fail_Local = iota
  Fail_Remote
)

//since there are only two tags with a single type this can
//be represented precisely and safely
//the error method on the full version of fail can be
//put more succinctly with type embedding in this case

type fail struct { //zero value (Fail_Local, nil) :)
  remote bool
  error
}

// e, ok := f.[Local]
func (f *fail) TagAssertLocal2() (error, bool) { //same for TagAssertRemote2
  if !f.remote {
    return nil, false
  }
  return f.error, true
}

// e := f.[Local]
func (f *fail) TagAssertLocal() error { //same for TagAssertRemote
  if !f.remote {
    panic("invalid tag assert")
  }
  return f.error
}

// f.Local = err
func (f *fail) SetLocal(err error) { //same for SetRemote
  f.remote = false
  f.error = err
}

// simulate tag switch
func (f *fail) TagSwitch() int {
  if f.remote {
    return Fail_Remote
  }
  return Fail_Local
}

// f.(someType) needs to be written as f.TypeAssert().(someType)
func (f *fail) TypeAssert() interface{} {
  return f.error
}

const (
  U_A = iota
  U_B
  // ...
  U_F
)

type U struct { //zero value (U_A, "", 0, fail{}) :(
  kind int //more than two types, need an int
  s string //these would all occupy the same space
  i int
  f fail
}

//s, ok := u.[A]
func (u *U) TagAssertA2() (string, bool) { //similar for B, etc.
  if u.kind == U_A {
    return u.s, true
  }
  return "", false
}

//s := u.[A]
func (u *U) TagAssertA() string { //similar for B, etc.
  if u.kind != U_A {
    panic("invalid tag assert")
  }
  return u.s
}

// u.A = s
func (u *U) SetA(s string) { //similar for B, etc.
  //if there were any pointers or reference types
  //in the union, they'd have to be nil'd out here,
  //since the space isn't shared
  u.kind = U_A
  u.s = s
}

// special case of u.F.Local = err
func (u *U) SetF_Local(err error) { //same for SetF_Remote
  u.kind = U_F
  u.f.SetLocal(err)
}

func (u *U) TagSwitch() int {
  return u.kind
}

func (u *U) TypeAssert() interface{} {
  switch u.kind {
  case U_A, U_B, U_C:
    return u.s
  case U_D, U_E:
    return u.i
  }
  return u.f
}

//in a different package

func create() pkg.U {
  var u pkg.U
  u.SetD(7)
  return u
}

func process(u pkg.U) {
  switch u.TagSwitch() {
  case U_A:
    handleA(u.TagAssertA())
  case U_B:
    handleB(u.TagAssertB())
  case U_C:
    handleC(u.TagAssertC())
  case U_D:
    handleD(u.TagAssertD())
  case U_E:
    handleE(u.TagAssertE())
  case U_F:
    switch u := u.TagAssertF(); u.TagSwitch() {
    case Fail_Local:
      log.Fatal(u.TagAssertLocal())
    case Fail_Remote:
      log.Printf("remote error %s", u.TagAssertRemote())
    }
  }
}

@jimmyfrasche

рдЪреВрдВрдХрд┐ рд╕рдВрдШ рдореЗрдВ рдРрд╕реЗ рдЯреИрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдирд┐рдореНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛:

func process(u pkg.U) {
  switch v := u {
  case A:
    handleA(v) //undefined here, just doing something with unboxed value
  case B:
    handleB(v)
  case C:
    handleC(v)
  case D:
    handleD(v)
  case E:
    handleE(v)
  case F:
    switch w := v {
    case Local:
      log.Fatal(w)
    case Remote:
      log.Printf("remote error %s", w)
      retry()
    } 
  }
}

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

рд╕рд╛рде рд╣реА, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд, рдХреНрдпрд╛ рдРрд╕рд╛ рдХреЛрдб рдорд╛рдиреНрдп рд╣реЛрдЧрд╛:

type Foo union {
    // Completely different types, no ambiguity
    A string
    B int
}

func Bar(f Foo) {
    switch v := f {
        ....
    }
}

....

func main() {
    // No need for Bar(Foo{A: "hello world"})
    Bar("hello world")
    Bar(1)
}

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

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

var i someInterface = someValue //where someValue implements someInterface.
var j someInterface = i //this assignment is different from the last one.

рдпрд╣ рдареАрдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЕрдиреБрдмрдВрдз рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдиреЗ рддрдХ someValue рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред

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

рдореБрдЭреЗ рдХрднреА-рдХрднреА рдПрдХ рдХрджрдо рдЫреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдореЗрдВ рдХреЛрдИ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдПрдХ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рднреА рд╕рднреА рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрдиреЗ Foo/Bar рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрджрд┐ C int рдХреЛ Foo C int рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ Bar(1) рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди Bar("hello world") ред рдпрд╣ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдордЭрдирд╛ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рд╡реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рд╡реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ-рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдкрд░ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдЖрд╕рд╛рди рдлрд╝реНрд▓реЛрдЪрд╛рд░реНрдЯ рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рд▓реЗрдВ!

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

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

type Foo struct {
  A string
  B int
}

func Bar(f Foo) {...}

func main() {
  Bar("hello world") //same as Bar(Foo{A: "hello world", B: 0})
  Bar(1) //same as Bar(Foo{A: "", B: 1})
}

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ Bar(Foo{1}) рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдЬрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП &Foo{"hello world"} рд▓рд┐рдП рд╕рдордЧреНрд░ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред

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

switch v := u.[type] {... рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП switch v := i.(type) {... рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЕрднреА рднреА рд╕рдВрдШ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдФрд░ рджрд╛рд╡реЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реНрдкреЙрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣ u.[union] рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрддрдирд╛ рднрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред

рдЖрдк рдПрдХ рд╣реА рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ .(type) рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рд╕рд╣реА рдард╣рд░рд╛рддрд╛ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВред

рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдкреАрдЫреЗ рдореЗрд░рд╛ рдпрд╣реА рддрд░реНрдХ рдерд╛ред

@jimmyfrasche
рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдмрд╛рдж рднреА рд╕реНрд╡рд┐рдЪ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде, switch v := i.(type) {... рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреАрдмрджреНрдз рд╣реИ, рдФрд░ .(type) рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рдВрдШ рдХреЗ рд╕рд╛рде, рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдиред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓рд╛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдореВрд▓реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдЗрдВрдЯ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд╣рд╛рдВ рдорд╛рдорд▓реЗ рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг switch v := u {... ред рдЙрд╕ рд╕реЗ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдШ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ switch v := u { ... , рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдорд▓реЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрдирдЯреНрд╕ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реИрдВред

@urandom рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдмрд┐рдирд╛ рд▓реЗрдмрд▓ рдХреЗ рдПрдХ рд╣реЛрд▓реНрдбрдУрд╡рд░ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрдм рдкреНрд░рдХрд╛рд░ рдерд╛ред рдореИрдВрдиреЗ рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рдЖрдВрдЦ рдореВрдВрджрдХрд░ рдЗрд╕реЗ рдХреЙрдкреА рдХрд░ рд▓рд┐рдпрд╛ред рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

switch u {... рдХрд╛рдо рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди switch v := u {... рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ switch v := f(); v {... рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рдЬреЛ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ - рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐ рдЬрд┐рд╕рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛)ред

рдпрджрд┐ union рдХреАрд╡рд░реНрдб рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ pick рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ switch u.[pick] {... рдпрд╛ switch v := u.[pick] {... рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдорд░реВрдкрддрд╛ рд░рдЦрддрд╛ рд╣реИ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рднреНрд░рдо рдЦреЛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИред

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

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЬреАрдм рдЪреБрдирдиреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

[рджреЗрд░реА рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ - рдореИрдВ рдЫреБрдЯреНрдЯреА рдкрд░ рдерд╛]

@ianlancetaylor рдиреЗ рд▓рд┐рдЦрд╛:

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

рджреЛ рдореБрдЦреНрдп рдлрд╛рдпрджреЗ рд╣реИрдВ рдЬреЛ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдкрд╣рд▓рд╛ рднрд╛рд╖рд╛ рд▓рд╛рдн рд╣реИ; рджреВрд╕рд░рд╛ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рд╣реИред

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

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

рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рджрд░реНрдж рдЬреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдЧреЛрдбреЛрдХред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ast.Spec рд▓реЗрдВ: https://golang.org/pkg/go/ast/#Spec

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

рдпрджрд┐ рднрд╛рд╖рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬрд╛рдирддреА рд╣реИ, рддреЛ рдЗрд╕реЗ godoc рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ iotas рдХреЗ рд╕рд╛рде рдПрдирдо рдкреНрд░рдХрд╛рд░ред рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд▓реЗрдирдЯреЗрдХреНрд╕реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рднреА рдЬреБрдбрд╝ рд╕рдХрддреЗ рдереЗред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг: https://github.com/mvdan/sh/commit/ebbfda50dfe167bee741460a4491ffec1006bdef

@mvdan рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ Go1 рдореЗрдВ рдХрд╣рд╛рдиреА рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдмрд┐рдВрджреБ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдХреНрдпрд╛ рдЖрдк рдХреЗрд╡рд▓ godoc рдкреГрд╖реНрда рдХреЗ рднреАрддрд░ рдЕрдиреНрдп рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

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

(рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдирд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдордп рдЗрд╕рдХрд╛ рд╢рд┐рдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ)ред

рдореИрдВ рдЗрд╕ (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд▓рдВрдмреЗ) рдзрд╛рдЧреЗ рдХреЛ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╣реИ - рдКрдкрд░ рджреЗрдЦреЗрдВред

@Merovius рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ https://github.com/golang/go/issues/19814#issuecomment -298833986 рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдПрд╕рдЯреА рд╕рд╛рдорд╛рди рдПрдирдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

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

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

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

рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ:

  1. рдЖрдкрдХрд╛ рдХреЛрдб рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдкрд░ рдЪрд▓рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ:
    1.1. рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХрд╛ рдХреЛрдб рдЪреБрдкрдЪрд╛рдк рдЧрд▓рдд рд╣реИ
    1.2. рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рд╡рд░рдг рд╣реИ, рдЖрдкрдХрд╛ рдХреЛрдб рд╕рдВрдХрд▓рди рд╕рдордп рдХреЗ рдмрдЬрд╛рдп рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ (рдкрд░реАрдХреНрд╖рдг рдорджрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдЙрди рдиреЛрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдкрд░ рдореМрдЬреВрдж рдереЗ)
  2. рдЖрдкрдХрд╛ рдХреЛрдб рдХреЗрд╡рд▓ рдиреЛрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ:
    2.1. рдЗрд╕ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдиреЛрдб рд╡реИрд╕реЗ рднреА рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛
    2.1.1. рдЬрдм рддрдХ рдЗрд╕ рдирдП рдиреЛрдб рдореЗрдВ рдЖрдкрдХреА рд░реБрдЪрд┐ рдХрд╛ рдХреЛрдИ рднреА рдиреЛрдб рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рддрдм рддрдХ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
    2.1.2. рдЕрдиреНрдпрдерд╛, рдЖрдк рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдкрд░ рдЪрд▓рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ
    2.2. рдЗрд╕ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдиреЛрдб рдЙрд╕ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдореЗрдВ рд╣реЛрддрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рдереЗред

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

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

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

рди рддреЛ 2.2 рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдПрдХ рд╕рд░рд▓, рдПрдПрд╕рдЯреА-рдЖрд╕рдиреНрди, рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ: рдЯреЛрдХрдиред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдПрдХ рд╕рд░рд▓ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдХреНрд╕рд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред * рдЬреИрд╕реЗ рдЯреЛрдХрди рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рдЬреБрдбрд╝рд╛ рд╣реИ рдФрд░ Var рдЬреИрд╕реЗ рдЯреЛрдХрди рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдирд╛рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдФрд░ рдЯреЛрдХрди рдЬреИрд╕реЗ Val рдЬреЛ рдПрдХ рдлреНрд▓реЛрдЯ64 рдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ .

рдЖрдк рдЗрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдердХрд╛рдК рд╣реЛрдЧрд╛ред рдЖрдк рд╢рд╛рдпрдж рдРрд╕рд╛ рдХреБрдЫ рдХрд░реЗрдВрдЧреЗ, рдпрджреНрдпрдкрд┐:

package token
type Type int
const (
  Times Type = iota
  // ...
  Var
  Val
)
type Value struct {
  Type
  Name string // only valid if Type == Var
  Number float64 // only valid if Type == Val
}

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдЯреВрд▓реАрдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

@jimmyfrasche

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

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

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

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

рдмрд┐рд▓реНрдХреБрд▓ред рд╕рдо рдкреНрд░рдХрд╛рд░, рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рд╣рд░ рдХрд╛рд░рдг рд╕реЗ рд▓реЛрдЧ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрд░рдорд┐рдХ рдХреЛрдб рдорд░рдореНрдордд рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реИрдВред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЖрдзрд╛рд░рд┐рдд рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ 2.1.1 рдорд╛рдорд▓рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

рдПрдПрд╕рдЯреА рдХреЛ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреЗрдиреА рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

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

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

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

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

рдЖрдк рдЗрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдердХрд╛рдК рд╣реЛрдЧрд╛ред

рд╕рд┐рдХреЛрдбрд╝рдирд╛ рдпрд╣ рдПрдХ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдХрдо рд╣реА рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред

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

@Merovius рдореБрдЭреЗ рдХреНрд░рдорд┐рдХ рдХреЛрдб рдорд░рдореНрдордд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдФрд░ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдмреАрдЪ рдореЗрдВ:

рдердХрд╛рд╡рдЯ рдЬрд╛рдВрдЪ

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

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

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

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

switch {
case n < 0:
case n == 0:
case n > 0:
}

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

switch {
case p[0](a, b):
case p[1](a, b):
//...
case p[N](a, b):
}

рднрд▓реЗ рд╣реА p[i] a рдФрд░ b рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рд╕рдордХрдХреНрд╖ рд╕рдВрдмрдВрдз рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрд╡рд┐рдЪ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдорд╛рдорд▓рд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЗрд╕реЗ рдПрдХ рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореМрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛, рд╕реНрд░реЛрдд рдореЗрдВ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди, рд╢реНрд╡реЗрддрд╕реВрдЪреА рдореЗрдВ egrep -v рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдпрд╛ рд╕реНрд╡рд┐рдЪ рдкрд░ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬрд┐рд╕рдХрд╛ рдЭреВрдард╛ рдЕрд░реНрде рд╣реИ рдХрд┐ p[i] рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред

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

рдЯреЛрдХрди

рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреЛрдХрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

//Type defined as before
type SimpleToken { Type }
type StringToken { Type; Value string }
type NumberToken { Type; Value float64 }
type Interface interface {
  //some method common to all these types, maybe just token() Interface
}

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

рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рддрд┐ рдЯреЛрдХрди рдПрдХ рдкреНрд░рдХрд╛рд░ ( type Plus struct{} , type Mul struct{} , рдЖрджрд┐) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рдмрд╣реБрдд рдХрд╛рдо рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ)ред

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

type SimpleToken int //implements token.Interface
const (
  Plus SimpleToken = iota
  // ...
}
type NumericToken interface {
  Interface
  Value() float64
  nt() NumericToken
}
type IntToken struct { //implements NumericToken, and a FloatToken
type StringToken interface { // for Var and Func and Const, etc.
  Interface
  Value() string
  st() StringToken
}

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

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

рддреЛ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рд╣рдо рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рд╕рдВрдкреВрд░реНрдг рдЬрд╛рдБрдЪ рдореЗрдВ рдпрд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ :)

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

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

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

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

рдмрд╛рд╡рдЬреВрдж рдЗрд╕рдХреЗ рд╢реЛрд░-рд╢рд░рд╛рдмрд╛ рдирдЬрд░ рдЖ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:

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

рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреЛрдХрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

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

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдЪрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИред

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

https://github.com/jimmyfrasche/switchlint

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░ рдХреА рдХрд╛рдлреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдкрд░рд┐рд╖реНрдХреГрдд рдирд╣реАрдВ рд╣реИред рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

(рдмрд╛рдХреА рдХрд╛ рдЬрд╡рд╛рдм рдореИрдВ рдмрд╛рдж рдореЗрдВ рджреВрдВрдЧрд╛)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЧрд▓рдд рдорд╛рд░реНрдХрдЕрдк рдкреНрд░рд╛рд░реВрдк

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рдХрд╛ рдПрдХ (рдХрд╛рдлреА рдкрдХреНрд╖рдкрд╛рддрдкреВрд░реНрдг) рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ (рдФрд░ рдореЗрд░рд╛ рджреВрд╕рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ narcissistically рдорд╛рдирддреЗ рд╣реБрдП)

рдкреЗрд╢реЗрд╡рд░реЛрдВ

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

рджреЛрд╖

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

рд╡реИрдХрд▓реНрдкрд┐рдХ

  • 1 + 1 + тЛп + 1 . рдлреЙрд░реНрдо рдХреЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП iota "enum"
  • рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░рдХрдо (рд╕рдВрднрд╡рддрдГ рдЙрддреНрдкрдиреНрди) рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдЯреИрдЧ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕
  • рдпрд╛ рдПрдХ рдЖрдИрдУрдЯрд╛ рдПрдирдо рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд-рднрд╛рд╖рд╛рдИ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдПрдирдо рд╡реИрд▓реНрдпреВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ

рдзреНрдпрд╛рди рджрд┐рдП рдмрдЧреИрд░

  • рдмреЗрд╣рддрд░ рдЯреВрд▓реАрдВрдЧ, рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рдЯреВрд▓рд┐рдВрдЧ

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

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

рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреА рддрд░рд╣ рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред

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

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

@Merovius рдЖрдкрдХреА betterSumType() BetterSumType рдЪрд╛рд▓ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ

func CallBeforeSwitches(b BetterSumType) (BetterSumType, bool) {
    if b == nil {
        return nil, false
    }
    b = b.betterSumType()
    if b == nil {
        return nil, false
    }
    return b, true
}

рдФрд░ рд▓рд┐рдВрдЯ рднреА рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирджрдВрдб рдХреНрдпрд╛ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╕рднреА рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реИрдВ?

рдпрд╣ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рддрдм рдХреБрдЫ рднреА рдЦреЗрд▓ рд╣реЛрддрд╛ рд╣реИред рддреЛ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

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

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

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

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

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

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

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рд▓рд┐рдВрдЯрд░ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ "рдЕрднреА рдпрд╣ 100% рд╕рдВрдкреВрд░реНрдг рд╣реИ" рдЬреЛ рд╣рдорд╛рд░реЗ рдмрд┐рдирд╛ рдХреБрдЫ рднреА рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

"Iota enums" рдХреЗ рд▓рд┐рдП рдПрдХ рдердХрд╛рд╡рдЯ рдЪреЗрдХрд░ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред

рд╕рднреА type t u рдЬрд╣рд╛рдВ u рдЕрднрд┐рдиреНрди рд╣реИ рдФрд░ t рдХрд╛ рдЙрдкрдпреЛрдЧ const рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рддреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ iota рдЬреИрд╕реЗ рдХрд┐ рд╢реВрдиреНрдп рдЗрди рд╕реНрдерд┐рд░рд╛рдВрдХреЛрдВ рдореЗрдВ u рдХрд╛ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИред

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

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

рдХреБрдЫ рдЖрд╢реБрд▓рд┐рдкрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП min(t) рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП, C , min(t) <= C , рдФрд░, рдЗрд╕реА рддрд░рд╣, рдЖрдЗрдП max(t) рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП, C , C <= max(t) ред

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

  • t рдорд╛рди рд╣рдореЗрд╢рд╛ рдирд╛рдорд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╛ рдХреБрдЫ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ 0, рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЖрдордВрддреНрд░рдг)
  • min(t) <= v <= max(t) рдмрд╛рд╣рд░ t , v рдорд╛рди рдХреА рдХреЛрдИ рдЕрд╕рдорд╛рдирддрд╛ рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ
  • t рдорд╛рди рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдореЗрдВ рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ + , / , рдЖрджрд┐ред рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рддрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдкрд░рд┐рдгрд╛рдо min(t) рдФрд░ max(t) рдмреАрдЪ рдХреНрд▓реИрдВрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред t ред
  • рд╕реНрд╡рд┐рдЪ рдореЗрдВ t рдпрд╛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗрд╕ рдХреЗ рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВред

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

рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣, рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рдорд╛рди, рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рддреЛ рдЗрд╕реЗ рдЧреЛ 2 рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рд░рдЦреЗрдВ?

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

рдЯрд╛рдЗрдк рдПрд▓рд┐рдпрд╛рд╕ рдПрдХ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдерд╛ред рд╕рдо рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╢реЛ рд╕реНрдЯреЙрдкрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИред

@rogpeppe рдХреЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ (рдорд╛рдореВрд▓реА) рдмрд┐рдВрджреБред рдкреИрдХреЗрдЬ рдореЗрдВ http , рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ Handler рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, HandlerFunc ред рдЕрднреА, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ http.Handle рдкрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ HandlerFunc рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ http.Handle рдмрдЬрд╛рдп HandlerFunc | Handler рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ HandlerFunc рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди/рдХреНрд▓реЛрдЬрд░ рдХреЛ рд╕реАрдзреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдШ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реЗ рдорд╛рдиреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ HandlerFunc рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ Handler , Handler рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред

@griesemer рдПрдирдо рдереНрд░реЗрдб рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ, https://github.com/golang/go/issues/19814#issuecomment -322752526, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╣рд▓реЗ https://github.com/golang/ go/issues/19412#issuecomment -289588569 рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ ("рд╕реНрд╡рд┐рдлреНрдЯ рд╕реНрдЯрд╛рдЗрд▓ рдПрдирдо") рдХреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд┐рддрдирд╛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВ рдЕрдЧрд░ рд╡реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рд╡реЗ рджреЗрдЦреЛ рд╣реЛрдЧрд╛ / рдЗрд╕ рддрд░рд╣ рдПрдХ рдмрд╣реБрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рд▓рдЧрддрд╛ рд╣реИред

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

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рд┐рдореНрдпреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдореНрдмреЗрдб рдХрд░рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд░рдХрд┐рдирд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдмрдЪрд╛рд╡ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрдпрд╛ рд╣реВрдВ: https://play.golang.org/p/FqdKfFojp-

@jimmyfrasche рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ред

рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ: https://play.golang.org/p/p2tFm984S8

@rogpeppe рдЕрдЧрд░ рдЖрдк рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ?

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

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

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

рд╕рдВрдкрд╛рджрд┐рдд 2: рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдХрд┐ рдЬрдм рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдлрд╝реАрд▓реНрдб рдирд╛рдо рджрд╛рд╡реЗ рдФрд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд 3: рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд┐рд╣рд┐рдд рдлрд╝реАрд▓реНрдб рдирд╛рдо

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 4: рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ

рдкреНрд░рдХрд╛рд░ рдЪреБрдиреЗрдВ

рдПрдХ рдкрд┐рдХ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдордЧреНрд░ рдкреНрд░рдХрд╛рд░ рд╣реИ:

pick {
  A, B S
  C, D T
  E U "a pick tag"
}

рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ, A , B , C , D , рдФрд░ E рдкрд┐рдХ рдФрд░ S рдХреЗ рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╣реИрдВ T , рдФрд░ U рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдлрд╝реАрд▓реНрдб рдирд╛рдо рдирд┐рд░реНрдпрд╛рдд рдпрд╛ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдВрдХреЗрдд рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкрд┐рдХ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХрд╛рдиреВрдиреА

type p pick {
    //...
    p *p
}

рдЕрд╡реИрдз

type p pick {
    //...
    p p
}

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

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

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

type p pick {
    io.Reader
    io.Writer
    string
}

рддреАрди рдлрд╝реАрд▓реНрдб рд╣реИрдВ Reader , Writer , рдФрд░ string рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рдеред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝реАрд▓реНрдб string рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдмреНрд░рд╣реНрдорд╛рдВрдб рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛред

рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдлрд╝реАрд▓реНрдб рдФрд░ рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред

рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╕реНрд░реЛрдд рдХреНрд░рдо рдореЗрдВ рдЙрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдФрд░ рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИред

рдПрдХ рд╣реА рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдорд╛рдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, a рдФрд░ b , рдкрд┐рдХ рд╡реИрд▓реНрдпреВ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

a = b

рдЧреИрд░-рдкрд┐рдХ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд┐рдХ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рднреА, рдЕрд╡реИрдз рд╣реИред

рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЗрд╡рд▓ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИред

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреНрдп рд╣реИрдВ

pick{A string; B int}{A: "string"} //value is (B, "string")
pick{A, B int}{B: 1} //value is (B, 1)
pick{A, B string}{} //value is (A, "")

рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:

pick{A int; B string}{A: 1, B: "string"} //a pick can only have one value at a time
pick{A int; B uint}{1} //pick composite literals must be keyed

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ p рдХрд╛ рдорд╛рди pick {A int; B string} рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

p.B = "hi"

p рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЛ B рдФрд░ B рдХреЗ рдорд╛рди рдХреЛ "рд╣рд╛рдп" рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

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

type P pick {
    A, B image.Point
}

var p P
fmt.Println(P) //{A: {0 0}}

p.A.X = 1 //A is the dynamic field, update
fmt.Println(P) //{A: {1 0}}

p.B.Y = 2 //B is not the dynamic value, create zero image.Point first
fmt.Println(P) //{B: {0 2}}

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

x := p.[X] //panics if X is not the dynamic field of p
x, ok := p.[X] //returns the zero value of X and false if X is not the dynamic field of p

switch v := p.[var] {
case A:
case B, C: // v is only defined in this case if fields B and C have identical type names
case D:
default: // always legal even if all fields are exhaustively listed above
}

рдлрд╝реАрд▓реНрдб рдЕрднрд┐рдХрдерди рдФрд░ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИрдВ, рди рдХрд┐ рдЙрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬрд┐рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реЗ pick рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдирд╛рдо рд╕реЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рди рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдорд╛рдиреНрдп рд╣реИ:

_, ok := externalPackage.ReturnsPick().[Field]

рдпрд╣ рдЕрдорд╛рдиреНрдп рд╣реИ:

_, ok := externalPackage.ReturnsPick().[externalPackage.Field]

рдлрд╝реАрд▓реНрдб рдЕрднрд┐рдХрдерди рдФрд░ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рд┐рдЪ рд╣рдореЗрд╢рд╛ рдбрд╛рдпрдирд╛рдорд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

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

рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдХрдерди рдФрд░ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рднреА рдкрд┐рдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

//removed, see note at top
//v, ok := p.(fmt.Stringer) //holds if the type of the dynamic field implements fmt.Stringer
//v, ok := p.(int) //holds if the type of the dynamic field is an int

рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рд╣рдореЗрд╢рд╛ рдЧрддрд┐рд╢реАрд▓ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

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

рдпрджрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд┐рдХ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рддреЛ:

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

рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ P рдХрд╛ рдорд╛рди рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ Q рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХрд╛ рд╕реЗрдЯ рдФрд░ P рдореЗрдВ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИ рдФрд░ рдЙрдирдХреЗ Q рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВред

рдпрджрд┐ P рдФрд░ Q рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рддреЛ рдЙрди рдлрд╝реАрд▓реНрдб рдХреЛ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрд▓рдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

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

type P pick {A int; B string}
type Q pick {B string; A int; C float64}

//legal
var p P
q := Q(p)

//illegal
var q Q
p := P(Q) //cannot handle field C

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

рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдИ (рдФрд░ рд╡рд┐рдХреА рдореЗрдВ рдЬреЛрдбрд╝реА) https://gist.github.com/jimmyfrasche/ba2b709cdc390585ba8c43c989797325

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдФрд░: рджрд┐рд▓: @mewmew рдХреЛ рдЬрд┐рд╕рдиреЗ рдЙрд╕ рд╕рд╛рд░ рдкрд░ рдПрдХ рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдЫреЛрдбрд╝реА

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ T рд▓рд┐рдП рдХрд╣рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдЬрд┐рд╕реЗ T рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ T рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

type T interface{} restrict { string, error }

T рдирд╛рдордХ рдПрдХ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдПрдХрдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ string рдпрд╛ error ред рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЕрдм рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдБ

func FindOrFail(m map[int]string, key int) T {
    if v, ok := m[key]; ok {
        return v
    }
    return errors.New("no such key")
}

func Lookup() {
    v := FindOrFail(m, key)
    if err, ok := v.(error); ok {
        log.Fatal(err)
    }
    s := v.(string) // This type assertion must succeed.
}

рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░) рдХреЗ рдХреМрди рд╕реЗ рдкреНрд░рдореБрдЦ рддрддреНрд╡ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ?

s := v.(string) // This type assertion must succeed.

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

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

@ianlancetaylor

рдЧреБрдг

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

рд╡рд┐рдкрдХреНрд╖

  • рд╡реЗ рдХреЗрд╡рд▓ рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЪреНрдЫреЗ рд▓рд╛рдн!)
  • рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╢реВрдиреНрдп рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЕрд░реНрдереЛрдВ рдореЗрдВ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЬреЛ рдХреБрдЫ рднреА A + B + C рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ 1 + A + B + C рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ @stevenblenkinsop рдиреЗ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдмрддрд╛рдпрд╛ред
  • рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕ рдирд┐рд╣рд┐рдд рд╕реВрдЪрдХ рдХреЗ рдХрд╛рд░рдг рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдВрдХреЗрдд рд╣реЛрддрд╛ рд╣реИред рдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдк p рдпрд╛ *p рдЪреБрдирдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдЯреНрд░реЗрдб рдСрдл рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдорд┐рд▓ рд╕рдХреЗред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ (рд╕реА рдЕрд░реНрде рдореЗрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗред
  • рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдЧреЛ рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
  • рд╕рдВрднрд╡рддрдГ рдЖрдк T рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рди рд╕рд┐рд░реНрдл type T restrict {string, error} )
  • рдпрджрд┐ рдЖрдк рдлрд╝реАрд▓реНрдб/рд╕рд╛рд░рд╛рдВрд╢/рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ, рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЬрдм рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдордЬрдмреВрдд "рдмрд┐рд▓реНрдХреБрд▓ рдпрд╣ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣" рд╕рдВрдкрддреНрддрд┐ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред рдЖрдк рдПрдХ io.Reader рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ io.Writer рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ (рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд) рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВред
  • рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рджреЛ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдорддрд▓рдм рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реЛрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА; рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреИрдЧ рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрд╛рд╣рд░реА рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдпрд╣ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдврд╝ рд░рд╣рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ (рдореИрдВ рдЗрд╕реЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк error рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреБрдЫ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП T рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП)ред

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

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

@jimmyfrasche
рдЖрдкрдХреЗ рдЕрджреНрдпрддрди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ, рдХреНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рддрддреНрд╡ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ:

type p pick {
    A int
    B string
}

func Foo(P p) {
}

var P p = 42
var Q p = "foo"

Foo(42)
Foo("foo")

рдРрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдкрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реЛрддреА рд╣реИред

рдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдк p рдпрд╛ *p рдЪреБрдирдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдЯреНрд░реЗрдб рдСрдл рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рд╕реНрдХреЗрд▓рд░ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢рдмреНрдж рдкрдврд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рд╢рдмреНрдж рдПрдХ рд╕реВрдЪрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВ; рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП #8405 рджреЗрдЦреЗрдВред рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдЪрд╛рд░ рд╕рдВрднрд╡рддрдГ рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ p рдЕрдВрдд рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рд╣реЛрдирд╛ред

@urandom рдирд╣реАрдВ, рдЖрдкрдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЗрд╕реЗ

var p P = P{A: 42} // p := P{A: 42}
var q P = P{B: "foo")
Foo(P{A: 42}) // or Foo({A: 42}) if types can be elided here
Foo(P{B: "foo"})

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

рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдФрд░ рдлрд┐рд░ рдЖрдк рдПрдХ рдЬреЛрдбрд╝рдиреЗ C uint рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП p рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ p = 42 ?

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

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рдХрдореА рдкрд░ рдирд┐рд░реНрднрд░ рд╕рднреА рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕реЗ p = int(42) рдпрд╛ p = uint(42) рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╕реМ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╡реЗ рд▓рд╛рдЗрдиреЗрдВ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реИрдВред

рдЖрдкрдХреЛ рдпрд╛ рддреЛ 100% рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдмрд╣реБрдд рдирд╛рдЬреБрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдХреЛрдИ рдЫреВ рди рд╕рдХреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

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

@ рдЬреЛрд╢реЗрд░рд┐рдпрди рддреЛ рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╢рдмреНрдж-рдЖрдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп iface рдЕрдм рд╣рдореЗрд╢рд╛ (*type, *value) рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд╕рдорд╡рд░реНрддреА рдЬреАрд╕реА рдХреЛ рджреЛрдиреЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рджреВрд╕рд░рд╛ рд╕реВрдЪрдХ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рд╕рдордЭрд╛?

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

struct {
    int which;
    union {
         A a;
         B b;
         C c;
    } summands;
}

GC рдХреЛ which рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ (рдпрд╛ рдХреБрдЫ рдлреИрдВрд╕реА рд▓реЗрдХрд┐рди рд╕рдордХрдХреНрд╖) рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ summands рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ?

рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╢рдмреНрдж-рдЖрдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп iface рдЕрдм рд╣рдореЗрд╢рд╛ (* рдкреНрд░рдХрд╛рд░, * рдорд╛рди) рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд╕рдорд╡рд░реНрддреА рдЬреАрд╕реА рдХреЛ рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рджреВрд╕рд░рд╛ рд╕реВрдЪрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВ тАФрдпрд╣ рд╕рд┐рд░реНрдл рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╣реИред

рдпреЗ рд╕рд╣реА рд╣реИред

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

pick {
  a uintptr
  b string
  c []byte
}

рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

[ word 1 (ptr) ] [ word 2 (non-ptr) ] [ word 3 (non-ptr) ]
[    <nil>         ] [                 a           ] [                              ]
[       b.ptr      ] [            b.len          ] [                              ]
[       c.ptr      ] [             c.len         ] [        c.cap             ]

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

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

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

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

рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рд╛рд░рд╛рдВрд╢реЛрдВ рдХреЛ "рдХреЙрдореНрдкреИрдХреНрдЯ" рди рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрджрд┐ рдЙрдирдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ (рд╡рд┐рднреЗрджрдХ рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП + 1) рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╕рдВрднрд╡ рд╣реЛ, рдПрдХ рд╕рдВрдХрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрдирд╛, рддрд╛рдХрд┐ рд▓реЗрдЖрдЙрдЯ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХреЗрдВред

рдЕрдЪреНрдЫреЗ рдЖрдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдЦреЛрдирд╛ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╣реИред

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

type p pick {
    A int
    B string
}

рдХреНрдпрд╛ A рдФрд░ B рдХрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ рд╕реЗ рдПрдХ рдкрд┐рдХ рдЪреБрдирддрд╛ рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рдЙрдирдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдореЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдП:

type p pick {
    int
    string
}
q := p{string: "hello"}

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдлреЙрд░реНрдо рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдиреНрдп рд╣реИред рдПрдХ рдмрд╛рдзрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

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

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

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

рдЖрдкрдХрд╛ рдлреЙрд░реНрдореВрд▓реЗрд╢рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рддрд┐рдд рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдХрд╛рд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИрдВред

рдХреНрдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ p рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рд╕реБрд▓рдн рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ рд╣реИ?

рд╡реНрд╣рд╛рдЯ рдЕрдмрд╛рдЙрдЯ

type t struct {}
type P pick {
  t
  //other stuff
}

?

рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХрд░рдХреЗ рдЖрдк рдЬреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

pick {
  unexported Exported
  Exported unexported
}

рдпрд╛ рдФрд░ рднреА

pick { Recoverable, Fatal error }

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

@jimmyfrasche
рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ structs рдХреЗ рдЕрдВрджрд░ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреЛрдк рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╡рд╣ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЙрдкрдирд╛рдо рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрд╣рд╛рд╡рд░рд╛ рдЧреЛ рдореЗрдВ рдЖрдо рд╣реИ рдпрд╛ рдирд╣реАрдВ:

package p
type T struct{
    Exported t
}
type t struct{}

рдЫреЛрдЯрд╛ _t_ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдмрдбрд╝реЗ T рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдРрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдкреЛрдЬрд░ рд╣реИред

@рдЬреИрд╕рд╛

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐:

//with the option to have field names
pick { //T is in the namespace of the pick and the type isn't exposed to other packages
  T t
  //...
}

//without
type T = t //T has to be defined in the outer scope and now t is exposed to other packages
pick {
  T
  //...
}

рд╕рд╛рде рд╣реА, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рдерд╛, рддреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП []string рдЖрдкрдХреЛ type Strings = []string рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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

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

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

рдЕрдЧрд╕реНрдд 18, 2017 12:01 рдкреАрдПрдо, "jimmyfrasche" [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

@josarian https://github.com/josarian рддреЛ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ
рдХрд╛рд░рдг iface рдЕрдм рд╣рдореЗрд╢рд╛ (*type, *value) рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣реИ
рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╢рдмреНрдж-рдЖрдХрд╛рд░ рдХрд╛ рдорд╛рди рдЬреИрд╕рд╛ рдХрд┐ рдЧреЛ рдиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ рддрд╛рдХрд┐
рд╕рдорд╡рд░реНрддреА рдЬреАрд╕реА рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛
рдПрдХ рд╕реВрдЪрдХ рд╣реИтАФрдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рд╕рдордЭрд╛?

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

рд╕рдВрд░рдЪрдирд╛ {
рдЗрдВрдЯ рдЬреЛ;
рд╕рдВрдШ {
рдП рдП;
рдмреА рдмреА;
рд╕реА рд╕реА;
} рд╕рдорди;
}

рдЬреАрд╕реА рдХреЛ рд▓реЙрдХ (рдпрд╛ рдХреБрдЫ рдлреИрдВрд╕реА рд▓реЗрдХрд┐рди рд╕рдордХрдХреНрд╖) рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдорди рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

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

@DemiMarie

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

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рдЪ рдХреНрдпреЛрдВ рд╣реИ, рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

v := pick{ A int; B bool }{A: 5}
p := &v.[A] //(this would be illegal but pretending it's not for a second)
v.B = true

рдпрджрд┐ v рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдлрд╝реАрд▓реНрдб A рдФрд░ B рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд▓реЗ рд▓реЗрдВ рддреЛ p рдПрдХ int рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ: рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдПрдХ рдмреВрд▓ рдХреЛред рд╕реНрдореГрддрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

@jimmyfrasche

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

v := pick{ A int; ... }{A: 5}
v2 := v

v2.[A] = 6 // (this would be illegal under the proposal, but would be 
           // permitted if `v2.[A]` were addressable)

fmt.Println(v.[A]) // would print 6 if the contents of the pick are stored indirectly

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЙрдлрд╝ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)

@jimmyfrasche

рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╕реНрд░реЛрдд рдХреНрд░рдо рдореЗрдВ рдЙрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдФрд░ рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ v.[A] рдФрд░ v.(error) рд╕рд╣реА рдХрд╛рдо рдХрд░реЗрдВред

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

рджрд┐рдпрд╛ рдЧрдпрд╛

var p pick { A error; B int }

рд╢реВрдиреНрдп рдорд╛рди, p , рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ A рдФрд░ A рдХрд╛ рдорд╛рди рд╢реВрдиреНрдп рд╣реИред

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

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, p.B тАФрдПрдХ рд╕реВрдЪрдХ рдирд╣реАрдВ рд╣реИтАФ p.A рд╕рд╛рде рдЕрддрд┐рд╡реНрдпрд╛рдкреА рднрдВрдбрд╛рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ (рдпрд╛рдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдПрдХ *int рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ dereferenced рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ, рдмрд▓реНрдХрд┐ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ int )ред рдпрджрд┐ p.B рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдерд╛, рддреЛ pick рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди new(int) , рдЬреЛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рд╢реВрдиреНрдп *int рдХреЛ new(int) рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХреЗред

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдУрд╣, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ред рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рддреЛ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреАред

@stevenblenkinsop рдЖрд╣, рдареАрдХ рд╣реИ, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрддрд┐рд╡реНрдпрд╛рдкреА рднрдВрдбрд╛рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╣реИред рдпрд╣ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛: рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рд╣реИрдВред

рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪреБрдирддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмреЛрдирд╕ рд╣реИред

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

struct {
  which_field int // 0 = A, 1 = B
  A error
  B int
}

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

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХреНрд╖реЗрддреНрд░ рдЦреЗрд▓ рдореЗрдВ рд╣реИред

рдЪреБрдирдиреЗ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ/рд╕реНрд╡рд┐рдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдереА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкрд┐рдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ fmt.Stringer рд╕рдВрддреБрд╖реНрдЯ рд╣реИ рддреЛ рдЖрдк рдкрд┐рдХ рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

func (p P) String() string {
  return p.(fmt.Stringer).String()
}

рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдкрд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рдмрдирд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд┐рдХ P рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдерд╛ рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ fmt.Stringer рд╣реИ рддреЛ String рд╡рд┐рдзрд┐ рдШрдмрд░рд╛рдПрдЧреА рдпрджрд┐ рд╡рд╣ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп nil ред рдЖрдк рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП nil рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рд╕реНрд╡рдпрдВ рднреА рдирд╣реАрдВред https://play.golang.org/p/HMYglwyVbl рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЪрдпрди рдХреЗ рд╕рд╛рде рд╕рд╛рдордиреЗ рдЖ рд╕рдХрддрд╛ рд╣реИред

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

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

type Num pick { A int; B float32 }

func (n Num) String() string {
      switch v := n.[var] {
      case A:
          return fmt.Sprint(v)
      case B:
          return fmt.Sprint(v)
      }
}
...
n := Num{A: 5}
s1, ok := p.(fmt.Stringer) // ok == false
var i interface{} = p
s2, ok := i.(fmt.Stringer) // ok == true

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

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

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

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛

func (p Pick) String() string {
  switch v := p.[var] {
  case A:
    return v.String()
  case B:
    return v.String()
  //etc
  }
}

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

рдореИрдВ @ianlancetaylor рдХреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдХреБрдЫ рдирдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдорд┐рд▓рд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, https://github.com/golang/go/issues/21161# рдореБрджреНрджрд╛ рдЯрд┐рдкреНрдкрдгреА-320294933)ред

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

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

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреЙрд░реНрдо рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдп рд╣реИрдВ

func F(тАж) (T, error) {
    тАж
}

рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ, рдЬреИрд╕реЗ io.Reader.Read рдФрд░ io.Reader.Write , T рдХреЗ рд╕рд╛рде error рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдпрд╛ рддреЛ T рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ error рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХрднреА рдирд╣реАрдВред рдПрдкреАрдЖрдИ рдХреА рдкреВрд░реНрд╡ рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ T рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдПрдХ рдмрдЧ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рддреНрд░реБрдЯрд┐ io.EOF ); рдмрд╛рдж рдХреА рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп T рд▓реМрдЯрд╛рдирд╛ рдмрдЧ рд╣реИред

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

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

рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╕рдВрдШ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

type PartialMarshal struct {
    Data []byte // The marshalled value, ignoring unset required fields.
    MissingFields []string
}

func Marshal(pb Message) []byte | PartialMarshal | error

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

рджрд┐рдпрд╛ рдЧрдпрд╛

var r interface{} restrict { uint, int } = 1

r рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ int , рдФрд░

var _ interface{} restrict { uint32, int32 } = 1

рдЕрд╡реИрдз рд╣реИред

рджрд┐рдпрд╛ рдЧрдпрд╛

type R interface{} restrict { struct { n int }, etc }
type S struct { n int }

рддреЛ var _ R = S{} рдЕрд╡реИрдз рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди рджрд┐рдпрд╛

type R interface{} restrict { int, error }
type A interface {
  error
  foo()
}
type C struct { error }
func (C) foo() {}

var _ R = C{} рдФрд░ var _ R = A(C{}) рджреЛрдиреЛрдВ рдХрд╛рдиреВрдиреА рд╣реЛрдВрдЧреЗред

рджреЛрдиреЛрдВ

interface{} restrict { io.Reader, io.Writer }

рддрдерд╛

interface{} restrict { io.Reader, io.Writer, *bytes.Buffer }

рд╕рдордХрдХреНрд╖ рд╣реИрдВред

рдЗрд╕реА рддрд░рд╣,

interface{} restrict { error, net.Error }

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

interface { Error() string }

рджрд┐рдпрд╛ рдЧрдпрд╛

type IO interface{} restrict { io.Reader, io.Writer }
type R interface{} restrict {
  interface{} restrict { int, uint },
  IO,
}

рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ R рдмрд░рд╛рдмрд░ рд╣реИ

interface{} restrict { io.Writer, uint, io.Reader, int }

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрдЯреИрд▓рд┐рдХ рдореЗрдВ рдЫреЛрдЯрд╛ рд╕реБрдзрд╛рд░

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

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

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рдореИрдВ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рд╡рд╣ рд╣реИ рдЯреИрдЧ рдХреЛ рдмрджрд▓рдирд╛: foo.X = 0 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ foo = Foo{X: 0} ; рдХреБрдЫ рдФрд░ рд╡рд░реНрдг, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдЯреИрдЧ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдорд╛рди рдХреЛ рд╢реВрдиреНрдп рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рд╣реИ, рдФрд░ рдореБрдЭреЗ рддрдм рднреА рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА рдпрджрд┐ рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@ ns-cweber рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдореИрдВ рд╢реВрдиреНрдп рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╢реНрд░реЗрдп рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ред рд╡рд┐рдЪрд╛рд░ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЗрдзрд░-рдЙрдзрд░ рддреИрд░ рд░рд╣реЗ рдереЗ рдФрд░ @rogpeppe рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдереЗ рдЬреЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЖрдП рдереЗ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╛рдлреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрддрд╛рддреЗ рд╣реИрдВ)ред рдореЗрд░рд╛ рдФрдЪрд┐рддреНрдп рд╡рд╣реА рдерд╛ рдЬреЛ рддреБрдордиреЗ рджрд┐рдпрд╛ рдерд╛ред

рдЬрд╣рд╛рдВ рддрдХ foo.X = 0 рдмрдирд╛рдо foo = Foo{X: 0} , рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛрдиреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдкрд┐рдХ рдХрд╛ рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рддреЛ рдЖрдк foo.X.Y = 0 рдмрдЬрд╛рдп foo = Foo{X: image.Point{X: foo.[X].X, 0}} рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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

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

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

@ns-cweber

рдореИрдВ рдЦреБрдж рдХреЛ foo.XY рд╕реЗрдЯ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛, рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛

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

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

рдЬрдм рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди, рдУрд╣, рдпрд╣ "рдореИрдВрдиреЗ bar.X = 0 рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорддрд▓рдм bar.Y = 0 рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ" рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ foo рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИред

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

-

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

рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рдПрдХ рдореВрд▓реНрдпрд╣реАрди рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, database/sql рдкреИрдХреЗрдЬ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:

type NullString struct {
    String string
    Valid  bool // Valid is true if String is not NULL
}

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ / рдЪрдпрди / рд╕рдВрдШ рдереЗ, рддреЛ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type NullString pick {
  Null   struct{}
  String string
}

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

рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ), рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╕рдорд░реНрдерди рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ:

type NullString union {
  Null
  String string
}

@рдиреАрд▓реНрдб

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

type Null = struct{} //though this puts Null in the same scope as NullString
type NullString pick {
  Null
  String string
}

рдЕрдкрдиреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрдкрдпреЛрдЧ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдирдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: type Stoplight pick { Stop, Slow, Go struct{} } ред рдпрд╣ рдПрдХ рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдлреЙрдХреНрд╕-рдПрдирдо рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рд╣реА рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдореБрдЦ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рд╣реИ рдФрд░ рдЖрдк рдЙрди рддреАрди рд╕реВрдЪреАрдмрджреНрдз рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

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

light := Stoplight{Slow: struct{}{}}
light.Go = struct{}{}

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

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

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

func Stop() Stoplight {
  return Stoplight{Stop: struct{}{}}
}
func Slow() Stoplight {
  return Stoplight{Slow: struct{}{}}
}
func Go() Stoplight {
  return Stoplight{Go: struct{}{}}
}

рдФрд░ рдЖрдкрдХреЗ NullString рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

func Null() NullString {
  return NullString{Null: struct{}{}}
}
func String(s string) NullString {
  return NullString{String: s}
}

рдпрд╣ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ go generate рджреВрд░ рд╣реИ рдФрд░ рд╕рдВрднрд╡рдд: рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрдирд▓рд╛рдЗрди рд╣реИред

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

рдЕрдзрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ:

type NullString union {
  Null
  Value string
}

var _ = NullString{Null}
var _ = NullString{Value: "some value"}
var _ = NullString{Value} // equivalent to NullString{Value: ""}.

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

рдпрд╣ рдорд┐рд╢реНрд░рд┐рдд рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рддрд░рдл, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдЙрдкрдпреЛрдЧ рд╣реИ рдЬреЛ рд╕рдВрдШ/рдкрд┐рдХ/рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдордЭрджрд╛рд░ рдФрд░ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреБрдВрдЬреА рдХреЗ рд╕рдВрдШ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рдХреА рдХреЛрдИ рд╕рдордЭрджрд╛рд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИред

@рдиреАрд▓реНрдб

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

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐

var ns NullString // == NullString{Null: struct{}{}} == NullString{}
ns.String = "" // == NullString{String: ""}

struct{}{} рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдореИрдВ map[T]struct{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВ

var set struct{}

рдХрд╣реАрдВ рдФрд░ theMap[k] = set , рдЗрд╕реА рддрд░рд╣ рдХреА рдкрд╕рдВрдж рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛

рдЖрдЧреЗ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ: рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ (рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ) рдХреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ "рдЗрдХрд╛рдИ" рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ "рд╢реВрдиреНрдп"ред

@bcmills рд╕реЙрд░реНрдЯрд╛ ред

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

data Bool = False | True

рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ Bool рдФрд░ рдПрдХ рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, True рдФрд░ False , рдкреНрд░рддреНрдпреЗрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ () -> Bool ред

рдпрд╣рд╛рдВ () рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдЙрдЪреНрдЪрд╛рд░рд┐рдд рдЗрдХрд╛рдИ рд▓рд┐рдЦрддреЗ рд╣реИрдВтАФрд╡рд╣ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ struct{} ред

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

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

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

рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдЧреЛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред

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

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

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

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

рдпрджрд┐ рд╣рдо рдЧреЛ 2 рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

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

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

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

type ReadResult pick(N int, Err error) {
    N
    PartialResult struct { N; Err }
    Err
}

рд╕рдВрдХрд▓рдХ рдХреЗрд╡рд▓ ReadResult рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рддрд░рдл рдХреИрд╕реЗ рдЬрд╛рдирд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдПрдкреАрдЖрдИ рдЬреИрд╕реЗ template.Must рдХреЛ рдХреЗрд╡рд▓ pick рдмрдЬрд╛рдп рдХрдИ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type ReadResult pick(N int, Err error) {
case Err == nil:
    N
default:
    PartialResult struct { N; Err }
case N == 0:
    Err
}

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

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

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

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рд░ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ

рд╕рдВрд╕реНрдХрд░рдг 1 рд░рдХрдо рдХреЗ рдмрд┐рдирд╛

func Take(i interface{}) error {
  switch i.(type) {
  case int: //do something
  case string:
  default: return fmt.Errorf("invalid %T", i)
  }
}
func Give() (interface{}, error) {
   i := f() //something
   if i == nil {
     return nil, errors.New("whoops v:)v")
  }
  return i
}

рд░рд╛рд╢рд┐ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг 2

type Value pick {
  I int
  S string
}
func TakeSum(v Value) {
  // do something
}
// Deprecated: use TakeSum
func Take(i interface{}) error {
  switch x := i.(type) {
  case int: TakeSum(Value{I: x})
  case string: TakeSum(Value{S: x})
  default: return fmt.Errorf("invalid %T", i)
  }
}
type ErrValue pick {
  Value
  Err error
}
func GiveSum() ErrValue { //though honestly (Value, error) is fine
  return f()
}
// Deprecated: use GiveSum
func Give() (interface{}, error) {
  switch v := GiveSum().(var) {
  case Value:
    switch v := v.(var) {
    case I: return v, nil
    case S: return v, nil
    }
  case Err:
    return nil, v
  }
}

рд╕рдВрд╕реНрдХрд░рдг 3 рдЧрд┐рд╡/рдЯреЗрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛

рд╕рдВрд╕реНрдХрд░рдг 4 рджреЗрдиреЗ/рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рд╡рд╕рдо/рдЯреЗрдХрд╕рдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдЧрд┐рд╡рд╕рдо/рдЯреЗрдХрд╕рдо рдХреЛ рдмрд╕ рдХреЙрд▓ рдХрд░реЗрдВ/рд▓реЗ рд▓реЗрдВ рдФрд░ рдЧрд┐рд╡рд╕рдо/рдЯреЗрдХрд╕рдо рдХреЛ рд╣рдЯрд╛ рджреЗрдВред

рд╕рдВрд╕реНрдХрд░рдг 5 рдЧрд┐рд╡рд╕рдо/рдЯреЗрдХрд╕рдо рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ (рдЕрдзрд┐рдХрд╛рдВрд╢) рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рд╕рдкрдиреЛрдВ рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

type T1 switch {T2,T3} // only nil, T2 and T3 may be assigned to T1
type T2 struct{}
type U switch {} // only nil may be assigned to U
type V switch{interface{} /* ,... */} // V equivalent to interface{}
type Invalid switch {T2,T2} // only uniquely named types
type T3 switch {int,uint} // switches can contain switches but... 

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

var t1 T1
i,ok := t1.(int) // T1 can't be int, only T2 or T3 (but T3 could be int)
switch t := t1.(type) {
    case int: // compile error, T1 is just nil, T2 or T3
}

рдФрд░ рдЧреЛ рд╡реЗрдЯ рдЯреА3 рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯ рдирд┐рд░рдВрддрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рд░реНрдк рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рд╕рднреА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП (рд░рдирдЯрд╛рдЗрдо рдкрд░) var x T3 = 32 рд╣реЛрдЧрд╛ var x interface{} = 32 ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкреИрдХреЗрдЬ рдореЗрдВ рдмрд┐рд▓реНрдЯрд┐рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрд╡рд┐рдЪ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдпрд╛ рдЯрдЯреНрдЯреВ рдЬреИрд╕реЗ рдХреБрдЫ рдирд╛рдо рднреА рдЧреНрд░реЛрд╡реА рд╣реЛрдВред

@j7b , @ianlancetaylor рдиреЗ https://github.com/golang/go/issues/19412#issuecomment -323256891 рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛

рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рддрд╛рд░реНрдХрд┐рдХ рдкрд░рд┐рдгрд╛рдо https://github.com/golang/go/issues/19412#issuecomment -325048452 рдкрд░ рд╣реЛрдВрдЧреЗ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрддрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗред

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

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдХрд░реАрдм рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд┐рдЯ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЬрд╝реВрдо рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ

рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред

рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИрдВ, рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╡реЗ рдЕрд▓рдЧ рд╣реЛрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрддрдирд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдЬрд┐рддрдирд╛ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рджреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ (рдЬреИрд╕реЗ io.Reader / io.Writer ) рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдШ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдХрд┐ рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ interface{} рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди io.Reader рдпрд╛ io.Writer рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрджрд┐ рдпрд╣ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓рд╛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддрдм рддрдХ рдЖрдк рдПрдХ рдЕрд╕рдВрдмрджреНрдз рд╕рдВрдШ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧрддрд╛ рд╣реИред

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

@jimmyfrasche type T switch {io.Reader,io.Writer} рд▓рд┐рдП рдЯреА рдХреЛ рд░реАрдбрд╡рд╛рдЗрдЯрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯреА рдПрдХ io.Reader рдпрд╛ Io.Writer рд╣реИ, рдЖрдкрдХреЛ io.Reader рдпрд╛ io.Writer рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рджрд╛рд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдПрдХ рд░реАрдбрд╡рд╛рдЗрдЯрд░, рдЬреЛ рдЗрд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рджрд╛рд╡рд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рд╕реНрд╡рд┐рдЪрдЯрд╛рдЗрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдФрд░, рджреВрд╕рд░реА рдУрд░, @ianlancetaylor рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛

type IR interface {
  Foo()
  Bar()
} restrict { A, B, C }

рдЬреЛ рддрдм рддрдХ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ рдЬрдм рддрдХ A , B , рдФрд░ C рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ Foo рдФрд░ Bar рддрд░реАрдХреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЛ рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рд╣реЛрдЧреА рд▓рдЧрднрдЧ nil рдорд╛рди)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрдЯреИрд▓рд┐рдХ рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг

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

//MyGroup can be any of these. It can contain other groups, interfaces, structs, or primitive types
type MyGroup group {
   MyOtherGroup
   MyInterface
   MyStruct
   int
   string
   //..possibly some other types as well
}

//type definitions..
type MyInterface interface{}
type MyStruct struct{}
//etc..

func DoWork(item MyGroup) {
   switch t:=item.(type) {
      //do work here..
   }
}

рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ interface{} рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рд▓рд╛рдн рд╣реИрдВ:

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

рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ interface{} рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдЬреНрдЮрд╛рдд рд╣реЛред рд░рдирдЯрд╛рдЗрдо рд╕рддреНрдпрд╛рдкрди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЬрдм рд╕рдВрдХрд▓рди рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рдФрд░ рдЬреНрдЮрд╛рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП?

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

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

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

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

    • рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, type Communique_Union interface { isCommunique_Union() } )
    • рд╕рдВрдШ рдореЗрдВ рдЕрдиреБрдордд рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЧреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд░реИрдкрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрдордд рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, type Communique_Number struct { Number int32 } ) рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ isCommunique_Union рд╡рд┐рдзрд┐ рд╣реИред
    • рдпрд╣ рднреА рдЧреИрд░-рдирд┐рд╖реНрдкрд╛рджрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░реИрдкрд░ рдЖрд╡рдВрдЯрди рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВред рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдорджрдж рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдореВрд▓реНрдп (рдПрдХ рдЯреБрдХрдбрд╝рд╛) 24B рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

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

рдЖрдкрдХрд╛ рдорддрд▓рдм рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдбрдореА рдЕрдирдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб рдореЗрдердб рдЬреЛрдбрд╝рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ?

type MyInterface interface {
   belongToMyInterface() //dummy method definition
}

type MyObject struct{}
func (MyObject) belongToMyInterface(){} //dummy method

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

_dummy method_ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБред
  • рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ _group_ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбрдореА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛)ред рдпрд╣ рдЧрд▓рдд рд╣реИ (рдЕрдЧрд▓рд╛ рдмрд┐рдВрджреБ рджреЗрдЦреЗрдВ)ред
  • рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрдЬрд╛рдп _domain_ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕рдореВрд╣реАрдХрд░рдг) рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ ред рдбреЛрдореЗрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрдмрдВрдз рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рд▓реЗрдЦрд╛рдХрд╛рд░ рд╕рдореВрд╣ рдПрдХ рдЧреЛрджрд╛рдо рдкреНрд░рдмрдВрдзрдХ рд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдореВрд╣рди рд╡рд╕реНрддреБ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рди рдХрд┐ рд╕реНрд╡рдпрдВ рд╡рд╕реНрддреБ рд╕реЗред рд╡рд╕реНрддреБ рдХреЛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдХрд┐рд╕реА рдЪрд╛рд▓рд╛рди рдХреЛ рд▓реЗрдЦрд╛рдВрдХрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрдирд╡реЙрдЗрд╕ рдХреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ _(рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирдИ рдбрдореА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛)_ рд╣рд░ рдмрд╛рд░ рд▓реЗрдЦрд╛рдВрдХрди рдирд┐рдпрдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ _(рдЬреИрд╕реЗред рдирдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдореВрд╣рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛)_? _dummy method_ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдбреЛрдореЗрди рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдбреЛрдореЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдзрд╛рд░рдгрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ interface{} рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рднреА рдмрджрддрд░ рд╣реИред рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

@ рд╣реЗрдирд░реАрд╕

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

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

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

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

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

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

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

[1] рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рдВрднрд╡ рд╣реИ , рдЬреИрд╕реЗ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

type Node interface {
    node()
}

type Foo struct {
    bar.Baz
}

func (foo) node() {}

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

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

рдореИрдВ рдЖрдкрдХреЗ рджреВрд╕рд░реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред

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

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

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

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


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

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

рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓:

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

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

database/sql/driver.Value рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ #23077 рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
https://godoc.corp.google.com/pkg/database/sql/driver#Value

рд╣рд╛рд▓рд╛рдВрдХрд┐, database/sql.Rows.Scan рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдХрдореА рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕реНрдХреИрди рдЙрди рдорд╛рдиреЛрдВ рдореЗрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, int ; рдЕрдкрдиреЗ рдЧрдВрддрд╡реНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
https://godoc.corp.google.com/pkg/database/sql#Rows.Scan

@рдореЗрд░реЛрд╡рд┐рдпрд╕

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

рдХрдо рд╕реЗ рдХрдо рджреЛ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдмрдВрдж рд░рдХрдо рдХреА "рдХрдард┐рди рд╡рд┐рдХрд╕рд┐рдд" рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред

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

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

database/sql/driver.Value рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╕рд╣рдордд, рдЙрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ред рдзрдиреНрдпрд╡рд╛рдж :)

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

рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рдзрд╛рдиред

@Merovius рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрдирдВрдд-рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкрд░рд┐рд╡рд╛рд░ рд╣реИред рд╕рднреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░, рдЕрдирдВрдд рдпрд╛ рдЕрдиреНрдпрдерд╛, рдПрдХ default: рдорд╛рдорд▓рд╛ рд╣реИред рдкрд░рд┐рдорд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, default: рдЕрд░реНрде рд╣реИ рдпрд╛ рддреЛ рдПрдХ рд╡реИрдз рдорд╛рдорд▓рд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ рдпрд╛ рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХрд╣реАрдВ рдПрдХ рдмрдЧ рд╣реИ - рд╕реАрдорд┐рдд рд░рдХрдо рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЗрд╡рд▓ рдкреВрд░реНрд╡ рд╣реИ рдФрд░ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдХрднреА рдирд╣реАрдВред

json.Token рдФрд░ sql.Null* рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред go/types рдЙрд╕реА рддрд░рд╣ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ рдЬреИрд╕реЗ go/ast рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдРрд╕реЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдбреЛрдореЗрди рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдХреЗ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдирд▓рд╕рд╛рдЬреА рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧ рднреА рд╣реЛрддреЗ рд╣реИрдВред

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

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

json.Token рдФрд░ sql.Null* рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

рдЯреЛрдХрди - рдЬрд╝рд░реВрд░ред рдПрдПрд╕рдЯреА-рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг (рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд╛рд░реНрд╕рд░ рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ)ред

рдореБрдЭреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд▓рд┐рдП рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдирд▓ *, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ (рдпрд╛ рдХреБрдЫ "рдЬрд╛рджреБрдИ" рдЬреЗрдиреЗрд░рд┐рдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрд┐рд▓рд┐рди рдЬреЛрдбрд╝рдиреЗ рд╕реЗ), рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ type NullBool enum { Invalid struct{}; Value Int } рдФрд░ type NullBool struct { Valid bool; Value Int } рдмреАрдЪ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред

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

рдКрдкрд░ рджреЗрдЦреЛред рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЦреБрд▓реА рд░рдХрдо рдХрд╣рддрд╛ рд╣реВрдВ, рдореИрдВ рдЙрдирдХрд╛ рдХрдо рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВред

рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЦреБрд▓реА рд░рдХрдо рдХрд╣рддрд╛ рд╣реВрдВ, рдореИрдВ рдЙрдирдХрд╛ рдХрдо рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВред

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

рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рддреНрдпрд╛рд░реЗ рдРрдк рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬреЗрдиреЗрд░рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ a

type Nullable(T) pick { // or whatever syntax (on all counts)
  Null struct{}
  Value T
}

рдПрдХ рдмрд╛рд░ рдФрд░ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рднреА рдмрддрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрддреНрдкрд╛рдж (рд╕рдВрд░рдЪрдирд╛) рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Valid = false, Value != 0 рдХреА рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рд╣реИред рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЗрд╕реЗ рд░реВрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ 2 T рдЫреЛрдЯрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ 1 + T рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рди рд╣реЛред

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

рдЯреЛрдХрди - рдЬрд╝рд░реВрд░ред рдПрдПрд╕рдЯреА-рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг (рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд╛рд░реНрд╕рд░ рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ)ред

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

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

рдЧреЛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЬрдЧрд╣ рдЬрд╣рд╛рдВ рдореИрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЪреИрдирд▓реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдкрд░ рдЪрдпрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЧреЛрд░рдЖрдЙрдЯрд┐рди рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдПрдХ рдЧреЛрд░реМрдЯрд╛рдЗрди рдХреЛ 3 рдЪрд╛рди рдФрд░ рджреВрд╕рд░реЗ рдХреЛ 2 рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдореБрдЭреЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ chan pick { a A; b B; c C } рд╕реЗ рдЕрдзрд┐рдХ chan A , chan B , chan C рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ chan stuct { kind MsgKind; a A; b B; c C } рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рдХрдо рд╕рддреНрдпрд╛рдкрди рдХреА рдХреАрдордд рдкрд░ рдЪреБрдЯрдХреА рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВред

рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдореМрдЬреВрджрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рд╕реВрдЪреА рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

func main() {
    if FlipCoin() == false {
        printCertainTypes(FlipCoin(), int(5))
    } else {
        printCertainTypes(FlipCoin(), string("5"))
    }
}
// this function compiles with main
func printCertainTypes(flip bool, in interface{}) {
    if flip == false {
        switch v := in.(type) {
        case int:
            fmt.Printf(тАЬinteger %v\nтАЭ, v)
        default:
            fmt.Println(v)
        }
    } else {
        switch v := in.(type) {
        case int:
            fmt.Printf(тАЬinteger %v\nтАЭ, v)
        case string:
            fmt.Printf(тАЬstring %v\nтАЭ, v)
        }
    }
}
// this function compiles with main
func printCertainTypes(flip bool, in interface{}) {
    switch v := in.(type) {
    case int:
        fmt.Printf(тАЬinteger %v\nтАЭ, v)   
    case bool:
        fmt.Printf(тАЬbool %v\nтАЭ, v)
    }
    fmt.Println(flip)
    switch v := in.(type) {
    case string:
        fmt.Printf(тАЬstring %v\nтАЭ, v)
    case bool:
        fmt.Printf(тАЬbool 2 %v\nтАЭ, v)
    }
}
// this function emits a type switch not complete error when compiled with main
func printCertainTypes(flip bool, in interface{}) {
    if flip == false {
        switch v := in.(type) {
        case int:
            fmt.Printf(тАЬinteger %v\nтАЭ, v)
        case bool:
            fmt.Printf(тАЬbool %v\nтАЭ, v)
        }
    } else {
        switch v := in.(type) {
        case string:
            fmt.Printf(тАЬstring %v\nтАЭ, v)
        case bool:
            fmt.Printf(тАЬbool %v\nтАЭ, v)
        }
    }
}
// this function emits a type switch not complete error when compiled with main
func printCertainTypes(flip bool, in interface{}) {
    fmt.Println(flip)
    switch v := in.(type) {
    case int:
        fmt.Printf(тАЬinteger %v\nтАЭ, v)
    case bool:
        fmt.Printf(тАЬbool %v\nтАЭ, v)
    }
}

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

рдорд╛рдирдХ рд╕рд╛рдзрди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд, рдХреБрдЫ рднреА рди рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╣реИред

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

type Sum interface { sum() }
type sum struct{}
func (sum) sum() {}

рдФрд░ рдмрд╕ рдЙрд╕ 0-рдЪреМрдбрд╝рд╛рдИ рд╡рд╛рд▓реЗ рдЯреИрдЧ рдХреЛ рд╣рдорд╛рд░реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВред

рд╣рдо рдПрдХ рд░реИрдкрд░ рдкреЗрд╢ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдпреЛрдЧ рдореЗрдВ рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ

type External struct {
  sum
  *pkg.SomeType
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЯрдкрдЯрд╛ рд╣реИред

рдпрджрд┐ рдпреЛрдЧ рдореЗрдВ рд╕рднреА рд╕рджрд╕реНрдп рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

import "p"
var member struct {
  p.Sum
}

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

рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ func рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдпреЛрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ valid() error рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рдХреА рд╣реИ

func valid(s Sum) error {
  switch s.(type) {
  case nil:
    return errors.New("pkg: Sum must be non-nil")
  case A, B, C, ...: // listing each valid member
    return s.valid()
  }
  return fmt.Errorf("pkg: %T is not a valid member of Sum")
}

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

type alwaysValid struct{}
func (alwaysValid) valid() error { return nil }

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

//A Node is one of (list of types).
type Node interface { node() }

рд▓рд┐рдЦреЛ

//A Node is only valid if it is defined in this package.
type Node interface { 
  //Node is a dummy method that signifies that a type is a Node.
  Node()
}

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

рдпрд╣ рдкреИрдЯрд░реНрди рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдпреЛрдЧ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╣рд╛рд░рд╛ interface{} рд╡рд╛рдкрд╕ рдЧрд┐рд░рдирд╛ рд╣реИ, рдЬреИрд╕реЗ json.Token рдпрд╛ driver.Value ред рд╣рдо рдкрд┐рдЫрд▓реЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рдереЗ рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдпрд╣ interface{} рдЬрд┐рддрдирд╛ рдХрд╣рддрд╛ рд╣реИ,

//Sum is one of int64, float64, or bool.
type Sum interface{}
func New(v interface{}) (Sum, error) {
  switch v.(type) {
  case nil:
    return errors.New("pkg: Sum must be non-nil")
  case int64, float64, bool:
     return v
  }
  return fmt.Printf("pkg: %T is not a valid member of Sum")
}

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

*T рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк nil рд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рдорд╛рди рдирд╣реАрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ (рд╕рдВрднрд╡рддрдГ) рд╢реВрдиреНрдп рдорд╛рди рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рд╕реВрдЪрдХ рдХреЛ рдбреАрд░реЗрдлрд╝реЗрдВрд╕ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред

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

рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ sql рдкреИрдХреЗрдЬ рд╕реЗ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

type OptionalT struct {
  Valid bool
  Value T
}

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

рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкрд╣рдЪрд╛рди рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдореВрд▓реНрдп: рдЧрдгрдирд╛ред

рдЧреЛ рдореЗрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реИ const/iota:

type Enum int
const (
  A Enum = iota
  B
  C
)

OptionalT рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпреЛрдЧ рдХреА рддрд░рд╣, рдпрд╣ рдбреЛрдореЗрди рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдХреЗрд╡рд▓ рддреАрди рдорд╛рдиреНрдп рдорд╛рди рдФрд░ рдХрдИ рдЕрдорд╛рдиреНрдп рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдареАрдХ рджреЛ рдорд╛рди рд╣реИрдВ рддреЛ рд╣рдо рдмреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореМрд▓рд┐рдХ рд╕рдВрдЦреНрдпрд╛-рдиреЗрд╕ рдХрд╛ рдореБрджреНрджрд╛ рднреА рд╣реИред A+B == C ред рд╣рдо рдЯрд╛рдЗрдк рди рдХрд┐рдП рдЧрдП рдЕрднрд┐рдиреНрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реЗ рдмрд╣реБрдд рд╕реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдЪрд╛рд╣реЗ рдХреБрдЫ рднреА рд╣реЛред рдереЛрдбрд╝реЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХреЗ рд╕рд╛рде, рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рдЪрд╛рди рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type Enum struct { v int }
var (
  A = Enum{0}
  B = Enum{1}
  C = Enum{2}
)

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

func A() Enum { return Enum{0} }
func B() Enum { return Enum{1} }
func C() Enum { return Enum{2} }

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпреЛрдЧ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдмрд╛рд╣рд░реА рдХреЛрдб рдХреЗрд╡рд▓ A() , B() , рдпрд╛ C() ред рд╡реЗ var рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ рд▓реЗрдмрд▓ рдХреЛ рд╕реНрд╡реИрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ A() + B() рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо Enum рдкрд░ рдЬреЛ рднреА рддрд░реАрдХреЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдореЗрдВ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдореВрд▓реНрдп рдмрдирд╛рдиреЗ рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд╣рд▓рд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдпрд╣ рдорд╛рдиреНрдп рд╣реИ .

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

type Value struct {
  Which int // could have consts for A, B, C, D, E, F
  String string
  Int int
}

рдпрд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП OptionalT рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмреВрд▓ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреА рдПрдХ рдЧрдгрдирд╛ рд╣реИ рдФрд░ рдРрд╕реЗ рдХрдИ рдлрд╝реАрд▓реНрдб рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ Which рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЗрдЯ (рдпрд╛ рдирд╣реАрдВ) рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпреЗ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ (рдпрд╛ рдирд╣реАрдВ) рд╣реИрдВред

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

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

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

рдХреНрдпреЛрдВ? рдПрдХ рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдореБрдЭреЗ "рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛" рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдордЬрдмреВрддреА рд╕реЗ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рдПрдХ io.Reader , рдЬрд┐рд╕рдХреА Read рд╡рд┐рдзрд┐ рдЖрддрдВрдХрд┐рдд рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рд╕реЗ рдЙрдмрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдмрд╕ рдЗрд╕реЗ рдШрдмрд░рд╛рдиреЗ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕реА рддрд░рд╣, рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдШреЛрд╖рд┐рдд рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдорд╛рдиреНрдп рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рд╣рдЯ рдЬрд╛рддреЗ рд╣реИрдВ - рддреЛ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдмрд╣рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреМрди рд╣реВрдВ? рдпрд╛рдиреА рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ "рдореИрдВрдиреЗ рдПрдХ рдирдХрд▓реА рдмрдВрдж рд░рд╛рд╢рд┐ рдХреЛ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рд╣реИ" рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╢рд╛рдпрдж рд╣реА рдХрднреА (рдпрджрд┐ рдХрднреА рд╣реЛ) рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдЖрддреА рд╣реИред

рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ type Sum interface { sum() Sum } рдмрджрд▓рдХрд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рд╕реНрд╡рдпрдВ рд╣реА рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЖрдк рдХреЗрд╡рд▓ sum() рдХреА рд╡рд╛рдкрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рддрд╣рдд рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

рдпрд╣ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред

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

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИред рд╢реВрдиреНрдп рдорд╛рди рдЬрд╛рджреБрдИ рдирд╣реАрдВ рд╣реИрдВред sql.NullInt64{false,0} рдФрд░ NullInt64{false,42} рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, IMOред рджреЛрдиреЛрдВ SQL NULL рдХреЗ рдорд╛рдиреНрдп рдФрд░ рд╕рдордХрдХреНрд╖ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИрдВред рдпрджрд┐ рд╕рднреА рдХреЛрдб Value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Valid рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред

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

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореМрд▓рд┐рдХ рд╕рдВрдЦреНрдпрд╛-рдиреЗрд╕ рдХрд╛ рдореБрджреНрджрд╛ рднреА рд╣реИред A+B == C. рд╣рдо рдЯрд╛рдЗрдк рди рдХрд┐рдП рдЧрдП рдЕрднрд┐рдиреНрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЪрд┐рдВрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдИ рд╣реИ?

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

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

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

рдорд╛рдирдХ рд╕рд╛рдзрди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд, рдХреБрдЫ рднреА рди рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╣реИред

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

рджреВрд╕рд░реА рдУрд░, рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛:

func foo(val string|int|error) {
    switch v:= val.(type) {
    case string:
        ...
    }
}

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

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

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

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

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

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

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

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

@рдореЗрд░реЛрд╡рд┐рдпрд╕

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

рдореИрдВ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдпрд╛ рдХрднреА рдирд╣реАрдВ рдХреЗ рд░реВрдк рдореЗрдВ

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

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

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

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

рдЧреЛрдбреЛрдХ -рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ ^C рдХреЛ рд╣рд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдореЗрд░реЗ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдкрд░ 40 рдорд┐рдирдЯ рддрдХ рдЪрд▓рд╛ рдФрд░ рдЗрд╕реЗ рд╣рд░ рдмрд╛рд░ рдХрд┐рд╕реА рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ #20131 (рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рдХрд╛рдВрдЯрд╛ рдЧрдпрд╛ рд╣реИ!)

рдРрд╕рд╛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ type Sum interface { sum() Sum } рдмрджрд▓рдХрд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рд╕реНрд╡рдпрдВ рд╣реА рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЖрдк рдХреЗрд╡рд▓ sum() рдХреА рд╡рд╛рдкрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рддрд╣рдд рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрдо рд╕рддреНрдпрд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ [рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ] рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЪрд┐рдВрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрдИ рд╣реИ?

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

рдХреНрдпрд╛ [рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирдЯрд╛рдЗрдкреНрдб рдЗрдВрдЯреАрдЧреНрд░рд▓ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ] рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЪрд┐рдВрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрдИ рд╣реИ?

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

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИред рд╢реВрдиреНрдп рдорд╛рди рдЬрд╛рджреБрдИ рдирд╣реАрдВ рд╣реИрдВред рдЖрдИрдПрдордУ, sql.NullInt64{false,0} рдФрд░ NullInt64{false,42} рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рджреЛрдиреЛрдВ SQL NULL рдХреЗ рдорд╛рдиреНрдп рдФрд░ рд╕рдордХрдХреНрд╖ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИрдВред рдпрджрд┐ рд╕рднреА рдХреЛрдб Value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Valid рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред

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

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

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

(рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдпрд╛ рд╕рд╣реА рд╢реВрдиреНрдп рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб v, _ := nullable.[Value] рдЬреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред)

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

рдЕрдиреНрдпрдерд╛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рджрдВрдб рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЧрд╡рд╛рд░рд╛ рдирд╣реАрдВред рдореЗрд░реЗ рд▓рд┐рдП, рдкрд╛рд╕ 10:41 AM, "рдЬреЛрд╢ рдмреНрд▓реЗрдЪрд░ рд╕реНрдирд╛рдЗрдбрд░" <
рд╕реВрдЪрдирд╛рдПрдВ@github.com> рдиреЗ рд▓рд┐рдЦрд╛:

рдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдк рдПрдкреА рдпрд╛ *рдкреА рдЖрдкрдХреЛ рдФрд░ рдЕрдзрд┐рдХ рджреЗрдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ
рдореЗрдореЛрд░реА рдЯреНрд░реЗрдбрдСрдлрд╝ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдгред

рд╕реНрдХреЗрд▓рд░ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рджреВрд╕рд░рд╛ рд╢рдмреНрдж a . рд╣реИ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рдмреНрдж рдХреЛ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛
рд╕реВрдЪрдХ; рджреЗрдЦреЗрдВ #8405 https://github.com/golang/go/issues/8405 for
рд╡рд┐рдЪрд╛рд░ - рд╡рд┐рдорд░реНрд╢ред рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдЪрд╛рд░ рд╕рдВрднрд╡рддрдГ a . рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ
рдкреНрд░рдХрд╛рд░ рдЪреБрдиреЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреА рдЕрдВрдд рдореЗрдВ рдЖрд╡рдВрдЯрди рдФрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
рд╡реИрд╕реЗ рднреА рдЧреИрд░-рд╕реНрдерд╛рдиреАрдпред

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

@urandom

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдбрдореА рд╡рд┐рдзрд┐ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХреЛрдИ рддреАрд╕рд░рд╛ рдкрдХреНрд╖ "рд╕рдо рдкреНрд░рдХрд╛рд░" рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

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

type X interface { x() X }
type IntX int
func (v IntX) x() X { return v }
type StringX string
func (v StringX) x() X { return v }
type StructX struct{
    Foo bool
    Bar int
}
func (v StructX) x() X { return v }

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

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

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

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

рдпрджрд┐ рд╡рд╣ func x рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдпрд╛ рддреЛ рдШрдмрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ [тАж]

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

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рдРрд╕рд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

  1. рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ
  2. рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдШрдмрд░рд╛рдПрдВ/рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ
  3. рдПрдореНрдмреЗрдбреЗрдб рдорд╛рди рдХреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдЬреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ" рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

3 рдореБрдЭреЗ 1 рдФрд░ 2 рдХрд╛ рдЕрдЬреАрдм рдорд┐рд╢реНрд░рдг рд▓рдЧрддрд╛ рд╣реИ: рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЦрд░реАрджрддрд╛ рд╣реИред

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

2 рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЛрдиреЛрдВ рдХреЛрдб рдХреЛ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдлрд┐рд╕рд▓рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рдЧрдбрд╝рдмрдбрд╝ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЧрд▓рдд рдХреНрдпреЛрдВ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдХреНрдпрд╛ рдореИрдВ рдкреИрдЯрд░реНрди рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рдпрд╛ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджрд░реНрд╢рди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@urandom рдореИрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рдРрд╕рд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧреБрдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╣реИ: рдЬрдм рд▓реЛрдЧ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо proto.Message рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде), рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдпрд╣ рдХреМрди рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ . (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдВрдШ рдпрд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡реЗ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред https://github.com/golang/protobuf/issues/364 рднреА рджреЗрдЦреЗрдВред)

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

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

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

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

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

рдПрдХ рддрдереНрдп рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЫрджреНрдо-рдпреЛрдЧ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдЫрджреНрдо-рдпреЛрдЧ "рдЗрди рдирд┐рдпрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ" рдЬреИрд╕реЗ json.Token рдпрд╛ driver.Value рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗ рдХреБрдЫ рдФрд░ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХрдо рдЬрдЧрд╣ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ interface{} рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛ рдЕрдорд╛рдиреНрдп рдорд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рднреА рдмрдирд╛ рджреЗрдЧрд╛

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ "рдЕрдорд╛рдиреНрдп рдореВрд▓реНрдп" рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рдХрдерди рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

@neild рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдерд╛

var v pick {
  None struct{}
  A struct { X int; Y *T}
  B int
}

рдЗрд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ

struct {
  activeField int //which of None (0), A (1), or B (2) is the current field
  theInt int // If None always 0
  thePtr *T // If None or B, always nil
}

рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд╕рд╛рде рдЖрдк thePtr рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА activeField 0 рдпрд╛ 2 рдерд╛ рдпрд╛ theInt рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рдереЗ, рднрд▓реЗ рд╣реА activeField 0 рдерд╛ред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЙрди рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░ рджреЗрдЧрд╛ рдЬреЛ рд╕рдВрдХрд▓рдХ рдмрдирд╛ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрд╕реА рддрд░рд╣ рдХреА рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдмрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рдЬреЛ рдЖрдЬ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ @bcmills рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рдорд╛рдгреБ рд╡рд┐рдХрд▓реНрдк рд╣реИред

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

var t time.Timer

t рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рди рд╣реИ; t.C рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, t.Stop рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдЧреА, рдЖрджрд┐ред рдХрд┐рд╕реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

@neild рд╣рд╛рдБ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдвреАрд▓рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реВрдВред

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

рдпреЛрдЧ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

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

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

func F(sum SumInterface) {
    switch v := sum {
    case Screwdriver:
             ...
    default:
           panic ("Someone implementing a new type which gets passed to F and causes a runtime panic 3 weeks into production")
    }
}

рддреЛ, рдореБрдЭреЗ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЖрдзрд╛рд░рд┐рдд рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдХрд░рдг рдХреЗ рд╕рд╛рде рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрджреНрджреЛрдВ рдХреЛ рдЯреЛрд▓рд┐рдВрдЧ рдФрд░/рдпрд╛ рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╡рд┐рдзрд┐ рд╣реИ, рддреЛ рд╕рднреА рд╕рдВрднрд╡ (рд╣рд╛рдВ, рдЬрд╛рдирдмреВрдЭрдХрд░ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдЗрд╕реА рддрд░рд╣, рдЖрдИрдУрдЯрд╛-рдЖрдзрд╛рд░рд┐рдд рдПрдирдо рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рдПрдХ рдПрдирдо рдПрдХ type Foo int рдлреЙрд░реНрдо рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд╕рдореНрдореЗрд▓рди рд╣реИ const ( FooA Foo = iota; FooB; FooC ) " рд╡реНрдпрд╛рдкрдХ рдФрд░ рд╕рдЯреАрдХ рдЙрдкрдХрд░рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдЙрдирдХреЗ рд▓рд┐рдП рднреАред

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

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

@Merovius рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рд╣реИред

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

рднрд▓реЗ рд╣реА, рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░реЗрдВред

рдЧреЛ рдореЗрдВ рд╕реНрдпреВрдбреЛрд╕рдо рдХреЗ рд╕рдмрд╕реЗ рдЖрдо рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ: (рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдШрдЯрдирд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ)

  • рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдПрдирдоред
  • рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ред
  • *T рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд▓рд┐рдП T
  • рдПрдХ рдПрдирдо рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрдм рдПрдирдо рдПрдХ рдмреВрд▓ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреНрдп рдлрд╝реАрд▓реНрдб рд╣реИ рддреЛ рдпрд╣ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ T )
  • interface{} рдЬреЛ рдХрд┐ рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреНрд░реИрдм рдмреИрдЧ рддрдХ рд╕реАрдорд┐рдд рд╣реИред

рдЙрди рд╕рднреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЧреИрд░-рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рджреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдХрдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рд░рд┐рдЯрд░реНрди рдХреЗ рдФрд░ рдХрд┐рд╕реА рднреА рд╕рджрд╕реНрдп рдкрд░ рдХреЛрдИ рдирд┐рдХрд╛рдп рдирд╣реАрдВ рдХреЗ рд╕рд╛рде рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╡рд┐рдзрд┐ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред Enums рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рд╡реЗ рдХреЗрд╡рд▓ Type = iota рдЗрд╕рд▓рд┐рдП рдЬрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдИрдУрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдЯреНрд░рд┐рдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

*T рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ T рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реВрдЪрдХ рд╕реЗ рднреЗрдж рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдХрдиреНрд╡реЗрдВрд╢рди type O = *T рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдирд╛рдо рдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред type O *T рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдХреЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рдУрд░ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рд╕реЗ рдЯреВрд▓рд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдПрдХ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВред (рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрднрд╡рддрдГ type Optional(T) *T рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдЗрдиреНрд╣реЗрдВ "рдЯреИрдЧрд┐рдВрдЧ" рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛)ред

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

type Which int
const (
  A Which = iota
  B
  C
)
type Sum struct {
  Which
  A struct{} // has to be included to line up with the value of Which
  B struct { X int; Y float64 }
  C struct { X int; Y int } 
}

рдЙрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ "2 рдлрд╝реАрд▓реНрдбреНрд╕, рдлрд░реНрд╕реНрдЯ рдЗрдЬ рдмреВрд▓" рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

interface{} рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдбрд╝рдкрдиреЗ рд╡рд╛рд▓реЗ рдмреИрдЧ рдХреЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП //gosum: int, float64, string, Foo рдЬреИрд╕реА рдЬрд╛рджреБрдИ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдирд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрдХреЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

package sum
type (
  Type struct{}
  Enum int
  OneOf interface{}
)

рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рд╡реЗ type MyEnum sum.Enum рдлреЙрд░реНрдо рдХреЗ рд╣реИрдВ, рддреЛ рдХреЗрд╡рд▓ рдПрдирдо рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ, рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдХреЛ рддрднреА рдкрд╣рдЪрд╛рдиреЗрдВ рдЬрдм рд╡реЗ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ sum.Type , рдФрд░ рдХреЗрд╡рд▓ interface{} рд╣рдбрд╝рдкрдиреЗ рд╡рд╛рд▓реЗ рдмреИрдЧ рдЬреИрд╕реЗ type GrabBag sum.OneOf рдкрд╣рдЪрд╛рдиреЗрдВ
рдкреЗрд╢реЗрд╡рд░реЛрдВ

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

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

рд╣рдо рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЯреВрд▓реАрдВрдЧ рдХреЛ рдЬрдирд░реЗрдЯрд┐рд╡ (рдЬреИрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧрд░) рдФрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг (рдЬреИрд╕реЗ рдЧреЛрд▓рд┐рдВрдЯ) рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреЛ "рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ" рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рдорд╛рдиреНрдп рдХрд░реЗред

Enums рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧрд░ рдЬреИрд╕реЗ рдФрд░ рдЯреВрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред https://github.com/golang/go/issues/19814#issuecomment -291002852 рдореЗрдВ рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЬрдирд░реЗрдЯрд┐рд╡ рдЯреВрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ рдЬреЛ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдорд╢реАрди рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд╣ рдареАрдХ рд╣реИред

рдореИрдВ рдЗрд╕ рд╕рдордп рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреА рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рд╣реИ?

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

  1. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ
  2. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИ (рдЬреЛ 1 рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░ рджреЗрдЧрд╛)

1 рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдФрд░ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ 2 рдХреЛ 100% рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛ рднреА рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдФрд░ рдЖрдк рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛрдб рдЗрд╕ рд▓рд┐рдЯрд░ рдХреЛ рд╡реИрд╕реЗ рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВред

2 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдХреЛрдб рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдпрд╛ рдкрд╣рдЪрд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдЬреЛ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реА рд╕рд░рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ func рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ "рдЖрдкрдиреЗ pkg.F(v) рд▓рд┐рдЦрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдорддрд▓рдм pkg.F(v.EmbeddedField)" рдпрд╛ "рдЖрдкрдиреЗ 2 рд╕реЗ pkg.F рдкрд╛рд╕ рдХрд┐рдпрд╛, pkg.B рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ"ред рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕реЗ "рдЖрдк рдХрд┐рд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХреНрд╕ рдЖрдк рдлрд╝реАрд▓реНрдб рдПрдл рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ ". рдпрд╣ рдЬреЛрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдорд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рджреВрд╕рд░реА рдмрдбрд╝реА рдмрд╛рдд рдЧреЛрдбреЛрдХ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред Godoc рдкрд╣рд▓реЗ рд╕реЗ рд╣реА const/iota рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ #20131 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрдпреВрдбреЛрд╕рдо рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧрд╛ред рд╕рдВрд░рдЪрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рд╕рд╛рде рд╣реА рдСрдл-рд▓рд╛рдЗрди рдЯреВрд▓тАФрд▓рд┐рдВрдЯрд░, рдХреЛрдб рдЬреЗрдирд░реЗрдЯрд░ рдЖрджрд┐ред

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

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

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

рддреЛ, рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдЬрд╛рдирдмреВрдЭрдХрд░ рдерд╛: рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

рднрд▓реЗ рд╣реА, рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░реЗрдВред

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

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

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

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

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

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

https://godoc.org/github.com/jimmyfrasche/closed

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

cmds/closed-exporer рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдЖрдпрд╛рдд рдкрде рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд╛рдП рдЧрдП рд╕рднреА рдмрдВрдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдЧрд╛ред

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

Enums рдХреЗ рд╕рд╛рде рдореИрдВ рджреВрд╕рд░реА рддрд░рдл рдЧрдпрд╛ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд░ рдЧреИрд░-рдмрд┐рдЯрд╕реЗрдЯ рдХреЙрдиреНрд╕ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ред рдореИрдВ рдЦреЛрдЬреЗ рдЧрдП рдмрд┐рдЯрд╕реЗрдЯ рдХреЛ рднреА рдмреЗрдирдХрд╛рдм рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ рдпрд╛ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдорд╛рд░реНрдХрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ stdlib рдореЗрдВ рд╣реИред

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

рдореБрдЭреЗ рдпрд╣ рдорджрджрдЧрд╛рд░ рд▓рдЧреЗрдЧрд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд╣реАрдВ рдереЗред

@Merovius рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВрдиреЗ рдПрдХ рд╕реВрдЪреА рдирд╣реАрдВ рд░рдЦреАред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ stdlib.sh (cmds/рдмрдВрдж-рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдореЗрдВ) рдЪрд▓рд╛рдХрд░ рдкрд╛рдпрд╛ред рдЕрдЧрд░ рдореИрдВ рдЕрдЧрд▓реА рдмрд╛рд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред

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

@jimmyfrasche рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рд░рдХрдо рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рд╡реЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ (рдпрд╛рдиреА рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛) рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕реНрдерд┐рд░ рд▓рд┐рдВрдЯрд░ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ "рд╕рднреА рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реИрдВ" - рдЗрд╕рд▓рд┐рдП рдЙрдирдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдирд╣реАрдВ рд╣реИ рдмрдВрдж рд░рдХрдо рдХреЗ рд░реВрдк рдореЗрдВред рд╣реИрдВ, OTOH, рд╡реЗ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрднреА рдХрднреА рдФрд░ рдПрдХ рдорд╛рдорд▓реЗ рдХреЛ рдЫреЛрдбрд╝, рд╢рд┐рдХрд╛рдпрдд рд╕рд╣реА рд╣реЛрдЧрд╛ - рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдВрдЯрд░ рдкрдХрдбрд╝ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреА рддрд░рд╣ рд╣реЛрдЧрд╛ред

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

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

рдореИрдВрдиреЗ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ; рд╕рд┐рд░реНрдл рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд╢рд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдПред

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

рдлрд╝рд░, 6, 2018 3:54 pm рдкрд░, "рдмреНрд░рд╛рдпрди Slesinsky" [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

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

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

рдореИрдВрдиреЗ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ; рдмрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд╢рд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП
рдЕрдиреБрд╕рдВрдзрд╛рдиред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/19412#issuecomment-363561070 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AGGWBz-L3t0YosVIJmYNyf2iQ-YgIXLGks5tSLv9gaJpZM4MTmSr
.

@skybrian рдпрд╣ рд░рд╛рд╢рд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдмрд╣реБрдд рд╣реА

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

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

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

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

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

рдпрд╣ рд╕рдЪ рд╣реИред

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

6 рдлрд░рд╡рд░реА, 2018 рдХреЛ рд╢рд╛рдо 6:15 рдмрдЬреЗ, "рдмреНрд░рд╛рдпрди рд╕реНрд▓реЗрд╕рд┐рдВрд╕реНрдХреА" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@DemiMarie https://github.com/demimarie рдЕрд╕реБрд░рдХреНрд╖рд┐рдд.рдкреЙрдЗрдВрдЯрд░ рдРрдк рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЗрдВрдЬрди, рдФрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдмрд┐рдирд╛ рдмрд┐рдЯреНрд╕ рдкреИрдХ рдХрд░рдиреЗ рдирд╣реАрдВ рджреЗрдЧрд╛
рдХреВрдбрд╝рд╛ рдЙрдард╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ред рд╕рдВрднрд╡ рд╣реЛрддрд╛ рддреЛ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛
рдкреЛрд░реНрдЯреЗрдмрд▓ред

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

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

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

рдореБрдЭреЗ @rogpeppe рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛рдлреА рдЖрдХрд░реНрд╖рдХ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ @griesemer рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдкрд╣рдЪрд╛рдиреЗ рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рднреЛрдВ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ: "рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд░рдЦрддрд╛ рд╣реИ
рдЗрд╕рдХреЗ рд╕рднреА рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ, рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░
рдирд╛рдо рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ред".

рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХреЗ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?

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

var x int|float64

рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

x += 5

рдпрд╣ рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:

switch i := x.(type) {
case int:
    x = i + 5
case float64:
    x = i + 5
}

рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрд╡рд┐рдЪ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

type Num int | float64
type StringOrNum string | Num 
var x StringOrNum

switch i := x.(type) {
case string:
    // Do string stuff.
case Num:
    // Would be nice if we could use i as a Num here.
}

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

var x int|float64

var x, y int | float64 рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЗрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдирд┐рдпрдо рд╣реИрдВ? рдХреМрди рд╕рд╛ рд╣рд╛рдирд┐рдкреВрд░реНрдг рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдХреНрдпреЛрдВ)? рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

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

рдФрд░ рднреА рдЕрдзрд┐рдХ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП:

var x, y, z int|string|rune
x = 42
y = 'a'
z = "b"
fmt.Println(x + y + z)
fmt.Println(x + z + y)
fmt.Println(y + x + z)
fmt.Println(y + z + x)
fmt.Println(z + x + y)
fmt.Println(z + y + x)

рд╕рднреА int , string рдФрд░ rune рдореЗрдВ рдПрдХ + рдСрдкрд░реЗрдЯрд░ рд╣реИ; рдЙрдкрд░реЛрдХреНрдд рдЫрдкрд╛рдИ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдФрд░ рд╕рдмрд╕реЗ рдмрдврд╝рдХрд░, рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреИрд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

var x, y int | float64 рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЗрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдирд┐рдпрдо рд╣реИрдВ? рдХреМрди рд╕рд╛ рд╣рд╛рдирд┐рдкреВрд░реНрдг рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдХреНрдпреЛрдВ)? рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

@Merovius рдХреЛрдИ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд░реВрдкрд╛рдВрддрд░рдг рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ x + y рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛:

z = int(x) + int(y)
z = float64(x) + float64(y)

рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдЖрдкрдХрд╛ xyz рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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

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

рд╕рднреА int, string рдФрд░ rune рдореЗрдВ рдПрдХ + рдСрдкрд░реЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИ; рдЙрдкрд░реЛрдХреНрдд рдЫрдкрд╛рдИ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдФрд░ рд╕рдмрд╕реЗ рдмрдврд╝рдХрд░, рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреИрд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

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

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

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╢реВрдиреНрдп рд╕реЗ рддреБрд▓рдирд╛ рд╣реИ:

var x []int | []string
fmt.Println(x == nil)  // Prints true
x = []string(nil)
fmt.Println(x == nil)  // Still prints true

рджреЛрдиреЛрдВ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп рд╕реЗ рддреБрд▓рдиреАрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╢реВрдиреНрдп рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдЕрдВрддрд░ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддрд┐ https://github.com/golang/go/issues/22729 рдПрдХ рдмреБрд░реА рдмрд╛рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ

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

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ, рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреЛ a) рдореЗрдВ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИрдВ рдпрд╛ b) рдЕрддреНрдпрдВрдд (рдФрд░ IMO рднреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ) рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реАрдорд┐рдд рд╣реЛрдВрдЧреА - рдЕрд░реНрдерд╛рддреН, рд╕рднреА рдСрдкрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ред

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

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

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

рдУрд╣ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛: рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдЖрдк рдХрднреА рднреА рдпрд╣ рддрдп

@Merovius рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд░рдЦрддрд╛ рд╣реИ
рдЗрд╕рдХреЗ рд╕рднреА рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛"ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдПрдХ рдЧреИрд░-рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред

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

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

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

var x int | float64
fmt.Println(x == "hello")  // compilation error?
x = 0.0
fmt.Println(x == 0) // true or false?  I vote true :-)

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

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

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

рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡реИрд╕рд╛ рд╣реА рд░рд╣реЗрдЧрд╛ рдЬреИрд╕рд╛ @rogpeppe . рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

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

fmt.Println(x == "hello") // compilation error?

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

рдЧреИрд░-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ X рдХрд╛ рдорд╛рди x рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ T рдХрд╛ рдорд╛рди t рддреБрд▓рдиреАрдп рд╣реИ рдЬрдм рдкреНрд░рдХрд╛рд░ X рдХреЗ рдорд╛рди рддреБрд▓рдиреАрдп рд╣реИрдВ рдФрд░ X T рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ рдпрджрд┐ t рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ X рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ t рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдорд╛рди x рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ .

fmt.Println(x == 0) // true or false? I vote true :-)

рдмрд╣реБрдзрд╛ рдЭреВрдард╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдорд╛рди

var x int|float64 = 0.0
y := 0
fmt.Println(x == y)

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

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

рд▓реЗрдХрд┐рди рджреЛрд╣рд░рд╛рдирд╛: рдореИрдВ рд░рдХрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

fmt.Println(x == "hello") // compilation error?

рдпрд╣ рд╕рдВрднрд╡рдд: рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

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

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

@Merovius рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреА рдмрд╛рддреЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЙрди рдкрд░ рдФрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ 0 рдкреНрд░рд╢реНрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

fmt.Println(x == 0) // true or false? I vote true :-)

рдмрд╣реБрдзрд╛ рдЭреВрдард╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдорд╛рди

var x int|float64 = 0.0
y := 0
fmt.Println(x == y)
рдПрдХ рд╕рдВрдХрд▓рди-рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ),

рдореБрдЭреЗ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рд╕рдореНрдореЛрд╣рдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ var x float64 = 0.0 рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлреНрд▓реЛрдЯ64 рд╕реЗ 0 рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдорд╛рдореВрд▓реА рдмрд┐рдВрджреБ: (рдП) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдлреНрд▓реЛрдЯ 64 (0) рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 0.0 int рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред (рдмреА) x == y рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдЭреВрдард╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред)

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

var x,y int|float64 = float64(0), 0
fmt.Println(x == y) // рдЭреВрдард╛

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

рдореБрдЭреЗ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рд╕рдореНрдореЛрд╣рдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ var x float64 = 0.0 рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ float64 рд╕реЗ 0 рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ float64(0) рд╕реЗ int(0) (рдпрд╛рдиреА var x float64 = 0.0 рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг) false , рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рд╣реИ рддреНрд░реБрдЯрд┐ (рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдареАрдХ рдпрд╣реА рдореЗрд░реА рдмрд╛рдд рд╣реИ ; рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рддрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

(рдП) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдлреНрд▓реЛрдЯ 64 (0) рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 0.0 int рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

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

(рдмреА) x==y рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдЭреВрдард╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред)

рдирд╣реАрдВ, рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдкрдиреЗ рдХрд╣рд╛ рд╣реИ, рдХрд┐ рдСрдкрд░реЗрд╢рди e1 == y , рдЬрд┐рд╕рдореЗрдВ e1 рдПрдХ рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧреАред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, x рдХрд╛ рдкреНрд░рдХрд╛рд░ int|float64 рдФрд░ y рдХрд╛ рдкреНрд░рдХрд╛рд░ int рдФрд░ рдпрд╣ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ float64 рдФрд░ int рддреБрд▓рдиреАрдп рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕ рд╢рд░реНрдд рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

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

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

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

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

рд╕реНрдпреВрдбреЛрдХреЛрдб рдореЗрдВ iotuils.WriteFile -рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░рд╡рд╛рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛

file = open(name, os.write)
if file is error
    return error("cannot open " + name + " writing: " + file.error)
if file.write(data) is error:
    return error("cannot write into " + name + " : " + file.error)
return ok

рдФрд░ рдпрд╣ Rust . рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

match open(name, os.write)
    file
        match file.write(data, os.write)
            err
                return error("cannot open " + name + " writing: " + err)
            ok
                return ok
    err
        return error("cannot write into " + name + " : " + err)

рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рд▓реЗрдХрд┐рди рдмрджрд╕реВрд░рдд рд╣реИред

рдФрд░ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡:

type result[T, Err] oneof {
    default T
    Error Err
}

рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ ( result[void, string] = !void )

file := os.Open(name, ...)
if !file {
    return result.Error("cannot open " + name + " writing: " + file.Error)
}
if res := file.Write(data); !res {
    return result.Error("cannot write into " + name + " : " + res.Error)
}
return ok

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

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

type Reference[T] oneof {
    default T
    nil
}
// Reference[T] = *T

рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИ

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

ferr := os.Open(name, ...)
if err(e) := ferr {           // conditional match and unpack, initializing e
  return fmt.Errorf("cannot open %v: %v", name, e)
}
ok(f) := ferr                  // unconditional match and unpack, initializing f
werr := f.Write(data)
...

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

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

@sirkon

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

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

рдПрдирдкреАрдбреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореВрд▓реНрдп рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЗрд╡рд▓ dereference рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди AFAICT рдХреБрдЫ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЙрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реВрдиреНрдп-рдореВрд▓реНрдп рдкрд░ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдШрдмрд░рд╛рдПрдЧрд╛)ред рдпрд╛рдиреА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ *p рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдиреНрдп рд╣реИ, p.T (рдпрд╛ рдпрд╣ p.default рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдорд╛рдиреНрдп рд╣реИ? рдпрд╣ рдмрддрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рд╣реИ ) рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

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

@рдореЗрд░реЛрд╡рд┐рдпрд╕

рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ Google рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ,

рдзрдиреНрдп рд╣реИрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕реАред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЗрд╡рд▓ dereference рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдлрд┐рд░

var written int64
...
res := os.Stdout.Write(data) // Write([]byte) -> Result[int64, string] тЙИ !int64
written += res // Will not compile as res is a packed result type
if !res {
    // we are living on non-default res branch thus the only choice left is the default
    return Result.Error(...)
}
written += res // is OK

@skybrian

ferr := os.Open(...)

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

@ рд╕рд┐рд░рдХреЛрди рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рд▓реЛрдЧреЛрдВ рд╕реЗ рдЖрдВрдЦреЛрдВ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЙрд╕ рдкрд░ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ред

рдЖрдЗрдП рд╣рдо рдЕрдкрдиреА рдмрд╛рддрдЪреАрдд рдХреЛ рд╕рднреНрдп рд░рдЦреЗрдВ, рдФрд░ рдЧреИрд░-рд░рдЪрдирд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдмрдЪреЗрдВред рд╣рдо рдЪреАрдЬреЛрдВ рдкрд░ рдЕрд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рд╕рдореНрдорд╛рдирдЬрдирдХ рдкреНрд░рд╡рдЪрди рдмрдирд╛рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред https://golang.org/conductред

рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ Google рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк Google рдкрд░ рдЙрд╕ рддрд░рд╣ рдХрд╛ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

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

@ рд╕рд┐рд░рдХреЛрди рд╡рд╣реА рдЖрдкрдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред рдПрдб-рд╣реЛрдорд┐рдирдо рдФрд░ рд╕рд╛рдорд╛рдЬрд┐рдХ рддрд░реНрдХ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕реАрдУрд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ "рд╕рд╛рдорд╛рдЬрд┐рдХ рддрд░реНрдХ" рдЕрдХреНрд╕рд░ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ: рд╕рдВрдХрд▓рдХ рджреЗрд╡ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ, рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрдирд░ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ, Google рд▓реЛрдЧ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдирд╣реАрдВ, рд╡реЗ рдирд╣реАрдВ рдХрд░рддреЗред рдХреЛрдИ рдмреМрджреНрдзрд┐рдХ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рд╕рд┐рд░реНрдл рдирд┐рд░реНрдгрдп рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реИред рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓реЗред

рдмрд╛рддрдЪреАрдд рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ (рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдкрдЯрд░реА рдкрд░ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд┐рдП @agnivade рдХреЛ рдзрдиреНрдпрд╡рд╛рдж)ред

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

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЕрдкрдиреЗ 2-рд╕реЗрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ:

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

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ _family_ рдирд┐рд░реНрдорд╛рдг рдХреА рддрд░рд╣ рдХреБрдЫ рдЬреЛрдбрд╝реЗрдВред

рд╡рд╛рдХреНрдп рд░рдЪрдирд╛

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type theFamilyName family {
    someType
    anotherType
}

рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:
FamilyType = "family" "{" { TypeName ";" } "}" .

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func Display(s family{string; fmt.Stringer}) { /* function body */ }

рдпрд╣реА рд╣реИ, рдПрдХ-рдкрдВрдХреНрддрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╢реВрдиреНрдп рд╣реИ, рдЬреИрд╕реЗ рд╢реВрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рдеред

(рд╣реБрдб рдХреЗ рддрд╣рдд рдкрд╛рд░рд┐рд╡рд╛рд░рд┐рдХ рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдкреАрдЫреЗ рдмреИрдареЗ рдПрдХ рдореВрд▓реНрдп рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред)

рддрд░реНрдХ

рд╣рдореЗрдВ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рд╣рдо рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдХреМрди рд╕реЗ рдкреНрд░рдХрд╛рд░ рдорд╛рдиреНрдп рд╣реИрдВред

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

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

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

рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг

sql.Rows.Scan рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

Scan converts columns read from the database into the following common Go types and special types provided by the sql package:
 *string
 *[]byte
 *int, *int8, *int16, *int32, *int64
 *uint, *uint8, *uint16, *uint32, *uint64
 *bool
 *float32, *float64
 *interface{}
 *RawBytes
 any type implementing Scanner (see Scanner docs)

рдФрд░ sql.Row.Scan рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ "рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрди рдХрд░реЗрдВ" рд╡рд╛рдХреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП _some рдЕрдиреНрдп function_ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ? рдпрд╣ рдЧреЛ-рдЬреИрд╕реА рдирд╣реАрдВ рд╣реИтАФрдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╡рд╛рдХреНрдп рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Rows.Scan *RawBytes рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди Row.Scan рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

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

рдЬрдм рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ- "рддреЛ рдЙрд╕ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ" - рдЖрдк рд▓рдЧрднрдЧ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрднреА-рдХрднреА рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреЛ, рдЕрдкрдиреЗ рдЖрдк рдХреА рддрд░рд╣, рд╕рд┐рд░реНрдл рдмрд╛рд╣рд░ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдПрдХ *RawBytes рдореЗрдВ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ Row.Scan рдХреЗрд╡рд▓ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж Row.Scan ( рдХрд╣ рд░рд╣рд╛ рд╣реИ "рдПрд╕рдХреНрдпреВрдПрд▓: рд░реЛ рдкрд░ рд░реЙрдмрд╛рдЗрдЯреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рд╕реНрдХреИрди")ред рдпрд╣ рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдРрд╕реА рдЧрд▓рддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

type Value family {
    *string
    *[]byte
    *int; *int8; *int16; *int32; *int64
    *uint; *uint8; *uint16; *uint32; *uint64
    *bool
    *float32; *float64
    *interface{}
    *RawBytes
    Scanner
}

рдЗрд╕ рддрд░рд╣, рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рджрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ Rows.Scan рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдХреЛ рдХрд┐рд╕реА рднреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА; Row.Scan рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдкрд░рд┐рд╡рд╛рд░ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдмрд╛рдд рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреИрд╕реЗ cloud.google.com/go/datastore.Property рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ interface{} рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдорд╛рди" рдлрд╝реАрд▓реНрдб рд╣реИ рдФрд░ рдЗрд╕ рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

// Value is the property value. The valid types are:
// - int64
// - bool
// - string
// - float64
// - *Key
// - time.Time
// - GeoPoint
// - []byte (up to 1 megabyte in length)
// - *Entity (representing a nested struct)
// Value can also be:
// - []interface{} where each element is one of the above types
// This set is smaller than the set of valid struct field types that the
// datastore can load and save. A Value's type must be explicitly on
// the list above; it is not sufficient for the underlying type to be
// on that list. For example, a Value of "type myInt64 int64" is
// invalid. Smaller-width integers and floats are also invalid. Again,
// this is more restrictive than the set of valid struct field types.
//
// A Value will have an opaque type when loading entities from an index,
// such as via a projection query. Load entities into a struct instead
// of a PropertyLoadSaver when using a projection query.
//
// A Value may also be the nil interface value; this is equivalent to
// Python's None but not directly representable by a Go struct. Loading
// a nil-valued property into a struct will set that field to the zero
// value.

рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

type PropertyVal family {
  int64
  bool
  string
  float64
  *Key
  time.Time
  GeoPoint
  []byte
  *Entity
  nil
  []int64; []bool; []string; []float64; []*Key; []time.Time; []GeoPoint; [][]byte; []*Entity
}

(рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рд╛рдл-рд╕реБрдерд░реЗ рджреЛ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)

json.Token рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдКрдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреА рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрдЧреА:

type Token family {
    Delim
    bool
    float64
    Number
    string
    nil
}

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ:
рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп sql.DB.Exec , рдпрд╛ sql.DB.Query , рдпрд╛ рдХреЛрдИ рднреА рдлрд╝рдВрдХреНрд╢рди рдЬреЛ interface{} рдПрдХ рд╡рд┐рд╡рд┐рдз рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реЗрдЯ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдПрдХ рд╕реНрд▓рд╛рдЗрд╕_, рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ []interface{} рд╕реЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╕рдордп "рд╕реНрдкреНрд░реЗрдб" рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдпрд╣ рдХрд╣рдирд╛ рдЧрд▓рдд рд╣реИ DB.Exec("some query with placeholders", emptyInterfaceSlice) ; рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ: DB.Exec("the query...", emptyInterfaceSlice...) рдЬрд╣рд╛рдВ emptyInterfaceSlice рдХрд╛ рдкреНрд░рдХрд╛рд░ []interface{} ред рдРрд╕реА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ Value рдХрд╛ рдПрдХ рднрд┐рдиреНрди рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд╣рд╛рдВ Value рдХреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ interface{} рдХреА рдЕрд╢реБрджреНрдзрд┐ рдХреЗ рдХрд╛рд░рдг _рдЕрд╕рд▓реА рдЧрд▓рддрд┐рдпрд╛рдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИрдВ_ред

var x int | float64 | string | rune
z = int(x) + int(y)
z = float64(x) + float64(y)

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ x рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ int() ред

рдореБрдЭреЗ family рд╣реЛрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рд╡рд╢ (constricted?) рд╣реЛрдЧрд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рд╣рд░ рд╕рдордп рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдорд┐рд▓рд╛рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реА рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ case ред

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рдиреЗ рд▓рдЧрд╛ рдЬреИрд╕реЗ

func foo() (..., error) 

рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред

рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЬреЛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реМрдЯрд╛рддреА рд╣реИрдВред рдХреБрдЫ рдХрд╛рд░реНрдп
рд╡рд╛рдкрд╕реА net.Addr рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрджрдирд╛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ net.Addr рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рдЖрдк
рдмрд╛рдж рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА net.Addr рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХрд╛
рдПрдкреАрдЖрдИ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рдХрд┐ рдпрд╣ OpError рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпреЛрдВ рди "рд╕рдВрдХрд▓рди рд╕рдордп" рдпреБрдХреНрддрд┐ рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдП?

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

 OpError is the error type usually returned by functions in the net package. It describes the operation, network type, and address of an error. 

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

err := blabla.(*OpError)

рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрдо рд╕реЗ рдХрдо *OpError | error рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ
рдРрд╕реА рддреНрд░реБрдЯрд┐ рдФрд░ рд╕рдВрдХрд▓рдХ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

BTW: рдХреНрдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрд░реВрдкрддрд╛ рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЕрднреА рддрдХ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдпрд╛ рдПрдХ 'рд╡рд┐рд╢реЗрд╖рддрд╛' рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдЕрд░реНрдерд╛рдд:

func calc(a < add(a, a) a >, b a) a {
   return add(a, b)
}

func drawWidgets(widgets []< widgets.draw() error >) error {
  for _, widgets := range widgets {
    err := widgets.draw()
    if err != nil {
      return err
    }
  }
  return nil
}

a < add(a, a) a рдЕрд░реНрде рд╣реИ "рдЬреЛ рдХреБрдЫ рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд╡рд╣рд╛рдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдРрдб (рдЯрд╛рдЗрдкрдСрдл рдП, рдЯрд╛рдЗрдкрдСрдл рдП) рдЯрд╛рдЗрдкрдСрдл рдП) рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП"ред < widgets.draw() error> рдЕрд░реНрде рд╣реИ рдХрд┐ "рдЬреЛ рднреА рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЙрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдбреНрд░рд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ"ред рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

func Sum(a []< add(a,a) a >) a {
  sum := a[0]
  for i := 1; i < len(a); i++ {
    sum = add(sum,a[i])
  }
  return sum
}

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд╛рд░рдВрдкрд░рд┐рдХ "рдЬреЗрдиреЗрд░рд┐рдХ" рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ)ред

рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рдЖрдк рдмрд╛рдж рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рддрд░рд╣ рдХреЗ net.Addr рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред .

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╛рдУ, рд╕рдВрд╕реНрдХрд░рдг subtyping рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдПрдХ func() *FooError рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ func() error рдЬрд╣рд╛рдВ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдВрддреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

func Foo() (FooVal, FooError) {
    // ...
}

func Bar(f FooVal) (BarVal, BarError) {
    // ...
}

func main() {
    foo, err := Foo()
    if err != nil {
        log.Fatal(err)
    }
    bar, err := Bar(foo) // Type error: Can not assign BarError to err (type FooError)
    if err != nil {
        log.Fatal(err)
    }
}

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

рд╕рд╛рде рд╣реА, рдЧреЛ рдХреЗ рдкрд╛рд╕ рд╡реИрд░рд┐рдПрдВрдЯ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк func() *FooError рдХреЛ func() рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдВрддреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

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

func main() {
    foo, err := Foo()
    if err != nil {
        log.Fatal(err)
    }
    bar, err := Bar(foo) // Type error: Can not assign BarError to err (type FooError)
    if err != nil {
        log.Fatal(err)
    }
}

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

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

var int i = 0;
i = "hi";

рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдЪрд░/рдШреЛрд╖рдгрд╛рдПрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдФрд░ i = "hi" рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП i рдкрд░ "рдЯрд╛рдЗрдк рд▓реБрдХрдЕрдк" рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рдХреНрдпрд╛ рдРрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореБрджреНрджреЗ рд╣реИрдВ рдЬреЛ func () *ConcreteError рдХреЛ func() error рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдХрд╛рд░рдг/рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХрд╛рд░рдг)? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛:

type MyFunc func() error

type A struct {
}

func (_ *A) Error() string { return "" }

func NewA() *A {
    return &A{}
}

func main() {
    var err error = &A{}
    fmt.Println(err.Error())
    var mf MyFunc = MyFunc(func() error { return NewA() }) // type checks fine
        //var mf MyFunc = MyFunc(NewA) // doesn't type check
    _ = mf
}

рдпрджрд┐ рдЖрдк func (a, b) c рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ func (x, y) z рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рддреЛ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ z c (рдФрд░ a , b рдХреЛ x , y рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп/рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде/рд╕рдВрдЧрдд рд╣реИ)ред рдмреЗрд╢рдХ, рдХреНрдпрд╛ рдпрд╣ рд░рдирдЯрд╛рдЗрдо/рд╕рдВрдХрд▓рди рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ ... рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╕рдЦреНрддреА рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЛ рджреЗрдЦрдХрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдХреНрдпреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ x рдХреЛ a рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ func () x рдХреЛ func () a рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдмреЗрд╢рдХ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рд░рдирдЯрд╛рдЗрдо рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛) рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрднрд╡ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред (рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЕрд╕рд▓реА рдХреНрд░реВрдХреНрд╕ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ)ред

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

рдореБрдЭреЗ рдРрд╕реА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдареАрдХ рд╣реИ, рдПрд╕реЛрд▓рдВрдЧреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░)

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

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡реИрд╕реЗ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐

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

рдХреНрдпрд╛ рдРрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореБрджреНрджреЗ рд╣реИрдВ рдЬреЛ func () *ConcreteError рдХреЛ func() error рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдХрд╛рд░рдг/рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХрд╛рд░рдг)?

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

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

funcs рддреБрд▓рдиреАрдп рдирд╣реАрдВ рд╣реИрдВред

рд╡реИрд╕реЗ рднреА, рдЯреАрдмреАрдПрдЪ, рдпрд╣ рд╕рдм рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рд╖рдп рд▓рдЧрддрд╛ рд╣реИ :)

рдПрдлрд╡рд╛рдИрдЖрдИ: рдореИрдВрдиреЗ рдЕрднреА рдпрд╣ рдХрд┐рдпрд╛ рд╣реИ ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред (# 19814 рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)

рдореБрдЭреЗ рдкрд╛рд░реНрдЯреА рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рднреА рдЧреЛ рдХреЗ 4 рд╕рд╛рд▓ рдмрд╛рдж рдЕрдкрдиреА рднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

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

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

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

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

рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛:

// Divide returns either a float64 or an arbitrary error
func Divide(dividend, divisor float64) float64 | error {
  if dividend == 0 {
    return errors.New("dividend is zero")
  }
  if divisor == 0 {
    return errors.New("divisor is zero")
  }
  return dividend / divisor
}

func main() {
  // type-switch statements enforce completeness:
  switch v := Divide(1, 0).(type) {
  case float64:
    log.Print("1/0 = ", v)
  case error:
    log.Print("1/0 = error: ", v)
  }

  // type-assertions, however, do not:
  divisionResult := Divide(3, 1)
  if v, ok := divisionResult.(float64); ok {
    log.Print("3/1 = ", v)
  }
  if v, ok := divisionResult.(error); ok {
    log.Print("3/1 = error: ", v.Error())
  }
  // yet they don't allow asserting types not included in the union:
  if v, ok := divisionResult.(string); ok { // compile-time error!
    log.Print("3/1 = string: ", v)
  }
}

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

рдмрд╣реБрдд рдмрд╛рд░ рдореИрдВрдиреЗ рд▓реЛрдЧреЛрдВ рдХреЛ _non-nil рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ nil value_ : https://play.golang.org/p/JzigZ2Q6E6F рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рджреЗрдЦрд╛ рд╣реИ ред рдЖрдо рддреМрд░ рдкрд░, рд▓реЛрдЧ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рдПрдХ error рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ nil , рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╢реВрдиреНрдп-рд╕рдХреНрд╖рдо рдмрдирд╛рдирд╛ рдПрдХ рдЧрд▓рддреА рдереАред

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

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

type CustomErr struct {}
func (err *CustomErr) Error() string { return "custom error" }

func CouldFail(foo int) error | nil {
  var err *customErr
  if foo > 10 {
    // you can't return a nil pointer as an interface value
    return err // this will panic!
  }
  // no error
  return nil
}

func main() {
  // assume no error
  if err, ok := CouldFail().(error); ok {
    log.Fatalf("it failed, Jim! %s", err)
  }
}

рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рд╢рд╛рдпрдж-рдкреНрд░рдХрд╛рд░ рд╡рд┐рдирд┐рдореЗрдп рдирд╣реАрдВ рд╣реИрдВред рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЦрд░рд╛рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:

// P returns a pointer to T, but it's not clear whether or not the pointer
// will always reference a T instance. It might be an optional T,
// but the documentation usually doesn't tell you.
func P() *T {}

// O returns either a pointer to T or nothing, this implies (but still doesn't guarantee)
// that the pointer is always expected to not be nil, in any other case nil is returned.
func O() *T | nil {}

рдлрд┐рд░ JSON рднреА рд╣реИред рдпрд╣ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб (рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝реАрд▓реНрдб рд╕рд╣рд┐рдд) JSON рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ JSON unmarshaller рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

type DataModel struct {
  // Optional needs to be type-checked before use
  // and is therefore allowed to no be included in the JSON document
  Optional string | nil `json:"optional,omitempty"`
  // Required won't ever be nil
  // If the JSON document doesn't include it then unmarshalling will return an error
  Required *T `json:"required"`
}

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

read = (s String) -> (Array<Byte> or Error) => match s {
  "A" then Error<NotFound>
  "B" then Error<AccessDenied>
  "C" then Error<MemoryLimitExceeded>
  else Array<Byte>("this is fine")
}

main = () -> ?Error => {
  // assume the result is a byte array
  // otherwise throw the error up the stack wrapped in a "type-assertion-failure" error
  r = read("D") as Array<Byte>
  log::print("data: %s", r)
}

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

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

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

  1. рдХреЗрд╡рд▓ рдЕрдиреБрдорддрд┐ рджреЗрдВ | "рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реА рдпреВрдирд┐рдпрдиреЛрдВ" рдХрд╛
    <any pointer type> | nil
    рдЬрд╣рд╛рдВ рдХреЛрдИ рднреА рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛: рдкреЙрдЗрдВрдЯрд░реНрд╕, рдлрд╝рдВрдХреНрд╢рдВрд╕, рдЪреИрдирд▓, рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдореИрдкреНрд╕ (рдЧреЛ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░)
  2. рдПрдХ рдирдВрдЧреЗ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП nil рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рд╢реВрдиреНрдп рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рдХрд╛рд░ <pointer type> | nil ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
var n *int       = nil // Does not compile, wrong type
var n *int | nil = nil // Ok!

var set map[string] bool       = nil // Does not compile
var set map[string] bool | nil = nil // Ok!

var myFunc func(int) err       = nil // Nope!
var myFunc func(int) err | nil = nil // All right.

рд╡реЗ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ:

  1. рдЖрдк рдПрдХ рдирдВрдЧреЗ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкреНрд░рд╛рд░рдВрднреАрдХреГрдд рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ | nil рд╡рд┐рднреЗрджрд┐рдд рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛
var maybeAString *string       // Wrong: invalid initial value
var maybeAString *string | nil // Good
  1. рдЖрдк рдПрдХ "рд╢реВрдиреНрдп" рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдВрдЧреЗ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл рдирд╣реАрдВ:
var value int = 42
var barePointer *int = &value          // Valid
var nilablePointer *int | nil = &value // Valid

nilablePointer = barePointer // Valid
barePointer = nilablePointer // Invalid: Incompatible types
  1. "рд╢реВрдиреНрдп" рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП, рдпрджрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ nilablePointer рд╕реЗ barePointer рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
switch val := nilablePointer.(type) {
  case *int:
    barePointer = val // Yeah! Types are compatible now. It is imposible that "val = nil"
  case nil:
    // Do what you need to do when nilablePointer is nil
}

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

  • рдП) рдХреЛрдИ рд╢реВрдиреНрдп рд╕реВрдЪрдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ ред рдареАрдХ рд╣реИ, рдХрднреА рднреА 4 рд╢рдмреНрджреЛрдВ рдХрд╛ рдЗрддрдирд╛ рдорддрд▓рдм рдирд╣реАрдВ рдерд╛ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рд╣реЛрддреА рд╣реИ: рдиреЛ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ _EVER_ рдХреЛ рдлрд┐рд░ рд╕реЗ nil pointer dereference рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА! рдореИрдВ
  • рдмреА) рдЖрдк "рдкреНрд░рджрд░реНрд╢рди рдмрдирд╛рдо рдЗрд░рд╛рджрд╛" рд╡реНрдпрд╛рдкрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
    рдЗрд╕рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдореИрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рди рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рд╢реВрдиреНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реЛ рдФрд░ рдЗрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗ . рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░ рджреЗрддрд╛ рд╣реВрдВред
  • рдЧ) рдХреЛрдИ рдФрд░ рд╢реВрдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдирд╣реАрдВ! рд╣рд╛рдВ! рд╣рдо "рд╕реБрд░рдХреНрд╖рд┐рдд рд╢реВрдиреНрдп-рд╕реНрд▓рд╛рдЗрд╕" рдФрд░ "рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╢реВрдиреНрдп-рдорд╛рдирдЪрд┐рддреНрд░" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ (рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рддреЛ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдЧреА)ред рдПрдХ рдирдХреНрд╢рд╛ рдпрд╛ рддреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ map | nil рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

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

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

рдПрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдпрд╣ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рднреА рдкрд┐рдЫрдбрд╝рд╛ рдЕрд╕рдВрдЧрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ gofix рджреНрд╡рд╛рд░рд╛ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдмрд╕ рд╕рднреА рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ <pointer type> | nil рдмрджрд▓реЗрдВред

рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ? рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рд╢реВрдиреНрдп-рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рддреЗрдЬреА рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ ("рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ") рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рддрд░реАрдХрд╛ рд╣реИред

@alvaroloes

рдЖрдк рдПрдХ рдирдВрдЧреЗ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкреНрд░рд╛рд░рдВрднреАрдХреГрдд рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред

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

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

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

рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрд╡рд┐рдлреНрдЯ рдФрд░ рдЕрдиреНрдп рдХреА рддрд░рд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ/рдЧреИрд░-рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рд╕рднреА рд▓реЗрдХрд┐рди:

  1. рдЗрд╕рд╕реЗ рд╡рд╣рд╛рдВ рд╣рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛рдлреА рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рдХреНрд╕ рдЧреЛрдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рд░ рдЪреАрдЬ рдХреЛ <pointer type> | nil рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
  2. рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╕рд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЛ рдЗрди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рд┐рдлреНрдЯ рдХреЛ рд▓реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ - рдЧрд╛рд░реНрдб, рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрд╛рдзреНрдпрдХрд╛рд░реА, рд╡реИрдХрд▓реНрдкрд┐рдХ рдЪреЗрдирд┐рдВрдЧ, рд╢реВрдиреНрдп рдХреЛрд▓реЗрд╕рд┐рдВрдЧ рдЗрддреНрдпрд╛рджрд┐ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЧреЛ рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рдпреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмрд┐рдирд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдШрд░ рдХрд╛ рдХрд╛рдо рд╣реЛрдЧрд╛ред

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

рдКрдкрд░ рджреЗрдЦреЛред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЬреЛ рд╕рд╕реНрддреА рджрд┐рдЦрддреА рд╣реИрдВ, рдЙрдирдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╣реА рдЧреИрд░-рддреБрдЪреНрдЫ рд▓рд╛рдЧрддреЗрдВ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИрдВред

рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдЧреЛ рдХреЛ рдмрджрд▓рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд░рд╣реЗрдЧрд╛

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

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

рдЖрд╣! рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рдерд╛ред рджреЛрд╣! "рд╕рд░рд▓" рд╢рдмреНрдж рдХреЗ рдЬрдЯрд┐рд▓ рдЕрд░реНрде рд╣реИрдВред рдареАрдХ рд╣реИ, рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ "рд╕рд░рд▓" рд╢рдмреНрдж рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

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

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

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

type S struct {
    n int
}
var s S 
s.n  // Fine

var s *S
s.n // runtime error

var f func(int)
f() // runtime error

рддреЛ рдХреНрдпрд╛ рд╣реБрдЖ рдЕрдЧрд░ рд╣рдо:

  • рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╢реВрдиреНрдп рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
  • рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ (рдЖрд▓рд╕реА рдкреНрд░рд╛рд░рдВрдн)ред

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

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

| рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ | рд╢реВрдиреНрдп рдорд╛рди | рдЧрддрд┐рд╢реАрд▓ рд╢реВрдиреНрдп рдорд╛рди | рдЯрд┐рдкреНрдкрдгреА |
| --- | --- | --- | --- |
| *рдЯреА | nil | рдирдпрд╛ (рдЯреА) |
| []рдЯреА | nil | []рдЯреА{} |
| рдирдХреНрд╢рд╛ [рдЯреА] рдпреВ | nil | рдирдХреНрд╢рд╛[рдЯреА]рдпреВ{} |
| func | nil | рдиреЛрдк | рддреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рд╢реВрдиреНрдп рдорд╛рди рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рдорд╛рди рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рд╕реВрдЪреА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ error , рддреЛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди "рдХреЛрдИ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ" рд╣реИ |
| chan T | nil | рдореЗрдХ (рдЪрд╛рди рдЯреА) |
| interface | nil | - | рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╣рд╛рдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд noop рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ |
| рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рд╕рдВрдШ | nil | рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рд╢реВрдиреНрдп рдорд╛рди | |

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

type S struct {
    n int
}
var s *S
if s == nil { // true. Nothing different happens here
...
}
s.n = 1       // At this moment the go runtime would check if it is nil, and if it is, 
              // do "s = new(S)". We could say the code would be replaced by:
/*
if s == nil {
    s = new(S)
}
s.n = 1
*/

// -------------
var pointers []*S = make([]*S, 100) // Everything as usual
for _,p := range pointers {
    p.n = 1 // This is translated to:
    /*
        if p == nil {
            p = new(S)
        }
        p.n = 1
    */
}

// ------------
type I interface {
    Add(string) (int, error)
}

var i I
n, err := i.Add("yup!") // This method returns 0, and the default error "Noop"
if err != nil { // This condition is true and the error is returned
    return err
}

рдореИрдВ рд╢рд╛рдпрдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореБрдЦреНрдп рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢реВрдиреНрдп-рдЪреЗрдХ тАЛтАЛрдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдХрд╣реВрдВрдЧрд╛:

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

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

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

рд╡рд╛рдкрд╕ рдорд╛рдорд▓реЗ рдкрд░: рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╢реВрдиреНрдп рдорд╛рди рд╣реИред

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

рддреЛ рдХреНрдпрд╛ рд╣реБрдЖ рдЕрдЧрд░ рд╣рдо:

  • рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╢реВрдиреНрдп рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
  • рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ (рдЖрд▓рд╕реА рдкреНрд░рд╛рд░рдВрдн)ред

рдпрджрд┐ рдЖрдк рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ

func F(p *T) {
    *p = 42 // same as if p == nil { p = new(T) } *p = 42
}

func G() {
    var p *T
    F(p)
    fmt.Println(p == nil) // Has to be true, as F can't modify p. But now F is silently misbehaving
}

рдпрд╣ рдЪрд░реНрдЪрд╛ рд╕рдм рдХреБрдЫ рд╣реИ рд▓реЗрдХрд┐рди рдирдИ рд╣реИред рдРрд╕реЗ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╡реЗ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ :)

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

рдпрд╣ (рдФрд░ new(T) ) рдХреЛ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ T рдорд╛рди рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ make([]T, 0, 100) рдФрд░ рдлрд┐рд░ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП append рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмрдбрд╝рд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛ ( v[:0][:100] ) рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред [10]T рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд╕рдВрднрд╡ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐ рдХрд┐рд╕реА рд╕рд░рдгреА рд╕реВрдЪрдХ рдореЗрдВ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдореБрдЦрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреА)ред рдФрд░ рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред

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

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

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

рдпрджрд┐ рдЖрдк рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ (...)

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

// Augmenting your example with more comments:
func FCurrentGo(p *T) {
    // Here "p" is just a value, which happens to be a pointer type. Doing...
    *p = 42
    // ...without checking first for "nil" is the recipe for hiding a bug that will crash the entire program, 
    // which is exactly what is happening in current Go code bases

    // The correct code would be:
    if p == nil {
        // panic or return error
    }
    *p = 42
}

func FWithDynamicZero(p *T) {
    // Here, again, p is just a value of a pointer type. Doing...
    *p = 42
    // would allocate a new T and assign 42. It is true that this doesn't have any effect on the "outside
    // world", which could be considered "incorrect" because you expected the function to do that.
    // If you really want to be sure "p" is pointing to something valid in the "outside world", then
    // check that:
    if p == nil {
        // panic or return error
    }
    *p = 42
}

func main() {
    var p *T
    FCurrentGo(p) // This will crash the program
        FWithDynamicZero(p) // This won't have any effect on "p". This is expected because "p" is not pointing
                            // to anything. No crash here.
    fmt.Println(p == nil) // It is true, as expected
}

рдЧреИрд░-рд╕реВрдЪрдХ рд░рд┐рд╕реАрд╡рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реЛ рд░рд╣реА рд╣реИ, рдФрд░ рдпрд╣ рдирдП рдЖрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рд╕рдордЭ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ):

type Point struct {
    x, y int
}

func (p Point) SetXY(x, y int) {
    p.x = x
    p.y = y
}

func main() {
    p := Point{x: 1, y: 2}
    p.SetXY(24, 42)

    pointerToP := &Point{x: 1, y: 2}
    pointerToP.SetXY(24, 42)

    fmt.Println(p, pointerToP) // Will print "{1 2} &{1 2}", which could confuse at first
}

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛:

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

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

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

рдиреЛрдЯ 2: рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХреЗрд╡рд▓ "рд╢реВрдиреНрдп" рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рд╕рдВрдШреЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдмрдирд╛рдКрдВрдЧрд╛

рдареАрдХ рд╣реИ, рдореИрдВ рдпрд╣ рд╕рдордЭрддрд╛ рд╣реВрдБред рд╣рдореЗрдВ рдмрд╕ рджреВрд╕рд░реЗ рд▓реЛрдЧреЛрдВ рдХрд╛ рдирдЬрд░рд┐рдпрд╛ рднреА рджреЗрдЦрдирд╛ рд╣реИ (рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рдд рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ )

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

рдпрд╣ рд╡рд┐рдлрд▓рддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

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

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

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

рдЧреИрд░-рд╕реВрдЪрдХ рд░рд┐рд╕реАрд╡рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕реА рд╣реА рд╕реНрдерд┐рддрд┐ рд╣реЛ рд░рд╣реА рд╣реИ

рдореИрдВ рдпрд╣ рд╕рд╛рджреГрд╢реНрдп рдирд╣реАрдВ рдЦрд░реАрджрддрд╛ред рдЖрдИрдПрдордУ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ

func Foo(p *int) { *p = 42 }

func main() {
    var v int
    Foo(&v)
    if v != 42 { panic("") }
}

рд╕рд╣реА рдХреЛрдб рд╣реЛрдирд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ

func Foo(v int) { v = 42 }

func main( ){
    var v int
    Foo(v)
    if v != 42 { panic("") }
}

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

рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдПрдХ рд╣реА рд╣реИ: рдХреБрдЫ рднреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

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

// The correct code would be:
if p == nil {
    // panic or return error
}
*p = 42

рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рд╕рд╣реА рдирд╣реАрдВ рдорд╛рдирддрд╛ред nil -рдЪреЗрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ nil рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИред

рд▓реЗрдХрд┐рди, рдореЗрд░реЗ рд▓рд┐рдП, рдП) рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╣реИ (рдкреВрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ!)ред

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

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

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

рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ _"... рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░рдг рдЬреЛ рдЗрд╕реЗ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ..."_ рдЖрдкрдХреЗ рд╡рд╛рдХреНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ_"рдпрд╣ рдорд╛рдорд▓рд╛ рдХреА рдЬрдбрд╝ рд╣реИ"_ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЬрд┐рдХреНрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рд╢реВрдиреНрдп рдорд╛рди рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдмрд╛рдд рдереАред рддреЛ рдпрд╣ рдореЗрд░реА рдмреБрд░реА рдзрд╛рд░рдгрд╛ рдереАред

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

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

рдореИрдВ рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд╛рдХреНрдп _"рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ, рдкреВрд░реНрдг рд╡рд┐рд░рд╛рдо "_ред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ "рдкреВрд░реНрдг рд╡рд┐рд░рд╛рдо рд▓рд┐рдЦрдирд╛" рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ред рдореБрдЭреЗ рдЧрд▓рдд рдордд рд╕рдордЭреЛ! рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд╕реЛрдЪрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ: рдореБрдЭреЗ рдХреЛрдИ рд╣рдардзрд░реНрдорд┐рддрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрди рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

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

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

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

рдЗрд╕реЗ рдПрдХ рддрд░рдл рд░рдЦ рджреЗрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЦрддрд░рдирд╛рдХ рд╣реИ), рддреЛ, рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реЗрдгреА ( nil -рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдлрд▓рддрд╛рдУрдВ) рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рд╣реИред

рддреЛ рдЖрдЗрдП рдЗрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддреЗ рд░рд╣реЗрдВ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдЖрдкрдХреЗ рд╕рдордп рдФрд░ рдКрд░реНрдЬрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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

рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕:

type Type enum {
         Tuple (int,int),
         One int,
         None,
};

рдЖрдХрд╛рд░ рдХреЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдХрд╛рд░ ((int, int)) рд╣реЛрдЧрд╛ред
рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдирдП рдмрдирд╛рдП рдЧрдП рдореИрдЪ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдпрд╛ рдореМрдЬреВрджрд╛ рд╕реНрд╡рд┐рдЪ рдСрдкрд░реЗрдЯрд░ рдХреЗ рднреАрддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:

var a Type
switch (a) {
         case Tuple{(b,c)}:
                    //do something
         case One{b}:
                    //do something else
         case None:
                    //...
}

рдирд┐рд░реНрдорд╛рдг рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕:
var a Type = Type{One=12}
рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ рдПрдирдо рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рд╢реВрдиреНрдп рдореВрд▓реНрдп рд╕рдорд╕реНрдпрд╛ рдХрд╛ PS рд╕рдорд╛рдзрд╛рди рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордЭреМрддреЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпреЛрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпреЛрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж

рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рдореВрд▓реНрдп рдмрдирд╛рдирд╛ рдХреНрд╖реЗрддреНрд░ рдШреЛрд╖рдгрд╛ рдЖрджреЗрд╢ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрджрддрд░ рд╣реИред

рдХрд┐рд╕реА рдиреЗ рдбрд┐рдЬрд╛рдЗрди рдбреЙрдХ рд▓рд┐рдЦрд╛ рд╣реИ?

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реИ:
19412-рднреЗрджрднрд╛рд╡_рд╕рдВрдШ_рдФрд░_рдкреИрдЯрд░реНрди_рдорд┐рд▓рд╛рди.рдПрдордбреА.рдЬрд╝рд┐рдк

рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпреЛрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж

рдЕрдм рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЬреАрд░реЛ рд╡реИрд▓реНрдпреВ (рд╕рдорд╕реНрдпрд╛) рдкрд░ рд╕рдордЭреМрддрд╛ urandoms рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред

UPD: рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрджрд▓ рдЧрдпрд╛, рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ред

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

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

рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░):

type Task interface {
    task()
}

type SearchAdd struct {
    Ctx   context.Context
    ID    string
    Attrs Attributes
}

func (SearchAdd) task() {}

type SearchUpdate struct {
    Ctx         context.Context
    ID          string
    UpdateAttrs UpdateAttributes
}

func (SearchUpdate) task() {}

type SearchDelete struct {
    Ctx context.Context
    ID  string
}

func (SearchDelete) task() {}

рдФрд░ рддрдм

task := <- taskChannel

switch v := task.(type) {
case tasks.SearchAdd:
    resp, err := search.Add(task.Ctx, &search2.RequestAdd{тАж}
    if err != nil {
        log.Error().Err(err).Msg("blah-blah-blah")
    } else {
        if resp.GetCode() != search2.StatusCodeSuccess  {
            тАж
        } 
    }
case tasks.SearchUpdate:
    тАж
case tasks.SearchDelete:
    тАж
}

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

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

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ

type Task oneof {
    // SearchAdd holds a data for a new record in the search index
    SearchAdd {
        Ctx   context.Context
        ID    string
        Attrs Attributes   
    }

    // SearchUpdate update a record
    SearchUpdate struct {
        Ctx         context.Context
        ID          string
        UpdateAttrs UpdateAttributes
    }

    // SearchDelete delete a record
    SearchDelete struct {
        Ctx context.Context
        ID  string
    }
}

+

switch task {
case tasks.SearchAdd:
    // task is tasks.SearchAdd in this scope
case tasks.SearchUpdate:
case tasks.SearchDelete:
}

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

рдЖрдЙрдЪ, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдПред рдЗрд╕реЗ рдареАрдХ рдХрд░реЛред

рджреЛ рд╕рдВрд╕реНрдХрд░рдг, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░:

рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЧ рдкреНрд░рдХрд╛рд░

type Sum oneof {
    TтВБ TypeDeclтВБ
    TтВВ TypeDeclтВВ
    тАж
    TтВЩ TypeDeclтВЩ
}

рдЬрд╣рд╛рдВ TтВБ тАж TтВЩ Sum ( oneof рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕реНрддрд░ рдкрд░ рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ рдФрд░ Sum рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рдХреЗрд╡рд▓ TтВБ тАж TтВЩ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣рдорд╛рд░реЗ рдкрд╛рд╕ (type) рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ oneof рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрд╛рдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрдгрдирд╛

type Enum oneof {
    Value = iota
}

рдХреЙрдиреНрд╕ рдХреЗ iota рдХреЗ рд╕рдорд╛рди рд╣реА, рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдорд╛рдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ Enums рд╣реИрдВ рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

switch task {
case tasks.SearchAdd:
    // task is tasks.SearchAdd in this scope
case tasks.SearchUpdate:
case tasks.SearchDelete:
}

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ task рдЪрд░ рдХреЗ рдЕрд░реНрде рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

```go
switch task {
case tasks.SearchAdd:
    // task is tasks.SearchAdd in this scope
case tasks.SearchUpdate:
case tasks.SearchDelete:
}

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд╛рд░реНрдп рдЪрд░ рдХреЗ рдЕрд░реНрде рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред
```

рдлрд┐рд░ рдЕрдкрдиреЗ рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрднрдХрд╛рдордирд╛рдПрдБред

@sirkon рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

switch task {
case Task.SearchAdd:
    // task is Task.SearchAdd in this scope
case Task.SearchUpdate:
case Task.SearchDelete:
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ Task рд▓рд┐рдП рдиреЛ-рд╡реИрд▓реНрдпреВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

var task Task

рдХреНрдпрд╛ рдпрд╣ nil ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ switch рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд case nil ?
рдпрд╛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рддрдм рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛ рдХреНрд░рдо рдЙрд╕ рддрд░рд╣ рд╕реЗ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ enums рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдареАрдХ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ switch task.(type) рдмрд░рд╛рдмрд░ рд╣реИ рд▓реЗрдХрд┐рди рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╣реИ рдирд╛? рдЬреИрд╕рд╛ рдХрд┐ .. рдпрджрд┐ рдЖрдк рдПрдХ рдорд╛рдорд▓реЗ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ред рдФрд░ default рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╡рд╣ рд╕рд╣реА рд╣реИ?

рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдиреЛ-рд╡реИрд▓реНрдпреВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

var task Task

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдпрд╣ рдЧреЛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдиреАрд▓ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реЛрдЧрд╛ред

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

рд╣рд╛ рд╕рд╣реА рд╣реИред

рдФрд░ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╡рд╣ рд╕рд╣реА рд╣реИ?

рдирд╣реАрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рддред

рдкреАрдПрд╕ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ @ianlancetaylor рдФрд░ рдЕрдиреНрдп рдЧреЛ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реВрдиреНрдпрддрд╛ рдЙрдиреНрд╣реЗрдВ рдХрд╛рдлреА рдПрдирдкреАрдбреА-рдкреНрд░рд╡рдг рдмрдирд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдХрд╛ рд╢реВрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд░ рдпрд╣ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИред рдореИрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ case nil рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдПрдХ if task != nil рдкрд╣рд▓реЗ рдХрд░рдирд╛ рднреА рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ:|

рдХреНрдпрд╛ рдЗрд╕рдХреА рднреА рдЗрдЬрд╛рдЬрдд рд╣реЛрдЧреА?

type Foo oneof {
  A = 3
  B = "3"
  C = 3.0
  D = struct { E bool }{ true }
}

рдХреНрдпрд╛ рдЗрд╕рдХреА рднреА рдЗрдЬрд╛рдЬрдд рд╣реЛрдЧреА?

type Foo oneof {
  A = 3
  B = "3"
  C = 3.0
  D = struct { E bool }{ true }
}

рдЦреИрд░, рддрдм рдХреЛрдИ рд╕реНрдерд┐рд░рд╛рдВрдХ рдирд╣реАрдВ, рдХреЗрд╡рд▓

type Foo oneof {
    A <type reference>
}

рдпрд╛

type Foo oneof {
    A = iota
    B
    C
}

рдпрд╛

type Foo oneof {
    A = 1
    B = 2
    C = 3
}

рдЖрдИрдУрдЯрд╛ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдХреЛрдИ рд╕рдВрдпреЛрдЬрди рдирд╣реАрдВред рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди, рдЙрдиреНрд╣реЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

рд╡реИрд╕реЗ рднреАред рдмрд╕ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

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

func addOne(x int|float64) int|float64 {
    switch x := x.(type) {
    case int:
        return x + 1
    case float64:
         return x + 1
    }
}

рдмрди рдЬрд╛рдПрдЧрд╛:

contract intOrFloat64(T) {
    T int, float64
}

func addOne(type T intOrFloat64) (x T) T {
    return x + 1
}

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдпрджрд┐ рдЬреЗрдирд░рд┐рдХ рдЕрдВрддрддрдГ рдЙрддрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЕрдм рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рдВрджрд┐рдЧреНрдз рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн рдЧреЛ рдЬреИрд╕реА рд╕рд░рд▓ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрддреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдВрдЧреЗред

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

type intOrFloat64 interface{ type int, float64 }    

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

рдореБрдЭреЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИред рдпрджрд┐ RHS рдкрд░ рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдПрдХ рдЯрд╛рдЗрдк рди рдХрд┐рдП рдЧрдП рдЕрдХреНрд╖рд░ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдорд┐рд▓рд╛рди рдирд╣реАрдВ рдерд╛ рддреЛ рдпрд╣ рдмрд╕ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрдЧрд╛:

var v1 intOrFloat64 = 1        // compiles, dynamic type int
var v2 intOrFloat64 = 1.0      // compiles, dynamic type float64
var v3 intOrFloat64 = 1 + 2i   // doesn't compile, complex128 is not a specified type

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

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

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

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

@alanfo , @Merovius рдХреНрдпреВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж; рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдмрджрд▓ рд░рд╣реА рд╣реИ:

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

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

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

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

@ рдЧреНрд░рд┐рд╕реЗрдорд░

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

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

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

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

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

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

@griesemer рдХреБрдЫ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реИрдВред

  1. рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред
    рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ

    type C2(type T C1) interface { ... }
    

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

  2. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
    рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦрдиреЗ рджреЗрдирд╛ рд╣реЛрдЧрд╛:

    type C3(type U C1) interface(T) {
        Add(T) T
    }
    

    рдЬрд╣рд╛рдВ T рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

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

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

contract (T) indenticalTo(U) {
    *T *U
}

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

рдЪреВрдВрдХрд┐ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рд╣реА рд╣реИ, рдЗрд╕ рдмрд╛рдзрд╛ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ T рд╕рдорд╛рди рд╣реИ U ред рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк (identicalTo(int)), (identicalTo(uint)), ... рдХреЛ рдПрдХ рдмрд╛рдзрд╛ рд╡рд┐рдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

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

contract Foo(T, U) {
    T U, int64
}

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

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

рдпрджрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ:

рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ

рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ :)

рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░

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

рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░

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

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

  1. рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

  2. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ _ рдкрд╣рд▓реЗ рд╣реА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рд╣рдо рдпрд╣рд╛рдВ рдкреАрдЫреЗ рдирд╣реАрдВ рд╣рдЯрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ)ред

  3. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рд╕реНрд╡рддрдВрддреНрд░ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

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

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

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

рд╕рдВрднрд╡рддрдГ, comparable рдЕрдм рдЕрдиреБрдмрдВрдз рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрди рд╕рдХрддрд╛ рд╣реИред

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

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

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

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

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

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

interface Foo(T) {
    const type T, int64  // 'const' indicates types are exact i.e. no derived types
}

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

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

@urandom

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

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

@alanfo

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

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

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

@stevenblenkinsop

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рдЙрдкрдпреЛрдЧ-рд╕рд╛рдЗрдЯ рдкрд░ рдЯрд╛рдЗрдк-рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╣реИред рдЕрд░реНрдерд╛рдд

type Adder(type T) interface {
    Add(t T) T
}

func Sum(type T Adder(T)) (vs []T) T {
    var t T
    for _, v := range vs {
        t = t.Add(v)
    }
    return t
}

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

рдЖрдкрдХрд╛ 1. рдФрд░ 3. рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛, рдореБрдЭреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдХреБрдЫ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛ред


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

```go
switch task {
case tasks.SearchAdd:
    // task is tasks.SearchAdd in this scope
case tasks.SearchUpdate:
case tasks.SearchDelete:
}

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

рдлрд┐рд░ рдЕрдкрдиреЗ рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрднрдХрд╛рдордирд╛рдПрдБред

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

@Merovius рдкреБрди: "рдореЗрд░реЗ рд▓рд┐рдП, рдПрдХ рдЧреНрд░рд╛рдл рдПрдХ рдЗрдХрд╛рдИ рд╣реИ"

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

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

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

interface{} рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рднреА рдЬрдЧрд╣ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдХрдореА рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди | рдСрдкрд░реЗрдЯрд░ рдХреА рдирд┐рд░рдВрддрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:

type foobar union {
    int
    float64
}

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

рдЬреИрд╕реЗ рдореБрджреНрджреЗ: рдЖрд╣ рдЖрдкрдиреЗ ecdsa.PrivateKey рдмрдЬрд╛рдп *ecdsa.PrivateKey - рдпрд╣рд╛рдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ ecdsa.PrivateKey рд╕рдорд░реНрдерд┐рдд рд╣реИред рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реБрдЭрд╛рд╡ int|float64 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ _space_ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб-рдмреЗрд╕ рдХреЛ рдмрд╣реБрдд рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд░рдЦрдирд╛ред

interface{} рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рднреА рдЬрдЧрд╣ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдХрдореА рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди | рдСрдкрд░реЗрдЯрд░ рдХреА рдирд┐рд░рдВрддрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:

type foobar union {
    int
    float64
}

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

рдЬреИрд╕реЗ рдореБрджреНрджреЗ: рдЖрд╣ рдЖрдкрдиреЗ ecdsa.PrivateKey рдмрдЬрд╛рдп *ecdsa.PrivateKey - рдпрд╣рд╛рдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ ecdsa.PrivateKey рд╕рдорд░реНрдерд┐рдд рд╣реИред рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реБрдЭрд╛рд╡ int|float64 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ _space_ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб-рдмреЗрд╕ рдХреЛ рдмрд╣реБрдд рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд░рдЦрдирд╛ред

рдпрд╣ рджреЗрдЦреЗрдВ (рдЯрд┐рдкреНрдкрдгреА) , рдпрд╣ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред

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

рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди, рдЖрдкрдХреА рд╕рдВрдЧрддрддрд╛ рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдЖрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдПред

рд▓реЗрдХрд┐рди рдпрд╣ рдУрд╡рд░рдХрд┐рд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рд╕рд╛рде рд╣реА, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ nil рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕реЗ рд╣рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВ nil рдХреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
-- рдШреЛрд╖рдгрд╛

type U enum{
    A(int64),
    B(string),
}

-- рдореЗрд▓ рдорд┐рд▓рд╛рдирд╛

...
var a U
...
switch a {
    case A{b}:
         //process b here
    case B{b}:
         //...
    case nil:
         //...
}
...

рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ - рдКрдкрд░ рд╕рд┐рд░рдХреЙрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдЦреЗрдВред

рд╕рд╛рде рд╣реА, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ nil рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕реЗ рд╣рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВ nil рдХреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЧреИрд░-рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рдЗрд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╛рдиреА

type U enum {
  None
  A(string)
  B(uint64)
}
...
var a U.None
...
switch a {
  case U.None: ...
  case U.A(str): ...
  case U.B(i): ...
}

рд╕рд╛рде рд╣реА, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ nil рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕реЗ рд╣рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВ nil рдХреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЧреИрд░-рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рдЗрд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╛рдиреА

рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ nil рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕реЗ рд╣рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВ nil рдХреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЧреИрд░-рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рдЗрд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╛рдиреА

рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

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

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

рдореИрдВ рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдкрд╕реЗ рд╕рд╣рдордд рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╛рдж, рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдЖрд░рдХреНрд╖рд┐рдд рдирд╛рдо рдкрд╣рд▓реЗ рдХреБрдЫ рдХреЛрдбрдмреЗрд╕ (рд╕рдВрдШ, рдПрдирдо, рдЖрджрд┐) рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рджрд╛рдпрд┐рддреНрд╡ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рджрд░реНрджрдирд╛рдХ рд╣реЛрдЧрд╛ред

рдпрд╣ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ Go2.0 . рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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

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

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

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

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

рдЕрдм, html/template.contentType рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕рд╛рджрд╛ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝реЙрд▓рдмреИрдХ рд╣реИред рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдпреЛрдЧ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рд╣рдореЗрд╢рд╛ рдирд╛рдорд┐рдд рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реЛрдЧрд╛, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдорд╛рди рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╣реВрдВ рдЬрд╣рд╛рдВ рдмреАрдЬрдЧрдгрд┐рдд/рднрд┐рдиреНрди/рдпреЛрдЧ/рдЬреЛ рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

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

рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕реЗ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдСрдкреНрд╕)ред

рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

type EntityOp oneof {
    Insert   Reference
    NewState string
    Delete   struct{}
}

рд╡рд┐рдзрд┐ рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ

type DB interface {
    тАж
    Capture(ctx context.Context, processID string, ops map[string]EntityOp) (bool, error)
}

рдпреЛрдЧ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЙрдкрдпреЛрдЧ рдПрдПрд╕рдЯреА рдореЗрдВ рдиреЛрдбреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рд╣реИред рдПрдХ рдФрд░ nil рдХреЛ option рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдкрд░ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

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

var name: "Peter" | "Consuela"; // string type with compile-time constraint

рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдирдо рдХреА рддрд░рд╣ рд╣реИ, рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдПрдирдо рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

@рдореЗрд░реЛрд╡рд┐рдпрд╕
рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ JSON рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЬрдВрдЧ рдореЗрдВ рдЗрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдПрдирдо рд╡реИрд▓реНрдпреВ {
рд╢реВрдиреНрдп,
рдмреВрд▓ (рдмреВрд▓),
рд╕рдВрдЦреНрдпрд╛ (рд╕рдВрдЦреНрдпрд╛),
рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╕реНрдЯреНрд░рд┐рдВрдЧ),
рдРрд░реЗ(Vec),
рд╡рд╕реНрддреБ(рдорд╛рдирдЪрд┐рддреНрд░),
}

рджреЛ рдлрд╛рдпрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░:

  1. рдХреЛрдб рдХрд╛ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг
  2. рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдпрд╛ go vet рдЕрдиреБрдорддрд┐ рджреЗрдирд╛
    (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд┐рдЪ рдЬрд╣рд╛рдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ)

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ Go1 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде:

type Token = int | float64 | string

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

var tok Token

switch t := tok.(type) {
case int:
    // do something
}

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

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

рд╣рдо рдирд┐рд╣рд┐рдд рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХреА рд░рд╛рд╣ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдЬреИрд╕реЗ interface{} рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЧреМрд░рд╡рд╢рд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ vet рдЪреЗрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ?

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

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЬрд╛рдВрдЪ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛ рд╕рдХреЗ?

https://github.com/BurntSushi/go-sumtype

рд▓реЗрдЖрдЙрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдШ рд╕реЗ рдЯреИрдЧ рдмрд┐рдЯреНрд╕ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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

go-sumtype рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рджреЛ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ?

рд╕рдВрдХрд▓рдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

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

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рджреЛ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ?

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

@skybrian IIRC рд╡рд░реНрддрдорд╛рди рдмрд┐рдЯрдореИрдк рдЬреЛ рдЯрд╛рдЗрдк рд▓реЗрдЖрдЙрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдкреНрд░рддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдРрд╕реА рдЪреАрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдЫрд▓рд╛рдВрдЧ рд▓рдЧреЗрдЧреА, рдФрд░ рд╣рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ GC рд░реВрдЯ рдмрдирд╛ рджреЗрдЧрд╛ред

рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ (рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП) рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдФрд░ рдЧреИрд░-рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ

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

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

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

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

рдХреНрдпрд╛ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ

type FooType int | float64

func AddOne(foo FooType) FooType {
    return foo + 1
}

// if this can be done, what happens here?
type FooType nil | int
func AddOne(foo FooType) FooType {
    return foo + 1
}

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

type FooType interface{}

func AddOne(foo FooType) (FooType, error) {
    switch v := foo.(type) {
        case int:
              return v + 1, nil
        case float64:
              return v + 1.0, nil
    }

    return nil, fmt.Errorf("invalid type %T", foo)
}

// versus
type FooType int | float64

func AddOne(foo FooType) FooType {
    switch v := foo.(type) {
        case int:
              return v + 1
        case float64:
              return v + 1.0
    }

    // assumes the compiler knows that there is no other type is 
    // valid and thus this should always returns a value
    // Would the compiler error out on incomplete switch types?
}

@xibz

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

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

const a = "1" // string "1"
const b = a + 5 // string "15" and not number 6

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдлрд╛рдпрджреЗ рдЦреБрдж рдмрддрд╛рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?
рдореИрдВ

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

// Would the compiler error out on incomplete switch types?

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

@xibz рднреА рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдмрдирд╛рдо рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЬреЗрдиреЗрд░рд┐рдХ рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ, рдореЗрд░реЗ рдорд░рдиреЗ рд╕реЗ рдПрдХ рджрд┐рди рдкрд╣рд▓реЗред

@xibz

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

рдЖрдк рдЙрд╕ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рд╕рджрд╕реНрдп рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛ int | float64 рд▓реЗрддреЗ рд╣реБрдП, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛:

var x int|float64 = int(2)
var y int|float64 = float64(0.5)
fmt.Println(x * y)

рдХреНрдпрд╛ рдпрд╣ int рд╕реЗ float64 рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд░реЗрдЧрд╛? рдпрд╛ float64 рд╕реЗ int ред рдпрд╛ рдпрд╣ рдШрдмрд░рд╛рдПрдЧрд╛?

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

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

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

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

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

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

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

@stouf

рд╣рдореЗрд╢рд╛ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп "рдХрд╛рд╕реНрдЯрд┐рдВрдЧ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ

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


рдЙрд╕ рд╕рдм рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓реАрдирд░ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП 100% рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рд▓реБрдХ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

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

рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рджреНрд╡рд┐рдШрд╛рдд рд╕рдореАрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

match Add(Add(Mult(Const(a), Power(Var(x), 2)), Mult(Const(b), Var(x))), Const(c)) {
  // here a, b, c are bound to the constants and x is bound to the variable name.
  // x must have been the same in both var expressions or it wouldn't match.
}

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рддрдирд╛ рдЖрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

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

рдЪреВрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдмрд╣реБрдд рдХрдо рдЙрдореНрдореАрдж рд╣реИ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдорд╛рдирдХ рдЯрд┐рдкреНрдкрдгреА рдирд┐рд░реНрджреЗрд╢, рдЬреИрд╕реЗ //go:union A | B | C рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдФрд░ рд╕рдорд░реНрдерд┐рдд рд╣реИ go vet ред

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

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

рдорд╕реМрджреЗ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

type Foo interface { 
     int64, int32, int, uint, uint32, uint64
}

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

рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рднреАрддрд░ рдЗрди рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реЛрдЧрд╛ред

рдпрд╣ рдЖрджрд░реНрд╢ рд▓рдШреБ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг: Foo | int32 | []Bar ), рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рд╣реИред

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

рдорд╕реМрджреЗ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

type Foo interface { 
     int64, int32, int, uint, uint32, uint64
}

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

рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рднреАрддрд░ рдЗрди рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реЛрдЧрд╛ред

рдпрд╣ рдЖрджрд░реНрд╢ рд▓рдШреБ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг: Foo | int32 | []Bar ), рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рд╣реИред

рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди: https://github.com/golang/go/issues/19412#issuecomment -520306000

type foobar union {
  int
  float
}

@mathieudevos рд╡рд╛рд╣, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрд╛рдлреА рдкрд╕рдВрдж рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП, рдирд╡реАрдирддрдо рдЬреЗрдирд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╡рд┐рд╖рдорддрд╛ ( рдХреЗрд╡рд▓ рд╢реЗрд╖ рд╡рд┐рд╖рдорддрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ) рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рд╣реИред рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рдлрд┐рдЯ рдирд╣реАрдВ

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

// Ordinary interface
type Stringer interface {
    String() string
}

// Type union
type Foobar union {
    int
    float
}

// Equivalent to an interface with a type list
type FoobarStringer interface {
    Stringer
    Foobar
}

// Unions can intersect
type SuperFoo union {
    Foobar
    int
}

// Doesn't compile since these unions can't intersect
type Strange interface {
    Foobar
    union {
        int
        string
    }
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╕ рдЗрд╕ рд╕реАрдПрд▓ рдХреЛ рджреЗрдЦрд╛: https://github.com/golang/go/commit/af48c2e84b52f99d30e4787b1b8d527b5cd2ab64

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

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

рдореИрдВрдиреЗ рд╡рд░реНрддрдорд╛рди рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #41716 рдЦреЛрд▓рд╛ рд╣реИред

рдореИрдВ рд╕рд┐рд░реНрдл рдмреАрдЬрдЧрдгрд┐рддреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @henryas рдХрд╛ рдПрдХ рдкреБрд░рд╛рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
https://github.com/golang/go/issues/21154
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, @mvdan рджреНрд╡рд╛рд░рд╛ рдЙрд╕реА рджрд┐рди рдХрд╛рдо рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реА рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ gh рдЦрд╛рддреЗ рдкрд░ рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЙрд╕ рдЖрджрдореА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #21154 рдкрд╕рдВрдж рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдмрд╛рдд рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП @mvdan рдХреА) рдЯрд┐рдкреНрдкрдгреА рдЗрд╕реЗ

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

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдбреЗрдирд┐рдпрд▓ рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЗрд╕ рдПрдХ рдХреЗ рдбреБрдкреНрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ @andig рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреБрдЫ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ #21154 рдХреЗ рдкрд╛рда рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдБ, рдпрд╣ рдареАрдХ рдЙрд╕реА рдмрд╛рдд рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдбреЗрдирд┐рдпрд▓ рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЗрд╕ рдПрдХ рдХреЗ рдбреБрдкреНрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ @andig рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреБрдЫ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ #21154 рдХреЗ рдкрд╛рда рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдБ, рдпрд╣ рдареАрдХ рдЙрд╕реА рдмрд╛рдд рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рдХрд░ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рд╣реВрдВред рдореИрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреБрд░рдЬреЛрд░ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдорддрд▓рдм рдХрдареЛрд░ рдирд╣реАрдВ рдмреЛрд▓рдирд╛ рдерд╛, рдЕрдЧрд░ рдРрд╕рд╛ рдХреБрдЫ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реЛ рддреЛ рдХреГрдкрдпрд╛ рдореЗрд░реА рдорд╛рдлрд╝реА рдорд╛рдВрдЧреЗрдВред

рдореИрдВ рдПрдХ рдЗрдВрд╕рд╛рди рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрд╛рдЧрд╡рд╛рдиреА рд╕рдордп рдкрд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рд░ рддрд░рд╣ рд╕реЗ рдмрддрд╛рддреЗ рд╣реИрдВ, рдЬрдм рдореИрдВ рдПрдХ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ рд╣реВрдБ :) рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рд╣реА рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рдХрд╛рдВрдЯрд╛ рдЪрд╛рд╣рд┐рдП рд▓рдЧрддрд╛ рдХрд┐ https: / /github.com/golang/go/issues/19412#issuecomment -701625548

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

@mvdan рдЗрдВрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛред рдореИрдВ рдЙрд╕рдХрд╛ рдкрдбрд╝реЛрд╕реА рд╣реВрдВред рдордЬрд╛рдХ рдерд╛ред

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

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

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

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

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

@ рд╣реЗрдирд░реА рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рдпрд╣ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреНрд░рд╢реНрди рдерд╛ред рдЧреЛ рдХреНрд░рд┐рдПрдЯрд░реНрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡реЛрдВ рдкрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рджреВрд╕рд░реА рдУрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдЬреИрд╕реА рдХреЛрдбрд┐рдВрдЧ рдЧрд╛рдЗрдб рдХрднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧреАред
https://github.com/uber-go/guide/blob/master/style.md#verify -interface-compliance

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрдХрд░ рдЪрд░реНрдЪрд╛ рдХрд╣реАрдВ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдУрдкрди рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдВрддреБрд╖реНрдЯрд┐ рдЕрдкрдиреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж рд╕реЗ рдЧреЛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд░рд╣реА рд╣реИ рдФрд░ рдпрд╣ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реА рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Miserlou picture Miserlou  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stub42 picture stub42  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

myitcv picture myitcv  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bbodenmiller picture bbodenmiller  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lkarlslund picture lkarlslund  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ