Go: рдкреНрд░рд╕реНрддрд╛рд╡: рдХрд▓реНрдкрдирд╛: рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдПрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  816рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: golang/go

рдпрд╣ рдореБрджреНрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдореЗрдВ Go2 рд▓реЗрдмрд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Go1.x рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХрдореЛрдмреЗрд╢ рдкреВрд░реА рд╣реЛ рдЪреБрдХреА рд╣реИред

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

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

Go2 LanguageChange NeedsInvestigation Proposal generics

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

рдореБрдЭреЗ рдЕрдкрдиреА https://golang.org/wiki/NoMeToo рдиреАрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╛рдж рджрд┐рд▓рд╛ рджреЗрдВред рдЗрдореЛрдЬреА рдкрд╛рд░реНрдЯреА рдКрдкрд░ рд╣реИред

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

CL https://golang.org/cl/22057 рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИред

рдореБрдЭреЗ рдЕрдкрдиреА https://golang.org/wiki/NoMeToo рдиреАрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╛рдж рджрд┐рд▓рд╛ рджреЗрдВред рдЗрдореЛрдЬреА рдкрд╛рд░реНрдЯреА рдКрдкрд░ рд╣реИред

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

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

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

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

рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдмрд╣реБрдд рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рдмрдирд╛рдирд╛ рдЖрдХрд░реНрд╖рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ C++ std::basic_string рдореЗрдВ рд╣реИ, рдПрд╕рдЯреАрдбреА :: рдЖрд╡рдВрдЯрдХ>. рдЗрд╕рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ-рдЕрдиреНрдпрдерд╛ рдХреЛрдИ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛-рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдФрд░ рдХрднреА-рдХрднреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╕реА ++ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред

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

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

@tamird рдпрд╣ рдЧреЛ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЧреИрд░-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ T рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ I рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ T I рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рджреЗрдЦреЗрдВ https://golang.org/doc/faq#implements_interface ред рдпрд╣ рдЕрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ рдпрджрд┐ рдЧреЛ рдиреЗ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдПрдХ рд░реВрдк рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЯреА рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ "рдореБрдЭреЗ рдЬреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред"

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

@ianlancetaylor https://doc.rust-lang.org/book/traits.html рд░рд╕реНрдЯ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдореЙрдбрд▓ рд╣реИрдВ, рд╡реЗ рдЧреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рд╛рдм рдлрд┐рдЯ рд╣реЛрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдЬ рднреА рдореМрдЬреВрдж рд╣реИред

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

рдХреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдкрд░ рдХрд┐рд╕реА рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдХрд╛рджрдорд┐рдХ рд╕рд╛рд╣рд┐рддреНрдп рдХрд╛ рдХреЛрдИ рдорд╣рддреНрд╡ рд╣реЛрдЧрд╛?

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

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

рдореИрдВ рдпрд╣ рднреА рджреЗрдЦрддрд╛ рд╣реВрдВ https://github.com/golang/go/issues/15295 рд▓рд╛рдЗрдЯрд╡реЗрдЯ, рдлреНрд▓реЗрдХреНрд╕рд┐рдмрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдЬреЗрдирд░рд┐рдХ рдХрд╛ рднреА рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред

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

рдХреГрдкрдпрд╛ рджреЗрдЦреЗрдВ: http://dl.acm.org/citation.cfm?id=2738008 рдмрд╛рд░рдмрд░рд╛ рд▓рд┐рд╕реНрдХреЛрд╡ рджреНрд╡рд╛рд░рд╛:

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

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

рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рд░рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЧреЛ 1.xy рд╕реНрд░реЛрдд рдХреЛрдб рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдиреЗрд░рд┐рдХ рд╕реНрд░реЛрдд рдХреЛрдбред
рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ - рдореЗрд░реА рд░рд╛рдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрд╛рдд/рддрд░реНрдХ, рдФрд░ рдХреЛрдИ рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ рдХрд┐ _try_ рдЧреЛ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ _some рджрдпрд╛рд▓реБ_ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

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

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

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

рдкрд┐рдВрдЧрд┐рдВрдЧ @yizhouzhang рдФрд░ @andrewcmyers рддрд╛рдХрд┐ рд╡реЗ рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдЬреИрд╕реЗ рдЬреАрдирд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рд░рд╛рдп рджреЗ рд╕рдХреЗрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдореИрдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :)

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

рдпрд╣рд╛рдВ рдЙрд╕ рдкреЗрдкрд░ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП ACM рдбрд┐рдЬрд┐рдЯрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХреНрд╕реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
http://www.cs.cornell.edu/andru/papers/genus/

рдЬреАрдирд╕ рд╣реЛрдо рдкреЗрдЬ рдпрд╣рд╛рдБ рд╣реИ: http://www.cs.cornell.edu/projects/genus/

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

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

@mandolyte рдХреЗ рдирд┐рд░реНрдгрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЬреАрдирд╕ рдХрд╛ рд╕реНрдХреЛрд░ 17 рд╣реИ, рдЬреЛ #1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд╕реНрдХреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдорд╛рдирджрдВрдб рдЬреЛрдбрд╝реВрдВрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдЬреИрд╕реЗ @sbunc рдКрдкрд░ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреЗрдореНрдкрд▓реЗрдЯ-рдЖрдзрд╛рд░рд┐рдд рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреА рдХрдореА рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдЬреАрдирд╕ рдкреЗрдкрд░ рдХреА рддрдХрдиреАрдХреА рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдкреГрд╖реНрда 34 рдкрд░ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЕрднреА -рдЕрднреА рдЧреЛ рдЬреЗрдирд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рд╕рд╛рд░рд╛рдВрд╢ рдкрдврд╝рд╛ , рдЬреЛ рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕рд╛рд░рд╛рдВрд╢ рдерд╛ред рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ Genus рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рддрдВрддреНрд░ C++, Java, рдпрд╛ C# рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдиреА рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реИред рдЬрд╛рд╡рд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреАрдирд╕ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рд░рди рдЯрд╛рдЗрдо рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдВред рдЖрдк рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рднреА рддрддреНрдХрд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рдЯреА рдХреЗ рд╕рд░рдгреА рдЬрд╣рд╛рдВ рдЯреА рдПрдХ рдЖрджрд┐рдо рд╣реИред рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рд░рд╕реНрдЯ рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреА рд╕рд╣рдЬ рд╣реИред рдЖрджрд┐рдо рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ ala C# рд╡рд░реНрддрдорд╛рди рдореЗрдВ Genus рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рд▓рд┐рдВрдХ рд╕рдордп рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╣реА рд░рди-рдЯрд╛рдЗрдо рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

CL https://golang.org/cl/22163 рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЬрд┐рд╕рдореЗрдВ рдирдИ рднрд╛рд╖рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: https://docs.google.com/document/d/1rX4huWffJ0y1ZjqEpPrDy-kk-m9zWfatgCluGRBQveQ/edit?usp=sharingред

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

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

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

@andrewcmyers рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ @ianlancetaylor рдЙрд╕ рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реЗрдЧреАред

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

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

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

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

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

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

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

рд╕рд╛рдкреЗрдХреНрд╖ рдЬрдЯрд┐рд▓рддрд╛ рдПрдХ рддрд░рдл, рд╡реЗ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИрдВ рдХрд┐ рдЬреАрдирд╕ 1: 1 рдХрд╛ рдирдХреНрд╢рд╛ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрд╛ред рдХреЛрдИ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рдЕрдЧрд░ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИ:

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

рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЧреЛ рд╕реНрдкреЗрдХ https://golang.org/ref/spec#Constants рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЧреБрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рд╕реАрдзреЗ "рдмреНрд▓реЙрдХреНрд╕" рд╢реАрд░реНрд╖рдХ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рддрдХ рдЬрд╛рддрд╛ рд╣реИ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА 11 рдкреГрд╖реНрдареЛрдВ рд╕реЗ рдХрдо рдореБрджреНрд░рд┐рдд рд╣реИ)ред

Java рдФрд░ C# рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╡рд┐рдкрд░реАрдд, Genus рдЬреЗрдирд░рд┐рдХ рдореИрдХреЗрдирд┐рдЬреНрдо рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реИред рдпрд╣ рдЬреАрдирд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдореЗрд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рд╕рдВрдмрдВрдзреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╕реНрд╡рд╛рдж рд╣реИред

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

рдЬрдмрдХрд┐ рджреЛ рдкреНрд░рдХрд╛рд░ рдЬрд┐рдирдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рди рд╣реИрдВ
рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, https://play.golang.org/p/cT15aQ-PFr

рдпрд╣ рдЙрди рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдлрд╝реАрд▓реНрдб рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрд╕рдореБрдЪреНрдЪрдп рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ,
https://play.golang.org/p/KrC9_BDXuhред

рдереВ, рдЕрдкреНрд░реИрд▓ 28, 2016 рдЕрдкрд░рд╛рд╣реНрди 1:09 рдмрдЬреЗ, рдПрдВрдбреНрд░рдпреВ рдорд╛рдпрд░реНрд╕ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

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

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292#issuecomment -215298127

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

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

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдереЗ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП _рдкреИрдХреЗрдЬ рдЯреЗрдореНрдкреНрд▓реЗрдЯ_ рджреГрд╖реНрдЯрд┐рдХреЛрдг "рдкреНрд░рд╕реНрддрд╛рд╡" 1 2 рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

рдЯреАрдПрд▓; рдбреЙ; рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдкреИрдХреЗрдЬ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

package set
type E interface { Equal(other E) bool }
type Set struct { items []E }
func (s *Set) Add(item E) { ... }

рд╕рдВрд╕реНрдХрд░рдг 1. рдкреИрдХреЗрдЬ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде:

package main
import items set[[E: *Item]]

type Item struct { ... }
func (a *Item) Equal(b *Item) bool { ... }

var xs items.Set
xs.Add(&Item{})

рд╕рдВрд╕реНрдХрд░рдг 2. рдШреЛрд╖рдгрд╛ рдХреНрд╖реЗрддреНрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛:

package main
import set

type Item struct { ... }
func (a *Item) Equal(b *Item) bool { ... }

var xs set.Set[[E: *Item]]
xs.Add(&Item{})

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

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

type E interface{}
func Reduce(zero E, items []E, fn func(a, b E) E) E { ... }

Reduce[[E: int]](0, []int{1,2,3,4}, func(a, b int)int { return a + b } )
// there are probably ways to have some aliases (or similar) to make it less verbose
alias ReduceInt Reduce[[E: int]]
func ReduceInt Reduce[[E: int]]

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдЧреБрдг рд╣реИрдВ:

  • рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдкреИрдХреЗрдЬ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВ sort.Sort[[Interface:MyItems]](...) рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрдЬрд╛рдп рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ (рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд▓рд╛рдн рдХреЗ рд╕рд╛рде)ред
  • рдкрд░реАрдХреНрд╖рдг рд╕рд░рд▓ рд╣реИ, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдпрд╣ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  • рдпрд╣ рдмрддрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ [[E: int]] E int рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

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

type op
import "set"

type E interface{}
func Union(a, b set.Set[[set.E: E]]) set.Set[[set.E: E]] {
    result := set.New[[set.E: E]]()
    ...
}

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

_PS, рдзреАрдореА рдЬреЗрдирд░рд┐рдХ рдкреНрд░рдЧрддрд┐ рдкрд░ рдмрдбрд╝рдмрдбрд╝рд╛рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрди рдореБрджреНрджреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдЯреАрдо рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рдирдХрд╛ рд╕рдореБрджрд╛рдп рдХреЛ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░/рд░рдирдЯрд╛рдЗрдо рдмрдЧ, SSA, GC, http2._

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

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

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

рдЯрд╛рдЗрдк рдХрд░реЗрдВ [рд╡реА, рдИ] рдЧреНрд░рд╛рдл [рд╡реА рдЗрдВрдЯрд░рдлреЗрд╕ {рдПрдЬ () рдИ}, рдИ рдЗрдВрдЯрд░рдлреЗрд╕ {рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ () (рд╡реА, рд╡реА)}] ...

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

(рдЧреЛ рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╣рд╛рдиреА рд╣реИред рдпрджрд┐ рднрд╛рд╖рд╛ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ рддреЛ рднрд╛рд╖рд╛ рдЖрдкрдХрд╛ рдкреНрд░рдХрд╛рд░ "==" рджреЗрддреА рд╣реИ (рджреЗрдЦреЗрдВ https://golang.org/ref/spec#Logical_operators, "comparable" рдЦреЛрдЬреЗрдВ)ред рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ " ==" рдорд╛рдирдЪрд┐рддреНрд░ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд░рдХрд╛рд░ "==" рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред)

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

рдЬрд╛рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдЙрдирдХреА рдХрдореА рд╣реИред рдЖрдк рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╣рд▓реНрдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЗрдВрдЯ рдЗрдВрдЯ рдЯрд╛рдЗрдк рдХрд░реЗрдВ
func (i Int) рдХрдо (j Int) рдмреВрд▓ {рд░рд┐рдЯрд░реНрди i < j}

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

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

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

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

Genus рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдЬреАрдирд╕ рдХреЛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЬреАрдирд╕ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ _as if_ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдВрддреЛрд╖рдЬрдирдХ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╕реВрдЯ рдерд╛ред рдПрдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рд╣реИрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХреЗ, рд▓реЗрдХрд┐рди рд╕рднреА рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдмрд╛рдзрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рддреЛ Map[int, boolean] рдЬреИрд╕реЗ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдФрд░ рдЙрдкрджреНрд░рд╡ рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдиреВрдиреА рд╣реИрдВред рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рджреЛ рд╕реНрд╡рд╛рджреЛрдВ (int рдмрдирд╛рдо Int) рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЗрдВрдЯ рдХреБрдЫ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рд▓реИрд╕ рдирд╣реАрдВ рдереЗ, рддреЛ рд╣рдо рд▓рдЧрднрдЧ рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕реЗ рдКрдкрд░ рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧред

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

@egonelbre рдЬреЛ рдЖрдк рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЖрднрд╛рд╕реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдХреИрд▓рд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдХреНрд░реЗрд╕реНрдЯрди рдХреНрд░реИрдм рдереЛрд░реБрдк рдХрд╛ рдПрдХ ECOOP'97 рдкреЗрдкрд░ рд╣реИ, "рдЬреЗрдиреЗрд░рд┐рд╕рд┐рдЯреА рдЗрди рдЬрд╛рд╡рд╛ рд╡рд┐рде рд╡рд░реНрдЪреБрдЕрд▓ рдЯрд╛рдЗрдкреНрд╕", рдЬреЛ рдЗрд╕ рджрд┐рд╢рд╛ рдХреА рдкрдбрд╝рддрд╛рд▓ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдЖрднрд╛рд╕реА рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрднрд╛рд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рднреА рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ ("J&: рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯреЗрдб рдЪреМрд░рд╛рд╣рд╛", OOPSLA'06)ред

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

// (рдЬреЗрдиреЗрд░рд┐рдХ) рдлрдВрдХ рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди
Sum64 func (X, Y) рдлреНрд▓реЛрдЯ64 рдЯрд╛рдЗрдк рдХрд░реЗрдВ {
рдлреНрд▓реЛрдЯ 64 (рдПрдХреНрд╕) + рдлреНрд▓реЛрдЯ 64 (рд╡рд╛рдИ) рд▓реМрдЯреЗрдВ
}

// рддрддреНрдХрд╛рд▓ рдПрдХ, рд╕реНрдерд┐рддрд┐рдЧрдд рд░реВрдк рд╕реЗ
рдореИрдВ := 42
рд╡рд░ рдЬреЗ рдпреВрдЗрдВрдЯ = 86
рдпреЛрдЧ := рдФрд░ рдпреЛрдЧ64{i, j}

// рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░реЗрдВ
рдпреЛрдЧ: = рдФрд░ рдпреЛрдЧ 64 {X: int, Y: uint}

// рдЕрдм рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ ...
рдкрд░рд┐рдгрд╛рдо: = рдпреЛрдЧ (i, j) // рдкрд░рд┐рдгрд╛рдо 128 рд╣реИ

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

рдЗрд╕ рдмреАрдЪ, рдЕрдзреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧреЛ рднрд╛рд╖рд╛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдЦрдВрдбрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реЛрдЧрд╛ред

рддреЛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдпреЛрдЬрдирд╛ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдПред

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

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕?

// Module defining generic type
module list(type t)

type node struct {
    next *node
    data t
}
// Module using generic type:
import (
    intlist "module/path/to/list" (int)
    funclist "module/path/to/list" (func (int) int)
)

l := intlist.New()
l.Insert(5)

@ md2perpe , рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдХреГрдкрдпрд╛ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдФрд░ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред

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

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

@thwd рддреЛ рдХреНрдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдФрд░ рдЯрд╛рдЗрдк рдПрд╕реЗрд╕рдореЗрдВрдЯ рдХреА рдЖрдЬ рдЬрд░реВрд░рдд рд╣реИред рдФрд░ рдХреНрдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ ... рдФрд░ рдлрд┐рд░ рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рджреЛрдиреЛрдВ рдХреЛ рд╕рдореЗрдЯ рд▓реЗрдЧрд╛? рдФрд░ рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдХреНрдпреЛрдВ? (рдЬреИрд╕реЗ рдХрд┐ рдореЙрдбреНрдпреВрд▓реЛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХреБрдЫ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджрд┐рдпрд╛ред

рдХреНрдпрд╛ рдореИрдВ рдХрд░реАрдм рд╣реВрдБ? :-)

@mandolyte рд╣рд╛рдБ! рдЖрдЗрдП рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрдореЗрд▓ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдЖрдк рдореБрдЭ рддрдХ "me at thwd dot me" рдкрд░ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдИ рдФрд░ рдЗрд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИ; рдореБрдЭреЗ рдПрдХ рдИрдореЗрд▓ рд╢реВрдЯ рдХрд░реЗрдВ рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдереНрд░реЗрдб рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред

рдпрд╣ type system рдФрд░ collection library рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕:

type Element<T> struct {
    prev, next *Element<T>
    list *List<T>
    value T
}
type List<E> struct {
    root Element<E>
    len int
}

interface рдХреЗ рд▓рд┐рдП

type Collection<E> interface {
    Size() int
    Add(e E) bool
}

super type рдпрд╛ type implement :

func contain(l List<parent E>, e E) bool
<V> func (c Collection<child E>)Map(fn func(e E) V) Collection

рдЬрд╛рд╡рд╛ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЙрд░реНрдл:

boolean contain(List<? super E>, E e)
<V> Collection Map(Function<? extend E, V> mapFunc);

@leaxoy рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдпрд╣рд╛рдБ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдКрдкрд░ рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВред

рдмрд╕ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЕрд╡рдЧрдд рд░рд╣реЗрдВ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд▓рд╛рдЧрдд рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИред

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

@minux рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдЧрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рд▓реЗрдХрд┐рди рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред interface{} рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЬреЗрдирд░рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ interface{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

@xoviat

рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдХрд▓рдХ рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

(рдХрдо рд╕реЗ рдХрдо) рджреЛ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рд╣реИрдВред

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

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

рдХреНрдпрд╛ рд╣рд╛рдЗрдкрд░ рдЯрд╛рдЗрдк рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

func getAddFunc (aType type) func(aType, aType) aType {
    return func(a, b aType) aType {
        return a+b
    }
}

рдХреНрдпрд╛ рд╣рд╛рдЗрдкрд░ рдЯрд╛рдЗрдк рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

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

@ golang101 рдореЗрд░реЗ рдкрд╛рд╕ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдПрд▓ рднреЗрдЬреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдкрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

CL https://golang.org/cl/38731 рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИред

@andrewcmyers

рдпрд╣ рдореЙрдбреНрдпреВрд▓рд░ рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк aType рдореЗрдВ рджреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ + рдСрдкрд░реЗрд╢рди рд╣реИред

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

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

рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ 2016-09-compile-time-functions.md рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

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

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

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

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

рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк "рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рддрддреНрд╡ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ" рдЬреИрд╕рд╛ рдХреБрдЫ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рдПрдб-рд╣реЙрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ []func<T>([]T) T рдореЗрдВ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣рд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд░реВрд░рдд рдЗрд╕ рдмрд╛рдд рдХреА рд╣реИ рдХрд┐ рдорд╛рди рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВ, рди рдХрд┐ рдХреБрдЫ рд╕реНрд░реЛрдд-рдХреЛрдб рд╕реНрддрд░ рдХреЛрдб рдкреАрдврд╝реАред

@ рдмрдиреНрд╕рд┐рдо

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

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

const func SliceOfSelectors(T gotype) gotype { return []func([]T)T (type) }

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

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

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

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

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

@ рдмрдиреНрд╕рд┐рдо

"рдЬреЗрдиреЗрд░рд┐рдХ" рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкреНрд░рдХрд╛рд░-рдЕрд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ {} рддрдм рднреА рдЬрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдУрд╡рд░рд╣реЗрдб {} рдкрд░рд┐рд╣рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред

"рдкрд░рд┐рд╣рд╛рд░реНрдп рдирд╣реАрдВ" рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд╛ рдУрд╡рд░рд╣реЗрдб 2009 рд╕реЗ рд░рд╕ рдХреА рдкреЛрд╕реНрдЯ рдореЗрдВ #3 рдмрд┐рдВрджреБ рд╣реИ (https://research.swtch.com/generic)ред

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

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

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

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

@andrewcmyers

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

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

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

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

рдпрд╣ рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛, рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ (рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреНрд░рдо рдореЗрдВ рдирд╣реАрдВ):

  • рдЕрддреНрдпрдзрд┐рдХ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ред
    рдПред рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдФрд░ рдореВрд▓реНрдп рдирд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ред
    рдмреАред рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╕рдорд░реНрдерди, рдЬрд┐рд╕рд╕реЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрдордЬреЛрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред
  • рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдпрд╛, рд╕рдордХрдХреНрд╖, рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд░реНрдерди рдХреЗ рддрджрд░реНрде рд╡рд┐рдХрд╛рд╕) рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдкрд░ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ред
    рдПред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ wrt рд╕рдВрджрд░реНрдн-рдврд╣рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдпрдоред
  • SFINAE рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╡реНрдпрд╛рдкрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдХрдард┐рди-рд╕реЗ-рдкреНрд░рд╕рд╛рд░ рдмрд╛рдзрд╛рдПрдВ рдФрд░ рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд╣рд┐рдд рд╢рд░реНрддреЗрдВ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмрд╣реБрдд рдХрдард┐рди рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд╣реЛрддреА рд╣реИред
  • рдПрдПрд╕рдЯреА рд╕рдмрд╕реНрдЯреЗрд╢рди рдФрд░ рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╕рдВрдХрд▓рди рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЯреЛрдХрди-рдкреЗрд╕реНрдЯрд┐рдВрдЧ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯреБрдЕрд▓ рдЗрдВрдХреНрд▓реВрдЬрди (рд╕реА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░) рдХрд╛ рдЕрддрд┐ рдкреНрд░рдпреЛрдЧ (рдЬреЛ рд╢реБрдХреНрд░ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
  • C++ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рдХрдореА, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рдВрд╢реЛрдВ (рдЬреИрд╕реЗ GCC рдЯреВрд▓рдЪреЗрди) рдореЗрдВ рдЦрд░рд╛рдм рддреНрд░реБрдЯрд┐-рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред
  • рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдорд┐рдд "рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ" рдкрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдореИрдкрд┐рдВрдЧ рд╕реЗрдЯ рд╕реЗ рдЙрддреНрдкрдиреНрди рдирд╛рдореЛрдВ рдХрд╛ рджреЛрд╣рд░реАрдХрд░рдг (рдФрд░ рдХрднреА-рдХрднреА рдЧреБрдгрд╛) (рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЦреБрдж рдХреЛ рдореМрд▓рд┐рдХ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдиреЗ рдХреЗ рдмрдЬрд╛рдп)ред

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

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

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

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

func <T io.Reader> ReadAll(in T)

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

рдПрдХ рдмреЗрд╣рддрд░ рдЙрджрд╛рд╣рд░рдг sort рдкреИрдХреЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

func <T Comparable> Sort(slice []T)

рдЬрд╣рд╛рдВ Comparable рдмрд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Sort рдХреЛ рддрдм рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ Comparable рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмреЙрдХреНрд╕ рдХрд┐рдП рдмрд┐рдирд╛ред

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдордиреЗ рдЬреАрдирд╕ [ рдкреАрдПрд▓рдбреАрдЖрдИ'15 ] рдореЗрдВ рдЬреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдкрдирд╛рдпрд╛ рд╡рд╣ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реИред рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ, рд▓реЗрдХрд┐рди рд╣рд▓реНрдХреЗ, рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВ (рдореИрдВ рдСрдкрд░реЗрд╢рди рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдмрд╛рдд рд▓реЗрддрд╛ рд╣реВрдВ; рд╕реАрдПрд▓рдпреВ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ 1977 рдореЗрдВ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП)ред рдЬреАрдирд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЙрдбреНрдпреВрд▓рд░ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдпрд╛ рддреЛ рдХреЛрдб рд╕реНрдерд╛рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдЪреНрдЫреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@andrewcmyers

рдпрджрд┐ рдореЙрдбреНрдпреВрд▓ рдбреА рдЕрдм, рдбреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рдмрд┐рдирд╛, рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдХреБрдЫ рдирдП рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ [...] [рдХреНрд▓рд╛рдЗрдВрдЯ] рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдбреЗрд╡рд▓рдкрд░ рдбреА рдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕реЗ рдЙрдбрд╝рд╛ рд░рд╣реЗ рд╣реИрдВред

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

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

рдЗрд╕реА рддрд░рд╣, рдЧреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЖрдЬ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЬреАрд╡рдирдХрд╛рд▓ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: io.Writer рдХреЗ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд▓рддреА рд╕реЗ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдкрд╛рд╕-рдЗрди рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рд╕рдВрджрд░реНрдн рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЗрдЦрди рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░рдХреЗ) рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЧреЛрд░реМрдЯрд╛рдЗрди рдореЗрдВ), рд▓реЗрдХрд┐рди рдпрд╣ рдбреЗрдЯрд╛ рджреМрдбрд╝ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдпрджрд┐ Write рдХрд╛ рдХреЙрд▓рд░ рдмрд╛рдж рдХреЗ Write рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдмреИрдХрд┐рдВрдЧ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

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

рдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, https://github.com/golang/go/issues/19647 рджреЗрдЦреЗрдВред)

рдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд░реИрдкрд░ рдЬреЛрдбрд╝реЗ рдпрд╛ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ Go 1.5 рдореЗрдВ рдорд╛рдирдХ net рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реБрдЖ рдерд╛)ред

рдпрд╛ рдПрдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдЪреИрдирд▓ рдкрд░ рдмрдлрд░рд┐рдВрдЧ рдмрджрд▓ рд╕рдХрддреА рд╣реИ, рдЧрддрд┐рд░реЛрдз рдФрд░/рдпрд╛ рджреМрдбрд╝ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреА рд╣реИред

...рдФрд░ рдЗрд╕реА рддрд░рд╣ред

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


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

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

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


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

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

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

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

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдиреНрдп рдирд┐рд╣рд┐рдд рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдЖрдкрдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рд╢рд╛рдорд┐рд▓ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╣рдорд╛рд░реА рд╣рд▓реНрдХреА рд╕реНрдерд┐рд░ рдЬрд╛рдБрдЪ [ PLDI 2016 ] рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдЧреАред

@andrewcmyers

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

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

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

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

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

рдпрд╣рд╛рдВ "рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ рд╣реИред sync рдФрд░ atomic рдкреИрдХреЗрдЬ рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ - рдЕрд░реНрдерд╛рддреН, atomic.Value рдФрд░ sync.Map - CompareAndSwap рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЗрд╡рд▓ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рддреБрд▓рдиреАрдп рд╣реЛрддреЗ рд╣реИрдВред рд╢реЗрд╖ atomic.Value рдФрд░ sync.Map рдПрдкреАрдЖрдИ рдЙрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧреА рд░рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╛ рддреЛ SFINAE (рдпрд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╢рд░реНрдд-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдкреАрдЖрдИ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рдЧрд┐рд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд░ рд╡рд╛рдкрд╕ред

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

@bcmills рдХреНрдпрд╛ рдЖрдк рдЗрди рддреАрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

  1. рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдФрд░ рдореВрд▓реНрдп рдирд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ред
  2. рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╕рдорд░реНрдерди
    3. рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдкрд░ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛

@mahdix рдЬрд╝рд░реВрд░ред

  1. рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдФрд░ рдореВрд▓реНрдп рдирд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ред

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

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

const a = someValue
x := T{a: b}

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

  1. рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╕рдорд░реНрдерди

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

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

  1. рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдкрд░ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛

<type_traits> рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдЕрдиреБрдХреВрд▓ рдкрдбрд╝реЛрд╕ libc++ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦреЗрдВред

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

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

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

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдореИрдХреНрд░реЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧреА? рдореИрдВ go generate рдпрд╛ gotemplate рдЬреИрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдЗрд╕ рддрд░рд╣ рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

macro MacroFoo(stmt ast.Statement) {
    ....
}

рдореИрдХреНрд░реЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

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

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

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

рдЬреИрд╕рд╛ рдХрд┐ https://blog.golang.org/toward-go2 рдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ "рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ" рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдФрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдорд┐рдирдЯ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЧрдП рдореИрдХреНрд░реЛ рдорд╛рдорд▓реЛрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреГрдкрдпрд╛ рдЗрд╕ рдмрдЧ рдХреЛ рд╡рд┐рд╖рдп рдФрд░ рдирд╛рдЧрд░рд┐рдХ рдкрд░ рд░рдЦреЗрдВред рдФрд░ рдлрд┐рд░, https://golang.org/wiki/NoMeTooред рдХреГрдкрдпрд╛ рдХреЗрд╡рд▓ рддрднреА рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛред

@mandolyte рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ (рдЖрдВрд╢рд┐рдХ) рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреА рд╡рдХрд╛рд▓рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реЗрдм рдкрд░ рд╡рд┐рд╕реНрддреГрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЦреЛрдЬрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:
https://appliedgo.net/generics/
https://www.calhoun.io/using-code-generation-to-survive-without-generics-in-go/
http://blog.ralch.com/tutorial/golang-code-generation-and-generics/

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдБ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрдкрдирд╛ рд░рд╣реЗ рд╣реИрдВред

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

  • рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рдПрдХ рдЪреБрдиреМрддреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рд╕реБрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдФрд░ рдХреЛрдб рд░рдЦрд░рдЦрд╛рд╡, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ (рд╕рд░рд▓рддрд╛...), рдорд╛рдирдХ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдФрд░ рдПрдХреАрдХреГрдд рдХреЛрдб рдорд╛рдирдХреЛрдВ рдХреЛ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
    рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рдбрд┐рдмрдЧрд┐рдВрдЧ рдЯреВрд▓ (рдкреНрд░реЛрдлрд╛рдЗрд▓рд░, рд╕реНрдЯреЗрдк рдбрд┐рдмрдЧрд░реНрд╕ рдЖрджрд┐) рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рдЯреВрд▓ рдЪреЗрди рдХреЛ рд╕рдорд╛рди рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рд▓рд┐рдЦреА рдЧрдИ рдереАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди ASM рдХреЛрдб рдореЗрдВ рдХрджрдо рд░рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реИ - рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдПрдХ рдкрдардиреАрдп рдХреЛрдб :)ред

рдбрд╛рдЙрдирд╕рд╛рдЗрдб - рдЧреЛ рдЯреВрд▓ рдЪреЗрди рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд┐рд╕рд╛рд▓ рдирд╣реАрдВ (рдЬрд┐рд╕реЗ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ)ред

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

IMHO: рдпрд╣ рдХрдо рдХреАрдордд рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордЭреМрддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдореИрдХреНрд░реЛ-рд╕реНрдЯрд╛рдЗрд▓ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛, рдЪрд╛рд╣реЗ рд╡рд╣ gen, cpp, gofmt -r, рдпрд╛ рдЕрдиреНрдп рдореИрдХреНрд░реЛ/рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреВрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдорд╛рдирдХреАрдХреГрдд рд╣реЛред рдЗрд╕рдореЗрдВ рд╕реА ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЬреИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ: рдХреЛрдб рдмреНрд▓реЛрдЯ, рдореЙрдбреНрдпреВрд▓рд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреА рдХрдореА рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдХрдард┐рдирд╛рдИред рдЬреИрд╕реЗ рд╣реА рдЖрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдФрд░ рднреА рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдмрдирд╛рдирд╛ред рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ, рдлрд╛рдпрджреЗ рд╕реАрдорд┐рдд рд╣реИрдВ: рдпрд╣ рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛ рдФрд░ рдпрд╣ рдХреБрд╢рд▓ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ - рдЬрдм рддрдХ рдХрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреИрд╢ рджрдмрд╛рд╡ рди рд╣реЛ, рдЖрдзреБрдирд┐рдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдерд┐рддрд┐!

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

рдмреБрдзрд╡рд╛рд░ рдХреЛ 26 рдЬреБрд▓рд╛рдИ, 2017, 22:41 рдПрдВрдбреНрд░рдпреВ рдорд╛рдпрд░реНрд╕, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдореИрдХреНрд░реЛ-рд╢реИрд▓реА рдХреЛрдб рдкреАрдврд╝реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛, рдЪрд╛рд╣реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ
gen, cpp, gofmt -r, рдпрд╛ рдЕрдиреНрдп рдореИрдХреНрд░реЛ/рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреВрд▓ рдХреЗ рд╕рд╛рде, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП
рдорд╛рдирдХреАрдХреГрдд рд╣реЛрдиреЗ рдкрд░ рднреА рдЬреЗрдирд░рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рдиред рдЗрд╕рдореЗрдВ рд╡рд╣реА рд╣реИ
рд╕реА ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ: рдХреЛрдб рдмреНрд▓реЛрдЯ, рдореЙрдбреНрдпреВрд▓рд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреА рдХрдореА, рдФрд░
рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдХрдард┐рдирд╛рдИред рдЬреИрд╕реЗ рд╣реА рдЖрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдирд┐рд░реНрдорд╛рдг
рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдбред рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ, рдлрд╛рдпрджреЗ рд╣реИрдВ
рд╕реАрдорд┐рдд: рдпрд╣ рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛
рдФрд░ рдпрд╣ рдХреБрд╢рд▓ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ - рдЬрдм рддрдХ рдХрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреИрд╢ рди рд╣реЛ
рджрдмрд╛рд╡, рдЖрдзреБрдирд┐рдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдерд┐рддрд┐!

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

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

рдореЗрд░рд╛ рдХрд╣рдирд╛ рдерд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рд▓рд╛рдЧрдд рдкреНрд░рднрд╛рд╡реА рдерд╛ред

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

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

@bcmills рдФрд░ @ianlancetaylor рджреНрд╡рд╛рд░рд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╡рд▓реЛрдХрди рдХрд┐рдП рд╣реИрдВ:

рд╕рдВрдХрд▓рди-рд╕рдордп рдХреЗ рдХрд╛рд░реНрдп рдФрд░ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдкреНрд░рдХрд╛рд░

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

const func New(K, V gotype, hashfn Hashfn(K), eqfn Eqfn(K)) func()*Hashmap(K, V, hashfn, eqfn)

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

Go . рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ

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

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

рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рдмрд╛рдзрд╛рдПрдВ рдереАрдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд╕рдВрдХрд▓рдХ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрд╕рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:

HashMap[Anything,Anything] // Compiler must always compare the implementation and usages to make sure this is valid.

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

HashMap[Comparable,Anything] // Compiler can first filter out instantiations for incomparable types before running an exhaustive check.

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

@smasher164

рдореБрдЭреЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕реЗ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

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

@smasher164

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

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

рдпрджрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдФрд░ рдЕрдзрд┐рдХ рдмрд╛рдзрд╛рдПрдБ рдереАрдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд╕рдВрдХрд▓рдХ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рднрд╛рд╖рд╛ рдХреЛ рдЙрд╕рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╕рдВрдХрд▓рдХ-рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдПред

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

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

рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдФрд░ рд╣рд▓реНрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реАрдПрд▓рдпреВ (1977) рджреЗрдЦреЗрдВред

@andrewcmyers

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

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

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

рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╡рд░реНрдмреЛрдЬрд╝ рдФрд░ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВред

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

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

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

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

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

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

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

type Iterable[T] interface {
    Next() T
}

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

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

рднрд╛рд╖рд╛ рдХреЛ рдЙрд╕рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╕рдВрдХрд▓рдХ-рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдПред

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

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ . рдХреЗ рдмрдЬрд╛рдп

type Iterable[T] interface {
    Next() T
}

рд╣рдордиреЗ "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ "рдмрд╛рдзрд╛рдУрдВ" рд╕реЗ рдЕрд▓рдЧ рдХрд░ рджрд┐рдпрд╛ред рддрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

type T generic

type Iterable class {
    Next() T
}

рдЬрд╣рд╛рдВ "рд╡рд░реНрдЧ" рдХрд╛ рдЕрд░реНрде рд╣реИ рд╣рд╛рд╕реНрдХреЗрд▓-рд╢реИрд▓реА рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕, рдЬрд╛рд╡рд╛-рд╢реИрд▓реА рд╡рд░реНрдЧ рдирд╣реАрдВред

"рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рд╕реЗ рдЕрд▓рдЧ "рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕" рд╣реЛрдиреЗ рд╕реЗ рджреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдХреБрдЫ рдЧреИрд░-рдСрд░реНрдереЛрдЧреЛрдиреИрд▓рд┐рдЯреА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдлрд┐рд░ Sortable (рд╕реЙрд░реНрдЯ.рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░рдирд╛) рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

type T generic

type Comparable class {
    Less(a, b T) bool
}

type Sortable class {
    Next() Comparable
}

рдпрд╣рд╛рдБ @andrewcmyers рджреНрд╡рд╛рд░рд╛ Genus рдореЗрдВ "рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕реЗрд╕ рдПрдВрдб рдХреЙрдиреНрд╕реЗрдкреНрдЯреНрд╕" рд╕реЗрдХреНрд╢рди рдФрд░ рдЧреЛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдлреАрдбрдмреИрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рдЦрдВрдб рдмрддрд╛рддреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╛рдзрд╛ рд╕рдВрддреБрд╖реНрдЯрд┐ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдЧреЛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдмрд╛рдзрд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдирд╛рдЯрдХреАрдп рд╕рд░рд▓реАрдХрд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

kind Any interface{} // accepts any type that satisfies interface{}.
type T Any // Declare a type of Any kind. Also binds it to an identifier.
kind Eq T == T // accepts any type for which equality is defined.

рддреЛ рдПрдХ рдирдХреНрд╢рд╛ рдШреЛрд╖рдгрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

type Map[K Eq, V Any] struct {
}

рдЬрд╣рд╛рдВ рдЬреАрдирд╕ рдореЗрдВ, рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

type Map[K, V] where Eq[K], Any[V] struct {
}

рдФрд░ рдореМрдЬреВрджрд╛ рдЯрд╛рдЗрдк-рдкреИрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:

type Map[K,V] struct {
}

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

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

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

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

type handleFunc func(http.ResponseWriter, *http.Request)
func (f handlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) { f(w,r) }

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╣реА рдХрд░рддрд╛ рд╣реИред

@smasher164

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

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

рдкреНрд░рдХрд╛рд░ рдХреЛрдИ рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} // рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ {}ред
рдЯрд╛рдЗрдк рдЯреА рдХреЛрдИ рднреА // рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВред рдЗрд╕реЗ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реЗ рднреА рдмрд╛рдВрдзрддрд╛ рд╣реИред
рддрд░рд╣ Eq T == T // рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред
рдирдХреНрд╢рд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ [рдХреЗ рдИрдХ, рд╡реА рдХреЛрдИ рднреА] рд╕рдВрд░рдЪрдирд╛ {...
}

рдЬреАрдирд╕ рдореЗрдВ рдЗрд╕рдХрд╛ рдиреИрддрд┐рдХ рд╕рдордХрдХреНрд╖ рд╣реЛрдЧрд╛:

constraint Any[T] {}
// Just use Any as if it were a type
constraint Eq[K] {
   boolean equals(K);
}
class Map[K, V] where Eq[K] { ... }

рдлрд╝рдорд┐рд▓рд┐рдпрд╛ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рд▓рд┐рдЦреЗрдВрдЧреЗ:

interface Eq {
    boolean equals(This);
}
class Map[K where Eq, V] { ... }

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

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

рдЖрдЬ рдЧреЛ рдХреЛрдб рдореЗрдВ рджреЛ рдЪреАрдЬреЗрдВ рдХреЙрдорди рд╣реИрдВ

  • рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рд▓рдкреЗрдЯрдирд╛ (рдПрдХ рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП http.ResponseWriter рд▓рдкреЗрдЯрдирд╛)
  • рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдХрднреА-рдХрднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рдиреЛрдВ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ Temporary() bool рдкрд░ net.Error )

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

type MyError struct {
  error
  extraContext extraContextType
}
func (m MyError) Error() string {
  return fmt.Sprintf("%s: %s", m.extraContext, m.error)
}

рдпрджрд┐ рдЖрдк рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдореВрд▓ рддреНрд░реБрдЯрд┐ рдкрд░ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ рдЫреБрдкрд╛рддреЗ рд╣реИрдВред

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

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

type MyError generic_over[E which_is_a_type_satisfying error] struct {
  E
  extraContext extraContextType
}
func (m MyError) Error() string {
  return fmt.Sprintf("%s: %s", m.extraContext, m.E)
}

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

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

рдпрд╣ рддреБрд░рдВрдд рджреЛ рдЪрд┐рдВрддрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ

  • рдкреНрд░рдХрд╛рд░ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ (рд╕рдВрднрд╡рддрдГ рд╡реИрд╕реЗ рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)
  • рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдорд╛рди рд╢реВрдиреНрдп рд╣реИ рддреЛ рдЯрд╛рдЗрдк рдирд┐рд░реНрдорд╛рдг рдХреЛ рдШрдмрд░рд╛рдирд╛ рд╣реЛрдЧрд╛

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

рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЖрдк рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдкрд░ MyError рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЬрд╛рджреБрдИ unbox рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реИ рдФрд░ (рдХрд┐рд╕реА рддрд░рд╣) рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ:

func wrap(ec extraContext, err error) error {
  if err == nil {
    return nil
  }
  return MyError{
    E: unbox(err),
    extraContext: ec,
  }
}

рдЕрдм рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реИ, err , рдЬрд┐рд╕рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ *net.DNSError рд╣реИред рдлрд┐рд░ рдпрд╣

wrapped := wrap(getExtraContext(), err)
//wrapped 's dynamic type is a MyStruct embedding E=*net.DNSError
_, ok := wrapped.(net.Error)
fmt.Println(ok)

true рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ err рдХрд╛ рдбрд╛рдпрдирд╛рдорд┐рдХ рдкреНрд░рдХрд╛рд░ *os.PathError рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдЭреВрдард╛ рдкреНрд░рд┐рдВрдЯ рд╣реЛрддрд╛ред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдореЛрдЯреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕реНрдкрд╖реНрдЯ рд╣реИред

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

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

@andrewcmyers рдирдВред

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

type S struct {
  T
}

рддрдерд╛

type S struct {
  T T
}
func (s S) Foo() {
  s.T.Foo()
}

(рдЬрдм рдлреВ рдХреЛ рдЗрд╕рдХрд╛ "рдпрд╣" рд╣рдореЗрд╢рд╛ рдЯрд╛рдЗрдк рдЯреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

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

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

func isTemp(err error) bool {
  if t, ok := err.(interface{ Temporary() bool}); ok {
    return t.Temporary()
  }
  return false
}

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

type A struct {}
func (A) Foo()
func (A) Bar()

type I interface {
  Foo()
}

type B struct {
  I
}

var i I = B{A{}}

рдЖрдк Bar рдХреЛ i $ рдкрд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдпрд╣ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рддрдм рддрдХ рдореМрдЬреВрдж рд╣реИ рдЬрдм рддрдХ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдореИрдВ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдПрдХ рдмреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ I рдлрд╝реАрд▓реНрдб рдкрд░ рдЙрд╕ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ .

рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐, рдпрд╛ рд░реАрдбрд░ рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдирд┐рдкрдЯрдирд╛ред

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

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

@jimmyfrasche @andrewcmyers рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, https://github.com/golang/go/issues/4146#issuecomment -318200547 рднреА рджреЗрдЦреЗрдВред

@jimmyfrasche рдореЗрд░реЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдПрдХ рдЪрд░ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░/рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реА рд╣реИред рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЛ рдЕрд▓рдЧ рд░рдЦрддреЗ рд╣реБрдП, рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛

type MyError generic_over[E which_is_a_type_satisfying error] struct {
  e E
  extraContext extraContextType
}
func (m MyError) Error() string {
  return fmt.Sprintf("%s: %s", m.extraContext, m.e)
}

e рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди $#$2 *net.DNSError #$ рдЬреИрд╕реЗ рдЧрддрд┐рд╢реАрд▓ (рдпрд╛ рдареЛрд╕) рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ error рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЗ рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдирд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реИ:

  1. рдПрдХ рдЬрд╛рджреБрдИ unbox рдЬреИрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдЪрд░ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдорд╛рди рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдареЛрд╕ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрдШред
  2. рдпрджрд┐ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рдХрд╛рд░ рдЪрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрди рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде, рд╣рдо рд╕реНрд╡рдпрдВ unbox рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
func unbox(v T1) T2 {
    t := dynTypeOf(v)
    return v.(t)
}

wrap рдХреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛

func wrap(ec extraContext, err error) error {
  if err == nil {
    return nil
  }
  t := dynTypeOf(err)
  return MyError{
    e: v.(t),
    extraContext: ec,
  }
}
  1. рдпрджрд┐ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдЪрд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
type E1 which_is_a_type_satisfying error
type E2 which_is_a_type_satisfying error

func wrap(ec extraContext, err E1) E2 {
  if err == nil {
    return nil
  }
  return MyError{
    e: err,
    extraContext: ec,
  }
}

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

var iface error = ...
wrap(getExtraContext(), unbox(iface))

рдЪреВрдВрдХрд┐ рдХрд┐рд╕реА рдФрд░ рдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ "рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ" рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ https://blog.golang.org/toward-go2 рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд map рдкреНрд░рдХрд╛рд░ рд╣реИ:

m := make(map[string]string)

рдЕрдЧрд▓рд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд chan рдкреНрд░рдХрд╛рд░ рд╣реИ:

c := make(chan bool)

рдЕрдВрдд рдореЗрдВ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп interface{} рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ рдЬрд╣рд╛рдВ рдЬреЗрдиреЗрд░рд┐рдХ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ:

  • heap.Interface (https://golang.org/pkg/container/heap/#Interface)
  • list.Element (https://golang.org/pkg/container/list/#Element)
  • ring.Ring (https://golang.org/pkg/container/ring/#Ring)
  • sync.Pool (https://golang.org/pkg/sync/#Pool)
  • рдЖрдЧрд╛рдореА sync.Map (https://tip.golang.org/pkg/sync/#Map)
  • atomic.Value (https://golang.org/pkg/sync/atomic/#Value)

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

(рдиреЛрдЯ: рдореИрдВ рдпрд╣рд╛рдВ sort.Sort рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)

http://www.yinwang.org/blog-cn/2014/04/18/golang
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдиреНрдпрдерд╛, рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

@bxqgit рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╕рд┐рд╡рд┐рд▓ рд░рдЦреЗрдВред рдХрд┐рд╕реА рдХрд╛ рдЕрдкрдорд╛рди рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

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

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

@bxqgit рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рд░рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рднреА рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде, рдЖрдк рдПрдХ рдЪрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ @riwogo рдиреЗ рдХрд╣рд╛ред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╛рдж рд░рдЦреЗрдВ, рдкреАрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ, рдЬрд┐рд╕реЗ рдЖрдк "рд╕реАрдПрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЧрдгрд┐рдд" рдХрд╣рддреЗ рд╣реИрдВ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд▓реЛрдЧ рднреА рд╣реИрдВ рдЬреЛ "рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ"ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╛рдж рд░рдЦреЗрдВ, рдкреАрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ, рдЬрд┐рд╕реЗ рдЖрдк "рд╕реАрдПрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЧрдгрд┐рдд" рдХрд╣рддреЗ рд╣реИрдВ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд▓реЛрдЧ рднреА рд╣реИрдВ рдЬреЛ "рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ"ред

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

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЬрдЯрд┐рд▓ рд╣реИ рд▓реЗрдХрд┐рди рдЬреЗрдирд░рд┐рдХ рд╕рд░рд▓ рд╣реИ

рд╕реЙрд░реНрдЯ рдкреИрдХреЗрдЬ рдореЗрдВ SortInts, SortFloats, SortStrings рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рдпрд╛ рд╕рд░реНрдЪрдЗрдВрдЯреНрд╕, рд╕рд░реНрдЪрдлреНрд▓реЛрдЯреНрд╕, рд╕рд░реНрдЪрд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ред рдпрд╛ рдкреИрдХреЗрдЬ io/ioutil рдореЗрдВ byName рдХреА рд▓реЗрди, рдХрдо рдФрд░ рд╕реНрд╡реИрдк рд╡рд┐рдзрд┐рдпрд╛рдБред рд╢реБрджреНрдз рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдирдХрд▓ред

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

рдореЗрд░рд╛ рд╡реЛрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд╣рд╛рдБ append рдФрд░ copy рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрдИ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж sort рдФрд░ search рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдореЗрд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдЧрд╛рдпрдм рд╣реИ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реЗрдЯ (https://github.com/golang/go/issues/7088), рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬреИрд╕реЗ slice рдорд┐рд▓ рдЬрд╛рдП map ред рдХрд╛рдо рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ (рдкреНрд░рддреНрдпреЗрдХ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдФрд░ struct рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЪрдпрдирд┐рдд рд╕реЗрдЯ рдФрд░ рдлрд┐рд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрдирд┐рдВрдЧ) рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдиреЛрдЯреЗрд╢рди рд░рдЦреЗрдВред

рдХреГрдкрдпрд╛ $#$ sync.Map рдХреЗ рдмрдЬрд╛рдп smap рдмрд┐рд▓реНрдЯ-рдЗрди рднреА рдХрд░реЗрдВред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП interface{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рджреЛрд╖ рд╣реИред рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдПрдХ рдкреНрд░рдореБрдЦ рдХрд╛рд░рдг рд╣реИред

@pciet

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

рдХреНрдпрд╛ рдЖрдк рдмрд╕ рдПрдХ рдЫреЛрдЯрд╛ (рдЯрд╛рдЗрдк рд╕реЗрдл) рд░реИрдкрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ?
https://play.golang.org/p/tG6hd-j5yx

@pierrre рд╡рд╣ рд░реИрдкрд░ reflect.TypeOf(item).AssignableTo(type) рдЪреЗрдХ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рд▓реЗрдХрд┐рди map + sync.Mutex рдпрд╛ sync.RWMutex рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╣реИ рдЬреЛ sync.Map рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдореЗрд░реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдЖрдЧреЗ var myMapLock = sync.RWMutex{} рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреНрд▓реАрдирд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдореБрдЭреЗ рд╕рд╣реА рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдФрд░ рдореИрдВ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

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

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

@andrewcmyers "рдЬреЗрдиреЗрд░рд┐рдХ рдлреЙрд░ рдЧреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдХрдо рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред" --- рд╕реА # рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреА рддрд░рд╣ред

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

рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЕрдЯрдХрд▓реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реИред

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

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

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

28 рдирд╡рдВрдмрд░, 2017 23:54 рдХреЛ, "рдПрдВрдбреНрд░рдпреВ рдорд╛рдпрд░реНрд╕" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

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

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

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292#issuecomment-347691444 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AJZ_jPsQd2qBbn9NI1wZeT-O2JpyraTMks5s7I81gaJpZM4IG-xv
.

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

@ianlancetaylor Rust рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░ Q T рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдЙрдирдХрд╛ рдЯреЛрдХрд░рд╛ T рдпрд╛ Q рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗред

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

рдлрд┐рд▓рд┐рдк рд╡рд╛рдбрд▓рд░ рднреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдЬрд╛рд╡рд╛ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬреЛ рдЕрдВрддрддрдГ рдЬрд╛рд╡рд╛ рдХреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

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

@DemiMarie рд╣рдордиреЗ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдПрдВрдбреНрд░рдпреВ рдорд╛рдпрд░реНрд╕ рдХреЛ рдпрд╣рд╛рдВ рдкрд┐рдЪ рдХрд┐рдпрд╛ рд╣реИред

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

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

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

  1. рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд╕реЗ рдЪреИрдирд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрдирд╛ рджрд░реНрджрдирд╛рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪреИрдирд▓ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП <- рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ Send рдФрд░ Receive рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЪреИрдирд▓ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкреНрд▓реЗрдЯ Send рдФрд░ Receive рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╡реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╡рд┐рдзрд┐рдпрд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рднрд┐рдиреНрди рдЪреИрдирд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╡реИрд╕реА рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА, рдЬреЛ рдердХрд╛рдК рд╣реИред

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

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

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

http://www.cs.cornell.edu/andru/papers/familia/ (рдЭрд╛рдВрдЧ рдПрдВрдб рдорд╛рдпрд░реНрд╕, OOPSLA'17)
http://io.livecode.ch/learn/namin/unsound (рдЕрдореАрди рдПрдВрдб рдЯреЗрдЯ, OOPSLA'16)
http://www.cs.cornell.edu/projects/genus/ (рдЭрд╛рдВрдЧ рдПрдЯ рдЕрд▓ред, рдкреАрдПрд▓рдбреАрдЖрдИ '15)
https://www.cs.cornell.edu/~ross/publications/shapes/shapes-pldi14.pdf (рдЧреНрд░реАрдирдореИрди, рдореБрдПрд╣рд▓рдмреЛрдПрдХ рдПрдВрдб рдЯреЗрдЯ, рдкреАрдПрд▓рдбреАрдЖрдИ '14)

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

type Item interface {
    Equal(Item) bool
}

type Set interface {
    Add(Item) Set
    Remove(Item) Set
    Combine(...Set) Set
    Reduce() Set
    Has(Item) bool
    Equal(Set) bool
    Diff(Set) Set
}

рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг:

type RemoveCase struct {
    Set
    Item
    Out Set
}

func TestRemove(t *testing.T) {
    for i, c := range RemoveCases {
        if c.Out.Equal(c.Set.Remove(c.Item)) == false {
            t.Fatalf("%v failed", i)
        }
    }
}

рдЗрд╕ рддрд░рд╣ рдореИрдВ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ:

var RemoveCases = []RemoveCase{
    {
        Set: MapPathSet{
            &Path{{0, 0}}:         {},
            &Path{{0, 1}, {1, 1}}: {},
        },
        Item: Path{{0, 0}},
        Out: MapPathSet{
            &Path{{0, 1}, {1, 1}}: {},
        },
    },
    {
        Set: SlicePathSet{
            {{0, 0}},
            {{0, 1}, {1, 1}},
        },
        Item: Path{{0, 0}},
        Out: SlicePathSet{
            {{0, 1}, {1, 1}},
        },
    },
}

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

func (the MapPathSet) Remove(an Item) Set {
    return MapDelete(the, an.(Path))
}
func (the SlicePathSet) Remove(an Item) Set {
    return SliceDelete(the, an.(Path))
}

рдпреЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type Item generic {
    Equal(Item) bool
}
func (the SlicePathSet) Remove(an Item) Set {
    return SliceDelete(the, an)
}

рд╕реНрд░реЛрдд: https://github.com/pciet/pathsetbenchmark

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

рддреЛ рдПрдХ "рдЬреЗрдиреЗрд░рд┐рдХ" рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдЕрджреГрд╢реНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдЬрдм рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдореЗрдХрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

@andrewcmyers "рдлрд╝рдорд┐рд▓рд┐рдпрд╛" рдкреЗрдкрд░ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ (рдФрд░ рдореЗрд░реЗ рд╕рд┐рд░ рдкрд░ рд░рд╛рд╕реНрддрд╛)ред рдПрдХ рдкреНрд░рдореБрдЦ рдзрд╛рд░рдгрд╛ рд╡рд┐рд░рд╛рд╕рдд рдереАред рдЧреЛ рдЬреИрд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреИрд╕реЗ рдмрджрд▓реЗрдЧреА рдЬреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмрдЬрд╛рдп рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ?

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

@andrewcmyers рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЧреЛ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?

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

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

рдореИрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рд▓реЗрдХрд┐рди рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрд╡рд▓реЛрдХрди рдкрдврд╝рдиреЗ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд┐рдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗред рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрд▓рдЧ рд╣реИ?

рдлрд╝рдорд┐рд▓рд┐рдпрд╛ рдФрд░ рдЧреЛ рдХреЗ рдмреАрдЪ рдПрдХ рдареЛрд╕ рддреБрд▓рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧреАред рдЕрдкрдирд╛ рдкреЗрдкрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

рдЧреЛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:

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

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

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

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

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

рдпрджрд┐ рдЖрдк рд╕рд┐рдВрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд░реЗрдВ, рддреЛ рдЖрдк рдХрд┐рддрдиреА рджреВрд░ рдЬрд╛рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рд╣рд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд░рдЦрддреЗ рд╣реИрдВ?
sync.Map рдПрдХрдорд╛рддреНрд░ рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИрдВред

@Azareal : @chowey рдиреЗ рдЗрдиреНрд╣реЗрдВ рдЕрдЧрд╕реНрдд рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдерд╛:

рдЕрдВрдд рдореЗрдВ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ рдЬрд╣рд╛рдВ рдЬреЗрдирд░рд┐рдХ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛:

тАв рдвреЗрд░.рдЗрдВрдЯрд░рдлреЗрд╕ (https://golang.org/pkg/container/heap/#Interface)
тАв list.Element (https://golang.org/pkg/container/list/#Element)
тАв рд░рд┐рдВрдЧ.рд░рд┐рдВрдЧ (https://golang.org/pkg/container/ring/#Ring)
тАв рд╕рд┐рдВрдХ.рдкреВрд▓ (https://golang.org/pkg/sync/#Pool)
тАв рдЖрдЧрд╛рдореА рд╕рд┐рдВрдХ.рдореИрдк (https://tip.golang.org/pkg/sync/#Map)
тАв рдкрд░рдорд╛рдгреБ рдореВрд▓реНрдп (https://golang.org/pkg/sync/atomic/#Value)

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

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

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

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЧреЛ 1 рдХреЗ рд╕рд╛рде рдЙрдЪрд┐рдд рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ рдЬреЛ рдЗрди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдФрд░ рдмрд┐рдирд╛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рдорд╛рди рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЧреЛрд▓рд╛рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд╣реИрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рджреЛ рдЪреАрдЬреЛрдВ рдкрд░ рдХрд╛рдмреВ рдкрд╛рддреА рд╣реИрдВ (рдЬреЛ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИрдВ!):

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

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

1.) рдХрднреА-рдХрднреА рдЖрдк рдХреЗрд╡рд▓ рдЕрдЬреНрдЮрд╛рдд рд╕рдореВрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ int, float64 рдФрд░ string рдХрд╛ рд╕рдореВрд╣ред рдЖрдкрдХреЛ рдРрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдирд╛рдо рдХреИрд╕реЗ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдиреНрдпреВрдореЗрд░рд┐рдХреИрдВрдбрд╕реНрдЯреНрд░рд┐рдВрдЧ?

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

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

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

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

рдпрд╣рд╛рдБ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЖрдЬ рд╕рд╛рдорд╛рдиреНрдп рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реЗрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ: https://github.com/pciet/unordered

рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдкреИрдЯрд░реНрди (рдзрдиреНрдпрд╡рд╛рдж @pierrre) рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рди-рдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдЬрд╛рдВрдЪ рднреА рдХрд░рддреЗ рд╣реИрдВред

рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЬрд░реВрд░рддреЗрдВ рд╣реИрдВ? рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддрд┐ рдореЗрд░рд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░рд╡реИрдпрд╛ рдкрд╣рд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗрдВрджреНрд░рд┐рдд рдерд╛ {}; рдореЗрд░реА рд╢рд┐рдХрд╛рдпрдд рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдХреЗрдЬ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ {} (рдЬреИрд╕реЗ type Item interface{} pciet/unordered рдореЗрдВ) рдЬреЛ рдЗрдЪреНрдЫрд┐рдд рдЧреИрд░-рд╡реНрдпрдХреНрдд рдмрд╛рдзрд╛рдУрдВ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИ, рдЬрдм рд╕рд┐рд░реНрдл рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдпреБрджреНрдз-рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рджреЗрдЦреЗрдВ https://github.com/golang/go/issues/23077)ред

рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЖрдкрдХрд╛ рдХреЛрдб рдЯрд╛рдЗрдк-рдЪреЗрдХ (рдФрд░ рдЙрд╕ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ interface{} рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИ)ред рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЖрдк рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рдереЗред

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

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

рд░рди-рдЯрд╛рдЗрдо рдЪреЗрдХ рдХреЛ рдЕрд╕реЗрдЯрд┐рдВрдЧ = рдЕрд╕рддреНрдп . рд╕реЗрдЯ рдХрд░рдХреЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рддреЛ рдХреБрдЫ рднреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛

рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрддрдо-рдкреНрд░рджрд░реНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╡реИрд╕рд╛ рдирд╣реАрдВ рдХрд╣рд╛ред рдЯрд╛рдЗрдк рд╕реЗрдлреНрдЯреА рдмрд╣реБрдд рдмрдбрд╝реА рдмрд╛рдд рд╣реЛрдЧреАред рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдЕрднреА рднреА interface{} -рд╕рдВрдХреНрд░рдорд┐рдд рд╣реИред

рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рддреЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рджреВрд╕рд░реЛрдВ рдХреЛ рдРрд╕реА рдЪреАрдЬ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

@pciet

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

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

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

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

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

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

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

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

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

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

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

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

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

@ dc0d рдЬреЗрдиреЗрд░рд┐рдХ рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕реБрд╡рд┐рдзрд╛ рдПрдХ рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдЬреЛрдбрд╝рддреА рд╣реИ: https://gist.github.com/pciet/36a9dcbe99f6fb71f5fc2d3c455971e5

@pciet рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рдирдВрдмрд░ 4, рдирдореВрдирд╛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдЪреИрдирд▓ (рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ) рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдирдХреНрд╢реЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ред рдФрд░ рдЪреВрдВрдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░реИрдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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

  • рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд
  • рд╕рд░рд▓ (рдПрдХрд▓ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░, рдЬреЛ _feels_ рдЬреИрд╕реЗ _this_ рдЕрдиреНрдп OO рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ)

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

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

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

Afaics, рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдВрд╢ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдХреА рдХрдореА рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдмрддрд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, _ "рдРрд╕рд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА T рдХреЗ рд▓рд┐рдП рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЖрдкреВрд░реНрддрд┐ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ T рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдХрд╛ рдорд╛рди рджреЗрддрд╛ рд╣реИ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдЯреАред тАЭ_ред

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

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

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

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

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

рдпрджрд┐ рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ (рдЬреИрд╕реЗ struct ) рдкрд░ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рдЯрд╛рдЗрдк рдЯреА рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ T<U> ред рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдЬрд┐рдиреНрд╣реЗрдВ U рдХреЗ рдЬреНрдЮрд╛рди рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ (HKT) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреЗрдирд░рд┐рдХ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдмрд╣реБрд░реВрдкреА рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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


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

рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд░рд╕реНрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рдорд╛рди рдПрдХ рдкреНрд░рдгрд╛рд▓реА, рдЬрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реАрдорд╛ рд╕реЗ рд╡рд┐рд╡рд╢ рд╣реИрдВред

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

@ рдПрд▓реЗрдХреНрд╕ рдиреЗ рд▓рд┐рдЦрд╛:

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

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

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

  • https://golang.org/doc/faq#covariant_types

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ рдХрд┐ рдпрджрд┐ рднрд╛рд╖рд╛ рдпреВрдирд┐рдпрдиреЛрдВ рдФрд░ рдЪреМрд░рд╛рд╣реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рддреЛ рд╡рд┐рд░рд╛рд╕рдд рдкрджрд╛рдиреБрдХреНрд░рдо (рдЙрд░реНрдл рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ) рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ) рдФрд░ (рдлрд╝рдВрдХреНрд╢рди рдЖрдЙрдЯрдкреБрдЯ) рдкрд░ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП $#$ 0 int ╬╜ string int рдпрд╛ string рд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди int ╬╜ string рд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╡рд┐рд╖рдо рдХрдВрдЯреЗрдирд░/рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдПрдХрдорд╛рддреНрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЗ рдЙрдк-рд╡рд░реНрдЧреАрдХрд░рдг рдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдмрдВрдзреЗ рдмрд╣реБрд░реВрдкрддрд╛ (рдЬрдВрдЧ рдореЗрдВ рдЙрд░реНрдл тАЛтАЛтАЛтАЛрд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдПрдВ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдорд╛рддреНрд░рд╛ рдХрд╛ рдард╣рд░рд╛рд╡) рд╣реИрдВред рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдФрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЯреНрд░реЗрдбрдСрдлрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╣реИред рдЕрдлреИрдХ, рдЧреЛ рдореЗрдВ рд╡рд┐рд╖рдо рдХрдВрдЯреЗрдирд░/рд╕рдВрдЧреНрд░рд╣ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЕрдм рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЦрд╛рд▓реА interface{} рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдлреЗрдВрдХ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд╕реНрдЯ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдирд┐рд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ 2 рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд┐рдВрджреБ рдХреЛ рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИред

рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП "рдПрдВрдЯреА-рдкреИрдЯрд░реНрди" рдЙрд░реНрдл тАЛтАЛрд╡рд░реНрдЪреБрдЕрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ (cf рднреА "EDIT # 2" рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдмрдорд┐рд╢рди рдФрд░ рд╕рдорд╛рдирддрд╛, рдЖрджрд┐ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ) рдЙрдк-рд╡рд░реНрдЧреАрдХреГрдд рдХрд░ рд░рд╣рд╛ рд╣реИред

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

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

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

Java рдФрд░ C# рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╡рд┐рдкрд░реАрдд, Genus рдЬреЗрдирд░рд┐рдХ рдореИрдХреЗрдирд┐рдЬреНрдо рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИред

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

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

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

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

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

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

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

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

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

Afaics, Go_ рдореЗрдВ _Type Parameters рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, @ianlancetaylor рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордирд╛ рдХреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ (afaics) рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реИ:

рдХреНрдпрд╛ рд╣рдо рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП SortableSlice рдФрд░ PSortableSlice рдХреЛ рдорд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХрд╛рдлреА рдирд╣реАрдВ; рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ Less рд╡рд┐рдзрд┐ рдпрд╛ рдПрдХ рдмрд┐рд▓реНрдЯрд┐рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ SortableSlice.Less рдХреЛ Less рд╡рд┐рдзрд┐ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рддрддреНрдХрд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдирд╣реАрдВред

[]T рдХреЗ рд▓рд┐рдП Less рдкрджреНрдзрддрд┐ рдкрд░ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдмрд╛рдЙрдВрдб (рднрд▓реЗ рд╣реА рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛ) рдХреЗ рд▓рд┐рдП requires Less[T] рдХреНрд▓реЙрдЬ []T T рдкрд░ рд╣реИ рди рдХрд┐ []T ред рдкреНрд░рддреНрдпреЗрдХ T рдХреЗ рд▓рд┐рдП Less[T] рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ (рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ Less рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ) рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╛ рддреЛ рд╡рд┐рдзрд┐ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдпрд╛ < рдЕрд╕рд╛рдЗрди рдХрд░реЗрдЧрд╛ U[T] рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрджрд┐ Sortable[U] рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ U рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП []T ред рдЕрдлреЗрдпрд░ @keean рдХреЗ рдкрд╛рд╕ T рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрд░рдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдЪрдХреЗрдЯреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ []T рдХреЗ рд▓рд┐рдП рд╡реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ Sortable[U] рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд░рд╣реА рд╣реИрдВ, рдЬрд╣рд╛рдВ U []T рд╣реИред

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

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

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ @keean рдпрд╣рд╛рдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА рд╣реИред рдореЗрд░реЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдореЗрдВ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

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


рд╕рд╛рдЗрдХрд┐рд▓ рдЕрдиреБрднрд╛рдЧ рдЧрд▓рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдПрдХ struct рдХреЗ S[T]{e} рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЪрдпрди рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╣ рд╕рдВрднрд╡рддрдГ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

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

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

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╕рд╣реА рддрдХрдиреАрдХреА рд╢рдмреНрдж рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рд╣реИред

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

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

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

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

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

рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ: рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЕрдиреБрднрд╛рдЧ:

рджреЛрд╖

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

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

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

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

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

  • рдЧрд╣рди рдЕрдиреБрдХреВрд▓рди рдмрд╣реБрдд рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд╕рдВрджрд░реНрдн рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред

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

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

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди:

  • рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рд╕рд░рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

    • рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХреЗ рдмрдЬрд╛рдп рдорд╛рдирдЪрд┐рддреНрд░ [int] рд╕рдВрд░рдЪрдирд╛ {} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рд░реЙрдм рдкрд╛рдЗрдХ (рдФрд░ рдореИрдВрдиреЗ рдЙрд╕реЗ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рдмрдирд╛рддреЗ рд╣реБрдП рднреА рджреЗрдЦрд╛) рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХрдВрдЯреЗрдирд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рд╣рдореЗрдВ T рдореЗрдВ map[T] рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЗрдирдкреБрдЯ, рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ struct рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВред рдХреЗрд╡рд▓ рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдЬреЗрдирд░рд┐рдХ рдЬреЗрдиреЗрд░рд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рд╕реАрдорд┐рдд рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдФрд░ рдПрдХ рднрд╛рд╖рд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдирд┐рдпрдорд┐рддрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рдмрдврд╝реЗ рд╣реБрдП рд╕реНрддрд░ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреА рдХрдо рд╕рдВрдЧрддрддрд╛ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЛрдмрд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдХрд┐ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ:

рдкреИрдХреЗрдЬ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕
рдпрд╣ рдореЛрдбреБрд▓рд╛ -3, OCaml, SML (рддрдерд╛рдХрдерд┐рдд "рдлрд╝рдВрдХреНрдЯрд░"), рдФрд░ Ada рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдкреВрд░рд╛ рдкреИрдХреЗрдЬ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдЖрдк рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдмрдирд╛рддреЗ рд╣реИрдВред

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

рдмрд▓реНрдХрд┐ рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╣ рдкреИрдХреЗрдЬ (рдЙрд░реНрдл рдореЙрдбреНрдпреВрд▓) рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреЗрд╢рди struct , interface , рдФрд░ func рдХреЗ рд╕рдореВрд╣ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░-рдкреНрд░рдгрд╛рд▓реА
рд╣рд╛рд╕реНрдХреЗрд▓ рдФрд░ рд░рд╕реНрдЯ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрдкрдирд╛рддреЗ рд╣реИрдВред
[тАж]
рджреЛрд╖:

  • рд╕рд░рд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (https://groups.google.com/d/msg/golang-nuts/smT_0BhHfBs/MWwGlB-n40kJ)

рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ @ianlancetaylor рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:

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

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

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

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

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдХ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдореМрдЬреВрджрд╛ рдореИрдиреБрдЕрд▓ рддрд░реАрдХреЗ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ рддреЛ рдЧреЛ рдЬреЗрдирд░рд┐рдХ рдореЙрдбрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рдкрдврд╝рд╛ рд╣реИ рдХрд┐ @andrewcmyers рд╕реНрдЯреЗрдЯреНрд╕ рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реИ ), рдпрд╣ рдХрдо рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧреА рддрд╛рд▓рдореЗрд▓ рдвреВрдВрдв рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЛ interface рдХреЗ рд╕рд╛рде рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ $ struct #$ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЯрдкрд▓ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдпрд╛ @jba рдиреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрдирд▓рд╛рдЗрди interface рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ . рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ struct рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ type рдХреЗ рд╕рд╛рде рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдПрдХ interface рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИ рдЬреЛ рдПрдХ рдФрд░ interface рдЗрдирдкреБрдЯ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдЪрдХреЗрдЯреА рд╕реЗ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ, рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдпрд╣рд╛рдВ рд▓рд┐рдЦрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬрдм рдореБрдЭреЗ рдЗрддрдиреА рдиреАрдВрдж рдирд╣реАрдВ рдЖ рд░рд╣реА рд╣реИред

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

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

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


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

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

рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЕрдЯрдХрд▓реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реИред

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

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

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

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

рдореЗрд░рд╛ рд╡реЛрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд╣рд╛рдБ append рдФрд░ copy рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрдИ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж sort рдФрд░ search рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

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

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

@ рд╢реЗрд▓реНрдмреА3

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

рдЧреЛ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд░реИрдкрд░ рдкреИрдЯрд░реНрди рджреЗрдЦреЗрдВред

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

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

@pciet рдпрд╣ рдХреЛрдб рд╕рдЪрдореБрдЪ рд╕рдЯреАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ @ shelby3 рдПрдХ рдПрдВрдЯреАрдкреИрдЯрд░реНрди рдХрд╛ рд╡рд░реНрдгрди рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЙрджреНрдзреГрдд рдХрд░рдирд╛:

рдпрд╣ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдкреИрдЯрд░реНрди (рдзрдиреНрдпрд╡рд╛рдж @pierrre) рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рди-рдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдЬрд╛рдВрдЪ рднреА рдХрд░рддреЗ рд╣реИрдВред

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

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:

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

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

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

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

type Foo interface {
    ...
}

type Bar interface {
    ...
}

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

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

func baz<T Foo + Bar>(t T) {
    ...
}

@tarcieri

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

рдмрд╕ рдРрд╕реЗ рд╣реА:

type T interface {
    Foo
    Bar
}

func baz(t T) { ... }

@sbinet рд╕рд╛рдл, TIL

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

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

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд░рд┐рдп рд▓рдЧрддрд╛ рд╣реИ
рдпрд╣рд╛рдБ рдПрдХ рд╕реНрдЯреНрд░реЛрдореИрди рдкреНрд░рд╕реНрддрд╛рд╡ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╣реИ
https://go-li.github.io/test.html
рдпрд╣рд╛рдБ рд╕реЗ рд╕рд┐рд░реНрдл рдбреЗрдореЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ
https://github.com/go-li/demo

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЬреЛ рднреА рдЬреЗрдирд░рд┐рдХ рдЕрдкрдирд╛рддреЗ рд╣реИрдВ, рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░рддреЗ рд░рд╣реЗрдВ!

@anlhord рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХрд╣рд╛рдВ рд╣реИрдВ? рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдХрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреНрдпрд╛ рд╣реИрдВ? рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдХреНрдпрд╛ рд╣реИрдВ?

рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рд▓рд┐рдВрдХ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕рдВрднрд╛рд╡рд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИ:

package main

import "fmt"

func main() {
    fmt.Println("Hello, playground")
}

рд╡рд╣ рдХреЛрдб рдореБрдЭреЗ рдХреБрдЫ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдореИрдВ рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА рд╣реЛрдЧреАред

@ рдЬреЛрд╣реЛ рдиреЗ рд▓рд┐рдЦрд╛:

рдХреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдкрд░ рдХрд┐рд╕реА рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдХрд╛рджрдорд┐рдХ рд╕рд╛рд╣рд┐рддреНрдп рдХрд╛ рдХреЛрдИ рдорд╣рддреНрд╡ рд╣реЛрдЧрд╛?

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

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

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

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

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

рдореИрдВрдиреЗ рдХреБрдЫ рдирд┐рдЬреА рдЪрд░реНрдЪрд╛ @keean рд▓рд┐рдЦреА рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ ML рдлрд╝реИрдХреНрдЯрд░ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдо рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ред рд╣рд╛рдЗрд▓рд╛рдЗрдЯреНрд╕ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ:

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

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

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

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

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

рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рд░рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЧреЛ 1.xy рд╕реНрд░реЛрдд рдХреЛрдб рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдиреЗрд░рд┐рдХ рд╕реНрд░реЛрдд рдХреЛрдбред

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

@bcmills рдиреЗ рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди-рд╕рдордп рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛:

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

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

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

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

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

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

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


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

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

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


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

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдореИрдХреНрд░реЛ-рд╕реНрдЯрд╛рдЗрд▓ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛, рдЪрд╛рд╣реЗ рд╡рд╣ gen, cpp, gofmt -r, рдпрд╛ рдЕрдиреНрдп рдореИрдХреНрд░реЛ/рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреВрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдорд╛рдирдХреАрдХреГрдд рд╣реЛред рдЗрд╕рдореЗрдВ рд╕реА ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЬреИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ: рдХреЛрдб рдмреНрд▓реЛрдЯ, рдореЙрдбреНрдпреВрд▓рд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреА рдХрдореА рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ рдХрдард┐рдирд╛рдИред рдЬреИрд╕реЗ рд╣реА рдЖрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдФрд░ рднреА рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдмрдирд╛рдирд╛ред рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ, рдлрд╛рдпрджреЗ рд╕реАрдорд┐рдд рд╣реИрдВ: рдпрд╣ рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛ рдФрд░ рдпрд╣ рдХреБрд╢рд▓ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ - рдЬрдм рддрдХ рдХрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреИрд╢ рджрдмрд╛рд╡ рди рд╣реЛ, рдЖрдзреБрдирд┐рдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдерд┐рддрд┐!

@keean рдЖрдкрд╕реЗ рд╕рд╣рдордд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

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

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

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

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

рдпрд╣ рдХрдерди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рджреАрд░реНрдШрд╛рд╡рдзрд┐ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛-рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛-рд╕рдВрд░рдЪрдирд╛ рдЕрдХреНрд╕рд░ рд╡рд┐рднрд┐рдиреНрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ https://www.scala-lang.org/api/2.12.3/scala/collection/immutable/List.html рджреЗрдЦреЗрдВред

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

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

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

рдХрдИ рд╕рдорд╛рди рдПрдкреАрдЖрдИ рдХреЗ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рдкреБрди: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рджреЗрдЦреЗрдВрдЧреЗред

рдпрд╣ рдПрдХ рд╡реИрдз рдХреЙрди рдирд╣реАрдВ рд╣реИред

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

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

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

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

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди:

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

рдкреИрдХреЗрдЬ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕

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

рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╢рдмреНрдж рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

рдХреНрдпрд╛ рдЖрдк рдЕрдЧрд▓реА рдмрд╛рд░ рд╕реАрдзреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╣реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ/рд╕рдВрдкрд╛рджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ https://www.scala-lang.org/api/2.12.3/scala/collection/immutable/List.html рджреЗрдЦреЗрдВред

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

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

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

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

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

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

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

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

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

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

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

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

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

рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╢рдмреНрдж рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЖрд╡рд╛рдЬ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдЬреЛ рдЧреЛ рдореЗрдВ рдХреБрдЫ рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд▓реАрдХреГрдд рдЯреЗрдореНрдкрд▓реЗрдЯрд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЬреЗрдиреЗрд░рд┐рдХ рд╣реИред IOW, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЙрдЪрд┐рдд рдХрд╛рдордХрд╛рдЬреА рдЬреЗрдирд░рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдЬреЛ рдЦрд░рд╛рдм рдЬрдбрд╝рддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд▓реАрдХреГрдд рдбрд┐рдЬрд╛рдЗрди рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реИред рдЕрдлреИрдХ, рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдЪрд╛рд░рд┐рдд рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд┐рджреНрдз рд╕рдордЧреНрд░ рдбрд┐рдЬрд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред @larsth рдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрд╕рдХреА рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдЧрдВрднреАрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдмрдирд╛рдиреЗ (рдпрд╛ gccgo рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рдПрдХ рдХрд╛рдВрдЯреЗ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ) рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╣рдо рд╕рднреА рдЗрд╕рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭ рд╕рдХреЗрдВред рдореБрдЭреЗ рдЕрдкрдереНрд░реЗрдб рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ @ianlancetaylor рдиреЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЧреЛ рдореЗрдВ рдЦрд░рд╛рдм рдЬрдбрд╝рддрд╛ рдХрд╛ рдкреНрд░рджреВрд╖рдг рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдкреИрдХреЗрдЬ рд╕реНрддрд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреЗрд╢рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рд┐рдХрд╛рдпрдд рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрднреА рднреА рдЗрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреГрдкрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрдирд╛рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рднреА рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╣рдо рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдкрд╕рдВрдж рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВред рдЯреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдо рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдкреАрдЫреЗ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╢рд╛рдпрдж рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рднреА рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдХреИрд╕реЗ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдкреИрдХреЗрдЬ рдХреЛ рджреВрд╕рд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рднреА рд╣реИред IOW, рдпрджрд┐ рдХреЛрдИ рдкреИрдХреЗрдЬ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рднреА рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣ рдмрддрд╛ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдкреИрдХреЗрдЬ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛, рди рдХрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ред

рдорд╛рдлреА рдЗрддрдиреА рд▓рдВрдмреА рд╣рд╡рд╛ред рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрд╛ рдЧрдпрд╛ рд╣реИред

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

"рдкреИрдХреЗрдЬ рдЯреЗрдореНрдкреНрд▓реЗрдЯ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рджреЛ рд░реВрдк рд╣реИрдВ (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВ):

  1. "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдЖрдзрд╛рд░рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкреИрдХреЗрдЬ,
  2. рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдХреЗрдЬред

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

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

рддреЛ, рд╣рд╛рдБ, рдЖрдк рджреВрд╕рд░реЗ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@larsth рдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрд╕рдХреА рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдЧрдВрднреАрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдмрдирд╛рдиреЗ (рдпрд╛ gccgo рдлреНрд░рдВрдЯрдПрдВрдб рдХреЗ рдПрдХ рдХрд╛рдВрдЯреЗ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ) рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╣рдо рд╕рднреА рдЗрд╕рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭ рд╕рдХреЗрдВред

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

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

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

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

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

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

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

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

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

рдЬрд╝рд░реВрд░, рдореЗрд░реЗ рдПрдбрд╛ рдЧреЛ-рдмреЛрд░реНрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: https://github.com/keean/Go-Board-Ada/blob/master/go.adb

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХреА рдПрдХ рдХрд╛рдлреА рдвреАрд▓реА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рдХреЛрдб рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕реА ++ рд╕рдВрд╕реНрдХрд░рдг, рдФрд░ рдЗрд╕рдХреЗ рдУрдкрди-рд╕реЛрд░реНрд╕ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк C++ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/keean/Go-Board/blob/master/go.cpp

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

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

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

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

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

@ рдХреАрди рдиреЗ рд▓рд┐рдЦрд╛ :

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

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

рдореИрдВрдиреЗ рдЕрдкрдереНрд░реЗрдб рднреА рдХрд╣рд╛ рдерд╛:

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


@ рдХреАрди рдиреЗ рд▓рд┐рдЦрд╛:

[...] рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╢реБрджреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреЛ рдХрд┐ рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдкрд░ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЪрд░ рдирд╣реАрдВ рд╣реИ)

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

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

рддреЛ, рд╣рд╛рдБ, рдЖрдк рджреВрд╕рд░реЗ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

@ рдХреАрди рдиреЗ рд▓рд┐рдЦрд╛:

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

рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЖрдк рдХреНрдпрд╛ рд╕рдордЭрддреЗ рд╣реИрдВ ? (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдЙрдирдХрд╛ рдорддрд▓рдм "рдЧреИрд░-рдореВрд▓реНрдп-рдирд┐рд░реНрднрд░" рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реИ, рдпрд╛рдиреА " рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ [рд░рдирдЯрд╛рдЗрдо?] рддрд░реНрдХ ['s рдкреНрд░рдХрд╛рд░] рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ") рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП int рдбреЗрдЯрд╛, рдЬреИрд╕реЗ рдЗрджрд░реАрд╕ рдореЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЙрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдиреАрдЪреЗ рддрддреНрдХрд╛рд▓ рдореЙрдбреНрдпреВрд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ (рдпрд╛рдиреА рдЯреНрд░реИрдХрд┐рдВрдЧ) рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдРрд╕реЗ рдкреЙрд▓рд┐рдореЙрд░реНрдлрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ? рдХреНрдпрд╛ рдРрд╕реЗ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬреНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд░рдирдЯрд╛рдЗрдо рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдЬреНрдо рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ? F-ing рдореЙрдбреНрдпреВрд▓ рдиреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо F рдореЗрдВ ML рдореЙрдбреНрдпреВрд▓ рдХреА рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП " рдЖрд╢реНрд░рд┐рдд " рдкреНрд░рдХрд╛рд░ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред рдЕрдЧрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @rossberg рдиреЗ рд╕рднреА рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЙрдбрд▓ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдореИрдВрдиреЗ рдЗрд╕рдХреА рджреЗрдЦрд░реЗрдЦ рдХреА рд╣реИ?

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

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

рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдпрдерд╛ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП newtype рд░реИрдкрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред Afaics, @keean рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд Relation рдХреЗ рд╕рд╛рде рдирд┐рд╣рд┐рдд рдЪрдпрди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рд╕реЙрд░реНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд┐рдпрд╛, рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдкрд┐рдВрдЧ data рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХреНрдпрд╛ рдРрд╕реА рд░рдгрдиреАрддрд┐ рдкреНрд░рддрд┐рд░реВрдкрдХрддрд╛ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдорд╛рдзрд╛рди (рдЬреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдкреНрд░рддрд┐рд░реВрдкрдХрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдПрдХ рдЕрдирд╛рде рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдЕрдирд╛рде рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдХреЗ рдЬреЛ рдЕрдирд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рднреА рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ interface рдкрд░ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд╣рд┐рдд рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдХрд┐рд╕реА рдЕрдиреНрдп 2 рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ) рддреЛ рд╕рдорд╛рди рдореВрд▓реНрдп рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдХрд╕реНрдЯрдо рдорд╛рдиреЛрдВ рдХреА рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо-рд╕реАрдорд╛рдВрдХрд┐рдд рд╕реВрдЪреА рдореЗрдВ (рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ implement рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд╛рдордХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд, рдореЙрдбреНрдпреВрд▓рд░ рдорд┐рд▓рд╛рди рд╣реИ)ред рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо-рд╕реАрдорд╛рдВрдХрд┐рдд рд╕реВрдЪреА рдЗрд╕рд▓рд┐рдП рд╣реИ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдбрд┐рдЧреНрд░реА-рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдореЗрдВ рд╡рд┐рднреЗрджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕рдореЗрдВ рджреЛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдПрдВ рд╣реИрдВред рд╡рд╛рдВрдЫрд┐рдд рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рд╢реЗрд╖ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдпрд╛ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░, рдЬреИрд╕реЗ f<non-default>(тАж) ред

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

[тАж] рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рд░рд┐рдХрд░реНрд╕рди рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде (рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдРрд╕реЗ рд░реВрдк рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдХреЗрд╡рд▓ рдЙрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдкреБрд╖реНрдЯрд┐ рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддрд╛ рд╣реИ)ред

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

1 рдЬрд┐рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ HKT рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ SET рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ elem рдкреНрд░рдХрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ set рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ set<elem> рдирд╣реАрдВ рд╣реИ

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

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

func pick(a CollectionOfT, count uint) []T рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реЛрдЧрд╛ (https://github.com/golang/go/issues/23717 рд╕реЗ):

// pick returns a slice (len = n) of pseudorandomly chosen elements 
// in unspecified order from c which is an array, slice, or map.
for i, e := range pick(c, n) {

рдпрд╣рд╛рдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрдЯрд┐рд▓ рд╣реИред

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░реНрдм рд╕рдЯрд░ рдПрдХ рд╣реА рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрдпрд╛ рд╣реИ: рд╕реА ++ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдм рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ ред

рдЗрд╕рдореЗрдВ рдЧреЛ reflect рдкреИрдХреЗрдЬ рдФрд░ рдЧреЛ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╣рд▓реЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рддрддреНрд╡ рд╕рдорд╛рди рд╣реИрдВред

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

рдмреАрдЖрд░ Chr.

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ:

constraint[T] Array {
    :[#]T
}

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

type [T] Array constraint {
    _ [...]T
}

рдЬреЛ рдЕрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдореЗрд░реЗ рдкрд╛рд╕ рдЬрд╛рдУред :-)

рдпрд╣рд╛рдВ рдХрдИ рддрддреНрд╡ред

рдПрдХ рдЪреАрдЬрд╝ : рдХреЛ _ рд╕реЗ рдмрджрд▓ рд░рд╣реА рд╣реИ рдФрд░ # рдХреЛ ... рд╕реЗ рдмрджрд▓ рд░рд╣реА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдФрд░ рдЪреАрдЬ constraint[T] Array рдХреЛ type[T] Array constraint рд╕реЗ рдмрджрд▓ рд░рд╣реА рд╣реИред
рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдзрд╛рдПрдВ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИред рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рдмрд╛рдзрд╛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ рдкрд░ рдПрдХ _predicate_ рд╣реИ, рдЕрд░реНрдерд╛рддред рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ рд╕реЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдкрд┐рдВрдЧ { true , false }ред
рдпрд╛ рдпрджрд┐ рдЖрдк рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ _a рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реЗрдЯред
рдпрд╣ _a_ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдмреАрдЖрд░ Chr.

рд╡рд╣ constraint рд╕рд┐рд░реНрдл рдПрдХ interface рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

type [T io.Writer] List struct { 
    element T; 
    next *List[T];
}

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

рд╕рд╛рде рд╣реА, рдпрджрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕реА рд░реВрдк (#19412) рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

// similar to the map[T]... syntax
// also no constraint
type List[T] struct {
    element T
    next *List[T]
}

// with constraint
type List[T] struct {
    element T
    next *List[T]
} where T is io.Writer | encoding.BinaryMarshaler

type BigConstraint constraint {
     io.Writer
     SomeFunc() int
     AnotherFunc()
     AField int64
     StringField string
}


// with predefined constraint
type List[T, U] struct {
    element T
    val U
    next *List[T, U]
} where T is BigConstraint | encoding.BinaryMarshaler,
    U is io.Reader

@urandom : рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдлрд╛рдпрджрд╛ рд╣реИред рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ @surlykke рдкреНрд░рд╕реНрддрд╛рд╡ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрддреНрдорд╛ рдореЗрдВ рдЕрдиреНрдп рдЧреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИред

@surlykke рдореИрдВ рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдпрджрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рдЙрддреНрддрд░ рд╣реИред

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

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

рд╕рдВрдЧреНрд░рд╣ рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рд╣реИ:

// An unordered collection of comparable items.
type [T Comparable] Set []T

func (a Set) Diff(from Set) Set {
    // the implementation is the same as one with
    //     type Comparable interface { Equal(Comparable) bool }
    //     type Set []Comparable
}

// compile error
d := Set[int]{1, 2}.Diff(Set[string]{тАЬabcтАЭ, тАЬdefтАЭ})

// Go 1, easier to read but runtime error
d := Set{1, 2}.Diff(Set{тАЬabcтАЭ, тАЬdefтАЭ})

рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЧреЛ 1 рдЬреЗрдирд░рд┐рдХ рдкрд░ рдПрдХ рдмрдбрд╝реА рдЬреАрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрдардиреАрдпрддрд╛ рдЯреНрд░реЗрдбрдСрдлрд╝ рд╣реИрдВред

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

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

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

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

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

func equal[T](x, y T) bool
    where T is runtime.Equitable {
    return x == y
}

func copyable[T](x, y []T) int {
    return copy(x, y)
}

рдпрд╛ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫред

рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмрд┐рд▓рд┐рдиреНрд╕ рдХреЗ рд╕рд╛рде рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдПрдбреЗрдкреНрдЯрд░ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рднрд╛рд╖рд╛ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдмреНрд▓реЛрдЯ рд╕реЙрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред https://github.com/golang/go/issues/16721 рдФрд░ рд╕реЙрд░реНрдЯ.рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдкреАрдЫреЗ рдХрд╛ рдкреВрд░рд╛ рдХрд╛рд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд░реЗрдВ?
https://github.com/golang/go/issues/21670#issuecomment -325739411 рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, @ рд╕рдЬрдорд╛рдиреА рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╢рд╛рдмреНрджрд┐рдХ рд╣реЛрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд┐рд▓реНрдЯрд┐рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрдЯрд░реЗрдЯрд░ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рджреЗрдЦреЗрдВ:

type [T] Iterator interface {
    Next() (elem T, done bool)
}

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

func SliceIterator(slice []T) Iterator {
    i := 0
    return Iterator{
        Next: func() (elem int, done bool) {
            v := slice[i]
            if i+1 == len(slice) {
                return v, true
            }
            i++
            return v, false
        },
    }
}

func main() {
    arr := []int{1,2,3,4,5}
    // SliceIterator works for an arbitrary slice
    print(SliceIterator(arr))
}

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

type ListNode struct {
    v string
    next *ListNode
}
func (l *ListNode) Iterator() Iterator {
    ptr := l
    return Iterator{
        Next: func() (elem int, done bool) {
            v := ptr.v
            if ptr.next == nil {
                return v, true
            }
            ptr = ptr.next
            return v, false
        },
    }
}

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

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

@pciet рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Comparable рдмрд╛рдзрд╛/рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рдеред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрд╕реНрдХрд░рдг):

type Comparable interface { Equal(Comparable) bool }
type Set []Comparable

рдлрд┐рд░ рдЖрдк Comparable рдХреЛ Set рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

constraint [T] Comparable { Equal(t T) bool }
type [T Comparable[T]] Set []T
...
type FooSet Set[Foo] // Where Foo satisfies constraint Comparable

рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ Foo FooSet $#$ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╣ рдордЬрдмреВрдд рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╣реИред

@urandom рдлрд┐рд░ рд╕реЗ, рдореИрдВ рдЗрд╕рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ:

type MyConstraint constraint {....}

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

var myVar MyConstraint

рдЬреЛ рдореБрдЭреЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдПрдХ рдФрд░ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдмрд╛рдзрд╛рдПрдВ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред

@urandom рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ рдкрд░: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдареАрдХ рдмрдЧрд▓ рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

func MyFunc(i) {
     if (i>0) fmt.Println("It's positive")
} with i being an integer

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

@surlykke
рдореИрдВ рдареАрдХ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдПрдХ рдирд╛рдо рд╣реИ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд░рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣реЛрдЧрд╛:

func MyFunc[I](i I) int64
     where I is being an integer {
   return 42
}

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

рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП @surlykke , рдХреНрдпрд╛ рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рд╛рдБ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4

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

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

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

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

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рджреГрд╢реНрдп: рдпрджрд┐ рд╣рдо рдЧрдгрд┐рдд/рдмрд┐рдЯреНрд╕ рдкреИрдХреЗрдЬ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ uintXX $ рдХреЗ рд▓рд┐рдП OnesCount рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░-рдЕрднрд┐рдХрдерди рдХрд░рдирд╛ рдПрдХ рдХреБрд╢рд▓ рдмрд┐рдЯ-рдореИрдирд┐рдкреБрд▓реЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реЛрдиреЗ рдХреА рдмрд╛рдд рдХреЛ рд╣рд░рд╛ рджреЗрдЧрд╛ред рдпрджрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рдХрд╛рд░-рджрд╛рд╡реЗ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

func OnesCount(x T) int {
    switch x.(type) {
    case uint:
        // separate uint functionality...
    case uint8:
        // separate uint8 functionality...
    case uint16:
        // separate uint16 functionality...
    case uint32:
        // separate uint32 functionality...
    case uint64:
        // separate uint64 functionality...
    }
}

рдПрдХ рдХреЙрд▓

var x uint8 = 255
bits.OnesCount(x)

рдлрд┐рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ (рдирд╛рдо рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ):

func $OnesCount_uint8(x uint8) {
    // separate uint8 functionality...
}

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

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

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

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

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

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

@egonelbre рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдмрд╛рдзрд╛рдПрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣рд▓реНрдХреА рд╣реИрдВред рдореИрдВрдиреЗ рдЬреЛ рд╕реБрдирд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдзрд╛рдУрдВ рдЙрд░реНрдл тАЛтАЛтАЛтАЛрдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЛ рднрд╛рд╖рд╛ рдХреА рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╢рд░реАрд░ рд╕реЗ рдирд┐рд╣рд┐рдд рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ 'рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд┐рд╕рдлреАрдЪрд░реНрд╕:

  • рдмрд╛рдзрд╛рдПрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рд╣реИрдВред рдЬрдмрдХрд┐ рдЧреЛрдбреЛрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╕рднреА рдмрд╛рдзрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВред
  • рдЙрд╕рдХреЗ рдХрд╛рд░рдг, рдЧрд▓рддреА рд╕реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдзрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рддрднреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рди рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗ рд░рд╣реЗ рд╣реИрдВред
  • рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХ рддрджрд░реНрде рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ? рдпрд╣рд╛рдВ рдЯреА, рдпреВ рдФрд░ рд╡реА рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд╛рдзрд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВ? рдпрджрд┐ рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЬрд┐рд╕ рддрд░рд╣ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рд╣рдо рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИрдВ (рд╣рдореЗрдВ рдЗрд╕реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдФрд░ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рджреЗрдВ)ред рдЕрдЧрд░ рд╣рдо рд╡реИрд╕реЗ рднреА рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреИрд╕реЗ рджреЗрддреЗ рд╣реИрдВ? "рддреНрд░реБрдЯрд┐: рдЯреА рдХреЛ рдпреВрд╡реА () рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд╡реИрдз рдмрд╛рдзрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ"?
func[T, U, V] Foo(u U, v V) {
  var t T = u.v(V) + 1;
}
  • рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЙрдкрд░реЛрдХреНрдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдмрджрддрд░ рдмрдирд╛ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдкрдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЙрд▓реАрдЬрд╝ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдк рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВред
  • рдбрд┐рдмрдЧрд┐рдВрдЧ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдпрд╛ рддреЛ рдмрд╛рдзрд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЛ рд▓реАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ F рдХреЛ T рдкреНрд░рдХрд╛рд░ рдкрд░ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ F рдХреЗ рд▓реЗрдЦрдХ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ рд╣реИ, рддреЛ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдиреНрд╣реЗрдВ рд╕рдЪреЗрдд рдХрд░реЗрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдХрдерди рдмрд╛рдзрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреИрд▓реА рд╕реЗ рдЖрддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди F рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ F рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд▓реАрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рднрдпрд╛рдирдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рд╣реИрдВред

@alercah

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ?

func[T, U, V] Foo(u U, v V) {
  var t T = u.v(V) + 1;
}

рдирд╣реАрдВ, u.v(V) рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ V рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдЪрд░ t рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЖрдкрдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

func[T, U, V] Foo(u U, v V) {
    var _ T = u.v(v) + 1;
}

рдпрд╣рд╛рдВ рдЯреА, рдпреВ рдФрд░ рд╡реА рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд╛рдзрд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВ?

  • рдкреНрд░рдХрд╛рд░ V рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИред
  • рдкреНрд░рдХрд╛рд░ U рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ v $ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ V рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ varargs рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ u.v рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ V рдкреНрд░рдХрд╛рд░ рдХрд╛ред

    • U.v рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрдХреАрдирди рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЕрд░реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; #23796 рджреЗрдЦреЗрдВред

  • U.v рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдирд┐рд░рдВрддрд░ 1 рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
  • U.v T рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ u.v(тАж) + 1 рдХреЛ T рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рдкреНрд░рдХрд╛рд░ T рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ U.v рдХрд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╣реИ рдФрд░ T рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

рд╣рд╛рдВ, рдпрд╣ рд╕рдЪ рд╣реИ: рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рдзрд╛ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдПрдХ рдЧрдВрднреАрд░ рджреЛрд╖ рд╣реЛрдЧрд╛ рдЪрд╛рд╣реЗ рд╡реЗ рдмрд╛рдзрд╛рдПрдВ рдирд┐рд╣рд┐рдд рд╣реЛрдВ рдпрд╛ рдирд╣реАрдВред рдЖрдИрдПрдордУ, рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛рдУрдВ рдХреА рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдмрд╛рдзрд╛рдУрдВ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ u.v рдХреЛ рдПрдХрд▓-рддрд░реНрдХ рдпрд╛ рднрд┐рдиреНрди рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

func[T] Foo() (t T) {
    x := 42;
    t = T{x: "some string"}  // Is x an index, or a field name?
    _ = x
}

рдЕрдЧрд░ рд╣рдо рд╡реИрд╕реЗ рднреА рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреИрд╕реЗ рджреЗрддреЗ рд╣реИрдВ? "рддреНрд░реБрдЯрд┐: рдЯреА рдХреЛ рдпреВрд╡реА () рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд╡реИрдз рдмрд╛рдзрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ"?

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

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

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрд╛рдзрд╛ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рднреА рджреЗрдЦреЗрдВ https://github.com/golang/go/issues/22876#issuecomment-347035323)ред рдХреБрдЫ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд░рди-рдЯрд╛рдЗрдо рдкреИрдирд┐рдХ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдХреБрдЫ рд░реЗрд╕ рдбрд┐рдЯреЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ; рд╕рдмрд╕реЗ рдЦрддрд░рдирд╛рдХ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡реЗ рд╕рднреА рдХреБрдЫ рд╣рдж рддрдХ "рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рд▓реАрдХ" рдХрд░рддреЗ рд╣реИрдВред (https://xkcd.com/1172/ рднреА рджреЗрдЦреЗрдВред)

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдПрдл рдХрд╛ рд▓реЗрдЦрдХ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ рд╣реИ, рддреЛ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЙрдиреНрд╣реЗрдВ рд╕рдЪреЗрдд рдХрд░реЗ рдХрд┐ рдХреМрди рд╕рд╛ рдХрдерди рдмрд╛рдзрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреИрд▓реА рд╕реЗ рдЖрддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди F рдХрд╛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ[ред]

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:

func [F, Arg, Result] InvokeAsync(f F, x Arg) (<-chan Result) {
    c := make(chan result, 1)
    go func() { c <- f(x) }()
    return c
}

рдЖрдк Arg рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ? рд╡реЗ F рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╣рд╛рд▓рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рд╕реЗ рдЧрд╛рдпрдм рд╣реИред

рдирд╣реАрдВ, рдпреВрд╡реА (рд╡реА) рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддреНрд░реБрдЯрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реА рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдЪрд░ рдЯреА рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЖрдкрдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

рд╣рд╛рдБ, рдпрд╣реА рдЗрд░рд╛рджрд╛ рдерд╛, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдкреНрд░рдХрд╛рд░ T рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ U.v рдХрд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╣реИ рдФрд░ T рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдмрд╛рдзрд╛ рдорд╛рдирдирд╛ тАЛтАЛрдЪрд╛рд╣рд┐рдП? рдпрд╣ рдЕрдиреНрдп рдмрд╛рдзрд╛рдУрдВ рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдмрд╛рдзрд╛ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдореЛрдмреЗрд╢ рдЙрдкрдпреЛрдЧреА рд╣реИ? рдирд┐рд╣рд┐рдд рдмрд╛рдзрд╛рдПрдВ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреВрдЫрддреА рд╣реИрдВ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдзрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред

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

рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ "рдмрд╛рдзрд╛рдУрдВ рдХреА рд╣рдо рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ" рдЬреИрд╕рд╛ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рддрдп рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рддрд░рд╣ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ "рдЬреЛ рдХреБрдЫ рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ" рдмрд╛рдзрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг Foo рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ T , U , рдпрд╛ V рд╕реЗ рдЕрд▓рдЧ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП u.v ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ f рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдЗрд╕рдХреЗ рдЬреЛ рдЧреБрдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рдХреНрдпрд╛ рд╣рдо рдЙрдЪреНрдЪ-рд░реИрдВрдХ рд╡рд╛рд▓реЗ ( forall ) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ? рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЦреБрдж рдХреЛ рдпрд╣ рднреА рдирд╣реАрдВ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЖрдк рдПрдХ рдЙрдЪреНрдЪ-рд░реИрдВрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзреНрдпрддрд╛ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗред

рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд-рд╡рд┐рд╡рд╢ рдлрд╝рдВрдХреНрд╢рди for i := range t рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ T $ рдХреЗ рдХреБрдЫ t рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ T рдХреЛрдИ рд╕рд░рдгреА, рдЯреБрдХрдбрд╝рд╛, рдЪреИрдирд▓ рд╣реИ, рдпрд╛ рдирдХреНрд╢рд╛ред рд▓реЗрдХрд┐рди рд╢рдмреНрджрд╛рд░реНрде рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ T рдПрдХ рдЪреИрдирд▓ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ t == nil (рдЬреЛ рддрдм рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ T рдПрдХ рд╕рд░рдгреА рд╣реИ), рддреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдпрд╛ рддреЛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╢реВрдиреНрдп рд╕реНрд▓рд╛рдЗрд╕ рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдХреЛрдИ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЪреВрдВрдХрд┐ nil рдЪреИрдирд▓реЛрдВ рдкрд░ рдпрд╣реА рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдлреБрдЯрдЧрди рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣ рдХрд░ рд░рд╣рд╛ рд╣реИ m[i] = ... ; рдЕрдЧрд░ рдореИрдВ рдПрдХ рдирдХреНрд╢рд╛ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП m рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрдиреЗ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдЕрдиреНрдпрдерд╛ рдЖрдЙрдЯ-рдСрдл-рд░реЗрдВрдЬ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░ рдШрдмрд░рд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЦреБрдж рдХреЛ рдирд┐рд╣рд┐рдд рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдФрд░ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рджреЗрддрд╛ рд╣реИ: рдПрдкреАрдЖрдИ рд▓реЗрдЦрдХ рдХреЗрд╡рд▓ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреГрддреНрд░рд┐рдо рдмрдпрд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП for _, _ := range t { break } рдирдХреНрд╢реЗ, рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реБрдП рдПрдХ рдЪреИрдирд▓ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ; x = append(x) рд╕реНрд▓рд╛рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП x рдХреЛ рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред var _ = make(T, 0) рд╕реНрд▓рд╛рдЗрд╕, рдореИрдк рдФрд░ рдЪреИрдирд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВред рдХреИрд╕реЗ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреБрд╕реНрдЦрд╛ рдкреБрд╕реНрддрдХ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдХреЛрдИ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреЙрд▓ рди рдХрд░ рд╕рдХреЗ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдиреЗ рд╕рд╣реА рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИред рдореИрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рднреА рдирд╣реАрдВ рд╕рдХрддрд╛ рдЬреЛ рдХреЗрд╡рд▓ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдХреЛ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ред рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИ; рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрд╡реЗрджрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛рдлреА рднрд┐рдиреНрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ

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

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

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрд╛рдзрд╛ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (#22876 (рдЯрд┐рдкреНрдкрдгреА) рднреА рджреЗрдЦреЗрдВ)ред рдХреБрдЫ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд░рди-рдЯрд╛рдЗрдо рдкреИрдирд┐рдХ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдХреБрдЫ рд░реЗрд╕ рдбрд┐рдЯреЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ; рд╕рдмрд╕реЗ рдЦрддрд░рдирд╛рдХ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡реЗ рд╕рднреА рдХреБрдЫ рд╣рдж рддрдХ "рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рд▓реАрдХ" рдХрд░рддреЗ рд╣реИрдВред (https://xkcd.com/1172/ рднреА рджреЗрдЦреЗрдВред)

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ #22876 рдХреИрд╕реЗ рдЖрддрд╛ рд╣реИ; рдпрд╣ рдПрдХ рдЕрд▓рдЧ рддрд░рд╣ рдХреА рдмрд╛рдзрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рддреНрдп рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдореВрд▓реНрдпреЛрдВ рдкрд░ рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдкрд░ рдХреБрдЫ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдордирдорд╛рдиреА рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рднреАред рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП "рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдЯрд╛рдЗрдк T рдХреЗ рд╕рд╛рде рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?" рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЪрд╛рд╣реЗ рд╡реЗ рдирд┐рд╣рд┐рдд рд╣реЛрдВ рдпрд╛ рд╕реНрдкрд╖реНрдЯред (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ рднрд╛рд╖рд╛рдПрдВ, рдЬреИрд╕реЗ рд╕реА ++ рдФрд░ рд░рд╕реНрдЯ, рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдордирдорд╛рдиреА рдЧрдгрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЙрд▓реНрдЯрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рднреА рдЙрди рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред)

рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ "рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?"

func [U] DirectlyConstrained(U t) {
    t.DoSomething();
}
func [T] IndirectlyConstrained(T t) {
    DirectlyConstrainted(t);
}
func Illegal() {
    IndirectlyConstrained(4);
}

рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ Error: cannot call IndirectlyConstrained with [T = int]; T must have a method with signature func (T t) DoSomething() ред рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ IndirectlyConstrained рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рд╕реАрдорд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡реЗ рдЧрд╛рдпрдм рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ IndirectlyConstrained рдореЗрдВ рд╡рд╣ рдмрд╛рдзрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдЬреЛ рдПрдХ рдмрдбрд╝реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рд░реНрдп рд╣реИред рд╣рдо Note: this constraint exists on T because IndirectlyConstrained calls DirectlyConstrained with [U = T] on line N рдЬреЛрдбрд╝ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо IndirectlyConstrained рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╡рд░рдг рд▓реАрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рд╣реИ рдХрд┐ IndirectlyConstrained рдореЗрдВ рдмрд╛рдзрд╛ рдХреНрдпреЛрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдПрдХ рдФрд░ Note: this constraint exists on U because DirectlyConstrained calls t.DoSomething() on line M рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рдиреАрдЪреЗ рдХреБрдЫ рдХреЙрд▓реА рдЪрд╛рд░ рд╕реНрддрд░реЛрдВ рд╕реЗ рдирд┐рд╣рд┐рдд рдмрд╛рдзрд╛ рдЖрддреА рд╣реИ?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, IndirectlyConstrained рдХреЙрд▓ DirectlyConstrained(t.U()) ред рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ the type of t.U() , рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдорд╛рди рдПрдХ рд╡реНрдпрдВрдЬрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛ; рдЗрд╕реЗ рдХрдИ рдХрдердиреЛрдВ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдореЗрдВ рдпрд╛ рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдПрдХ рдЬреЛ рдХреЛрдб рдореЗрдВ рдХрднреА рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдХрд┐ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдЧрд░реАрдм рдХреЙрд▓рд░ рдЬрд┐рд╕рдиреЗ рдмрд╛рдзрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ред

рдЖрдк Arg рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ? рд╡реЗ рдПрдл рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕ рддрд░рд╣ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╣рд╛рд▓рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рд╕реЗ рдЧрд╛рдпрдм рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред

F рдбреНрд░реЙрдк рдХрд░реЗрдВ рдФрд░ f рдХрд╛ рдкреНрд░рдХрд╛рд░ func (Arg) Result ред рд╣рд╛рдВ, рдпрд╣ рд╡рд┐рд╡рд┐рдз рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдЧреЛ рднреА рдХрд░рддрд╛ рд╣реИред рд╕рдВрдЧрдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд▓рд┐рдП varargs funcs рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрд▓рдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдЕрдЧрд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореЗрд░реЗ рдЬреЗрдирд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ
http://go-li.github.io/

рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ Error: cannot call IndirectlyConstrained with [T = int]; T must have a method with signature func (T t) DoSomething() ред рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ [...] рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ IndirectlyConstrained рдореЗрдВ рд╡рд╣ рдмрд╛рдзрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдмрдбрд╝реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рд░реНрдп рд╣реИред

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

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

рдЕрд░реНрдерд╛рддреН, рд░рди-рдЯрд╛рдЗрдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рддреЛ рд╣рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреНрдпреЛрдВ рдорд╛рдирдиреА рдЪрд╛рд╣рд┐рдПт╕о рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ guru рдЯреВрд▓ рд╕рд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░, рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:

somefile.go:123: Argument `4` to DirectlyConstrained has type `int`,
    but DirectlyConstrained requires a type `T` with method `DoSomething()`.
    (For more detail, run `guru contraints path/to/somefile.go:#1033`.)

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

рд╣рдо Note: this constraint exists on T because IndirectlyConstrained calls DirectlyConstrained with [U = T] on line N рдЬреЛрдбрд╝ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо IndirectlyConstrained рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╡рд░рдг рд▓реАрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

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

рдпрджрд┐ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд-рд╡рд┐рд╡рд╢ рдлрд╝рдВрдХреНрд╢рди i := range t рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ $ t рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ T рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ T рдХреЛрдИ рд╕рд░рдгреА, рдЯреБрдХрдбрд╝рд╛, рдЪреИрдирд▓ рд╣реИ , рдпрд╛ рдирдХреНрд╢рд╛ред рд▓реЗрдХрд┐рди рд╢рдмреНрджрд╛рд░реНрде рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ T рдПрдХ рдЪреИрдирд▓ рдкреНрд░рдХрд╛рд░ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдореНрдореЛрд╣рдХ рддрд░реНрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╡рд░реНрдмреЛрдЬрд╝ рдХреЗ рдкрд╛рд╕ рдХрд╣реАрдВ рднреА рд╣реЛрдВ рдЬреИрд╕рд╛ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреЙрд▓ рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ reflect.Kind рдХреЗ рдХрд░реАрдм рдХреБрдЫ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧрддрд╛ рд╣реИред рд╣рдореЗрдВ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ; рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдХреЗрд╡рд▓ " T рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ" рдЬреИрд╕реА рдмрд╛рддреЗрдВ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ:

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

рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреБрдЪрд┐рдд рдмрд╛рдзрд╛ рднрд╛рд╖рд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛:

TypeConstraint = "sliceable" | "map" | "chan" | "struct" | "integer" | "float" | "type"

рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде:

func[T:integer, U, V] Foo(u U, v V) {
    var _ T = u.v(v) + 1;
}
func [S:sliceable, T] append(s S, x ...T) S {
    dst := s
    if cap(s) - len(s) < len(x) {
        dst = make(S, len(s), nextSizeClass(cap(s)))
        copy(dst, s)
    }
    copy(dst[len(s):cap(s)], x)
    return dst[:len(s)+len(x)]
}

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

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

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░, рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдПрдХ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рд╢реИрд▓реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

  • рдмреВрд▓
  • рдбреЛрд░реА
  • Int8, Uint8, Int16, Uint16, Int32, Uint32, Int64, Uint64, Int, Uint, Uintptr
  • рдлреНрд▓реЛрдЯ 32, рдлреНрд▓реЛрдЯ 64
  • рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕64, рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕128
  • рдРрд░реЗ, рд╕реНрд▓рд╛рдЗрд╕, рдореИрдк, рдЪреИрдирд▓, рдкреЙрдЗрдВрдЯрд░, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреЙрдЗрдВрдЯрд░

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

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

рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдПрдХ рд╢реИрд▓реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред

рд╣рдо рдХрд╕реНрдЯрдо рд╢реИрд▓рд┐рдпреЛрдВ рдХреА рднреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

genre Addable = Numeric | String
genre Orderable = Interger | Float | String
genre Validator = func(int) bool // each parameter and result type must be a specified type.
genre HaveFieldsAndMethods = {
    width  int // we must use a specific type to define the fields.
    height int // we can't use a genre to define the fields.
    Load(v []byte) error // each parameter and result type must be a specified type.
    DoSomthing()
}
genre GenreFromStruct = aStructType // declare a genre from a struct type
genre GenreFromInterface = anInterfaceType // declare a genre from an interface type
genre GenreFromStructInterface = aStructType + anInterfaceType
genre ComparableStruct = HaveFieldsAndMethods & Comprable
genre UncomparableStruct = HaveFieldsAndMethods &^ Comprable

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

  • Const Integer рдПрдХ рд╢реИрд▓реА рд╣реИ ( Integer рд╕реЗ рдЕрд▓рдЧ) рдФрд░ рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕реНрдерд┐рд░ рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • Const func(int) bool рдПрдХ рд╢реИрд▓реА рд╣реИ ( func(int) bool рд╕реЗ рдЕрд▓рдЧ) рдФрд░ рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдбреЗрд▓рдХреЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВред
рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ,
рдЪрд▓реЛ рдмрд╕ рдЗрд╕реЗ crate рдХрд╣рддреЗ рд╣реИрдВред
рдЖрдо рддреМрд░ рдкрд░, рдмрдХреНрд╕реЗ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдВрдмрдВрдз рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рд╕рдВрдмрдВрдз рдХреА рддрд░рд╣ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдЯреЛрдХрд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд░ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЯреЛрдХрд░рд╛ рдШреЛрд╖рдгрд╛ (рдорд╛рди рд▓реЗрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб lib рдкреИрдХреЗрдЬ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

crate Example [T Float, S {width, height T}, N Const Integer] [*, *, *] {
    type MyArray [N]T

    func Add(a, b T) T {
        return a+b
    }

    type M struct {
        x T
        y S
    }

    func (m *M) Area() T {
        m.DoSomthing()
        return m.y.width * m.y.height
    }

    func (m *M) Perimeter() T {
        return 2 * Add(m.y.width, m.y.height)
    }

    export M, Add, MyArray
}

рдЙрдкрд░реЛрдХреНрдд рдЯреЛрдХрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

import "lib"

// We can use AddFunc as a normal delcared function.
// Its genre is "Const func (a, b T) T"
type Rect, AddFunc, Array = lib.Example[float32, struct{x, y float32}, 100]

func demo() {
    var r Rect
    a, p = r.Area(), r.Perimeter()
    _ = AddFunc(a, p)
}

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

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

рдмреБрдзрд╡рд╛рд░, 4 рдЕрдкреНрд░реИрд▓, 2018 рдХреЛ рджреЛрдкрд╣рд░ 12:41 рдмрдЬреЗ dotaheor [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

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

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

рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛,
рдПрдХ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рд╢реИрд▓реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

  • рдмреВрд▓
  • рдбреЛрд░реА
  • Int8, Uint8, Int16, Uint16, Int32, Uint32, Int64, Uint64, Int, Uint,
    Uintptr
    рдлреНрд▓реЛрдЯ32, рдлреНрд▓реЛрдЯ64
  • рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕64, рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕128
  • рдРрд░реЗ, рд╕реНрд▓рд╛рдЗрд╕, рдореИрдк, рдЪреИрдирд▓, рдкреЙрдЗрдВрдЯрд░, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреЙрдЗрдВрдЯрд░

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

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

рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдПрдХ рд╢реИрд▓реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред

рд╣рдо рдХрд╕реНрдЯрдо рд╢реИрд▓рд┐рдпреЛрдВ рдХреА рднреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рд╢реИрд▓реА рдЬреЛрдбрд╝рдиреЗ рдпреЛрдЧреНрдп = рд╕рдВрдЦреНрдпрд╛рддреНрдордХ | рдбреЛрд░реА
рдЬреЙрдирд░ рдСрд░реНрдбрд░реЗрдмрд▓ = рдЗрдВрдЯрд░рдЧрд░ | рдлреНрд▓реЛрдЯ | рдбреЛрд░реА
рд╢реИрд▓реА рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ = func (int) рдмреВрд▓ // рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╢реИрд▓реА HaveFieldsAndMethods = {
рдЪреМрдбрд╝рд╛рдИ рдЗрдВрдЯ // рд╣рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдКрдВрдЪрд╛рдИ рдЗрдВрдЯ // рд╣рдо рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рд▓реЛрдб (v [] рдмрд╛рдЗрдЯ) рддреНрд░реБрдЯрд┐ // рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреБрдЫ рдХрд░рдирд╛ ()
}
рд╢реИрд▓реА GenreFromStruct = aStructType // рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рд╢реИрд▓реА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
рд╢реИрд▓реА GenreFromInterface = anInterfaceType // рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рд╢реИрд▓реА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
рд╢реИрд▓реА GenreFromStructInterface = aStructType | рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░

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

  • рдХреЙрдиреНрд╕реНрдЯ рдЗрдВрдЯреАрдЬрд░ рдПрдХ рд╢реИрд▓реА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕реНрдерд┐рд░ рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
    рдХреМрди рд╕рд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
    рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • Const func(int) bool рдПрдХ рд╢реИрд▓реА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдбреЗрд▓рдХреЗрдпрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
    рд╕рдорд╛рд░реЛрд╣ рдореВрд▓реНрдпред
    рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

рдПрдХ рдЯреЛрдХрд░рд╛ рдШреЛрд╖рдгрд╛ (рдорд╛рди рд▓реЗрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб lib . рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)
рдкреИрдХреЗрдЬ):

рдХреНрд░реЗрдЯ рдЙрджрд╛рд╣рд░рдг [рдЯреА рдлреНрд▓реЛрдЯ, рдПрд╕ {рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдЯреА}, рдПрди рдХреЙрдиреНрд╕реНрдЯ рдЗрдВрдЯреАрдЬрд░] [*, *, *] {
MyArray рдЯрд╛рдЗрдк рдХрд░реЗрдВ [N]T

func рдЬреЛрдбрд╝реЗрдВ (рдП, рдмреА рдЯреА) рдЯреА {
рд╡рд╛рдкрд╕реА рдП+рдмреА
}

// рдПрдХ рдЯреЛрдХрд░рд╛-рд╕реНрдХреЛрдк рд╢реИрд▓реАред рдХреЗрд╡рд▓ рдЯреЛрдХрд░рд╛ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

// M рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╢реИрд▓реА рд╣реИ G
рдПрдо рд╕рдВрд░рдЪрдирд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ {
рдПрдХреНрд╕ рдЯреА
рд╡рд╛рдИ рд╕реЛ
}

func (рдПрдо * рдПрдо) рдХреНрд╖реЗрддреНрд░ () рдЯреА {
m.DoSomthing ()
mywidth * myheight . рд▓реМрдЯрд╛рдПрдВ
}

func (рдПрдо * рдПрдо) рдкрд░рд┐рдзрд┐ () рдЯреА {
рд╡рд╛рдкрд╕реА 2 * рдЬреЛрдбрд╝реЗрдВ (mywidth, myheight)
}

рдирд┐рд░реНрдпрд╛рдд рдПрдо, рдЬреЛрдбрд╝реЗрдВ, MyArray
}

рдЙрдкрд░реЛрдХреНрдд рдЯреЛрдХрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдЖрдпрд╛рдд "рд▓рд┐рдм"

// рд╣рдо AddFunc рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрд▓рдХреЗрдпрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Rect, AddFunc, Array = lib.Example рдЯрд╛рдЗрдк рдХрд░реЗрдВ (float32, struct{x, y float32})

func рдбреЗрдореЛ () {
рд╡рд░ рдЖрд░ рд░реЗрдХреНрдЯ
a, p = r.Area (), r.Perimeter ()
_ = AddFunc (рдП, рдкреА)
}

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

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292#issuecomment-378665695 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AGGWB78BrjN0BxRfroH-jRNy4mCXgSwCks5tlPfMgaJpZM4IG-xv
.

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рдЗрдВрдб рдФрд░ рдЬреЙрдирд░ рдореЗрдВ рдХреБрдЫ рдЕрдВрддрд░ рд╣реИрдВред

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

package lib

// export a type
crate List [T *] * {
    type List struct {
        ...
    }

    export List
}

рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:

import "lib"

var l lib.List[int]

рдХреБрдЫ "рд╢реИрд▓реА рдХрдЯреМрддреА" рдирд┐рдпрдо рд╣реЛрдВрдЧреЗ, рдЬреИрд╕реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ "рдкреНрд░рдХрд╛рд░ рдХрдЯреМрддреА"ред

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

рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ genre рдХреАрд╡рд░реНрдб рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реБрдкрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред crate рдХреАрд╡рд░реНрдб "рдХреНрд░реЗрдЯ рд╕рд┐рдЧреНрдиреЗрдЪрд░" рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЬреЛ Type рдХрд╛ рдЙрдк-рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреБрдЫ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:

рдЯреЛрдХрд░рд╛ ::= ╧З | рдореИрдВ
рдЯрд╛рдЗрдк рдХрд░реЗрдВ ::= ╧Д | ╧З | int | bool | | func(╧Д) | func(╧Д) ╧Д | []╧Д | ╧З[╧ДтВБ, тАж]

рдХреНрд░реЗрдЯрд╕рд┐рдЧ ::= [╬║тВБ, тАж] тЗТ [╬║тВЩ, тАж]
рддрд░рд╣ ::= ╬║ | exactly ╧Д | kindOf ╬║ | Map | Chan | | Const ╬║ | Type | рдХреНрд░реЗрдЯрд╕рд┐рдЧ

рдХреБрдЫ рдкреНрд░рдХрд╛рд░-рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рдВрдХреЗрддрди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  • "тКв" рдХреЛ "enttails" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝реЗрдВред
  • тАЬ k1 тКС k2 тАЭ рдкрдврд╝реЗрдВ рдХреНрдпреЛрдВрдХрд┐ тАЬ k1 k2 рдПрдХ рдЙрдк-рдкреНрд░рдХрд╛рд░ рд╣реИтАЭред
  • ":" рдХреЛ "рддрд░рд╣ рдХрд╛ рд╣реИ" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝реЗрдВред

рддрдм рдирд┐рдпрдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

тКв ╧Д : exactly ╧Д
exactly ╧Д тКС kindOf exactly ╧Д
kindOf exactly ╧Д тКС Type

╧Д : ╬║тВБ тИз ╬║тВБ тКС ╬║тВВ тКв ╧Д : ╬║тВВ

╧ДтВБ : Type тИз ╧ДтВВ : Type тКв kindOf exactly map[╧ДтВБ]╧ДтВВ тКС Map
Map тКС Type

╬║тВБ тКС ╬║тВВ тКв Const ╬║тВБ тКС Const ╬║тВВ

[тАж]
(рдФрд░ рдЗрд╕реА рддрд░рд╣, рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП)


рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВ:

type ╧ДтВБ ╧ДтВВ тИз ╧ДтВВ : ╬║ тКв ╧ДтВБ : kindOf ╬║

kindOf kindOf ╬║ тКС kindOf ╬║
kindOf Map тКС Map
[тАж]


genre рдирдП рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
genre ╬║ = ╬║тВБ | ╬║тВВ тКв ╬║тВБ тКС ╬║
genre ╬║ = ╬║тВБ | ╬║тВВ тКв ╬║тВВ тКС ╬║

(рдЖрдк Numeric рдФрд░ рдЗрд╕реА рддрд░рд╣ | рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)

genre ╬║ = ╬║тВБ & ╬║тВВ ( ╬║тВГ тКС ╬║тВБ ) тИз ( ╬║тВГ тКС ╬║тВВ ) тКв ╬║тВГ тКС ╬║


рдЯреЛрдХрд░рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд┐рдпрдо рд╕рдорд╛рди рд╣реИ:
type ╧ДтВЩ, тАж = ╧З[╧ДтВБ, тАж] ( ╧З : [╬║тВБ, тАж] тЗТ [╬║тВЩ, тАж] ) тИз ( ╧ДтВБ : ╬║тВБ ) ╧ДтВЩ : ╬║тВЩ

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


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

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

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

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

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

рдЯрд╛рдЗрдк-рдХреНрд▓рд╛рд╕-рдЖрдзрд╛рд░рд┐рдд рддрдВрддреНрд░, рдЬреИрд╕реЗ рдХрд┐ рдЬреАрдирд╕ рдФрд░ рдлрд╝рдорд┐рд▓рд┐рдпрд╛, рдЗрд╕реЗ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдкреАрдПрд▓рдбреАрдЖрдИ 2015 рдкреЗрдкрд░ рджреЗрдЦреЗрдВред

@DemiMarie
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рд╢реИрд▓реА" == "рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ"ред

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ]
рд╢рд╛рдпрдж traits рдПрдХ рдмреЗрд╣рддрд░ рдХреАрд╡рд░реНрдб рд╣реИред
рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рднреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рд╣реИред

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

[2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ]
рдорд╛рди рд▓реЗрдВ рдХрд┐ рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдП рдФрд░ рдмреА рд╣реИрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

A + B: union set
A - B: difference set
A & B: intersection set

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

(IMHO)

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

@dc0d

рдЙрдкрдирд╛рдо рдХреИрд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЗрдирд░рд┐рдХ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

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

package likedlist

type T = interface{}

type LinkedList struct {
    // ...
}

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

package main

import (
    "likedlist"
)

type intLL = likedlist.LinkedList(likedlist.T = int)
type stringLL = likedlist.LinkedList(likedlist.T = string)

func main() {}

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

// pkg.go
package pkg

type ListNode struct {
    prev, next *ListNode
    element    ?Element
}

func Add(x, y ?T) ?T {
    return x+y
}



// main.go
package main

import "pkg"

type intList = pkg.ListNode[Element=int]
func stringAdd = pkg.Add[T=string]

func main() {
}

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

@dotaheor рдЧреЛ 1.x рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред

@creker рдореИрдВрдиреЗ рдПрдХ рдЯреВрд▓ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ (рдирд╛рдо goreuse ) рдЬреЛ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк рдПрд▓рд┐рдпрд╛рд╕ рд░рд┐рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрджрд╛ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ 15 рдорд┐рдирдЯ рдХрд╛ рд╡реАрдбрд┐рдпреЛ рд╣реИ рдЬреЛ рдЯреВрд▓ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

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

@ рдХреНрд░реЗрдХрд░

рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ (рдореБрдЭреЗ рдХреЛрдИ C++ рд▓рд┐рдЦреЗ рд╣реБрдП рд▓рдЧрднрдЧ 16 рд╕рд╛рд▓ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реЗ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ рднреА рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ рдпрд╛ рдХреИрд╕реЗред

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

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЙрдирдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдирдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВред рдореЗрд░реА рд╕реВрдЪреА рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЧреЛ 1.x рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рд╣реИред

рдпрд╣ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ,

рдпреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдХрд▓рди рдзреАрдорд╛ рдХрд░рддрд╛ рд╣реИ,

рдореБрдЭреЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ goreuse рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдФрд░, рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рдХреЗрд╡рд▓ рдмрд╛рдЗрдирд░реА рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЧреЛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ?

рд╕рдВрднрд╡рддрдГ рд╕рд╛рд░реНрдердХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

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

@dc0d

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

type T=interface{}

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

@ рд╕рд┐рдШреЛрдпрд╛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдиреЗ рдХреНрдпрд╛ рдХрд╣рд╛ред

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

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

type T = int

рдФрд░ рдХреЗрд╡рд▓ рд╡реЗ рдкреНрд░рдХрд╛рд░ рдЬрд┐рдирдореЗрдВ + рдСрдкрд░реЗрдЯрд░ (рдпрд╛ - рдпрд╛ * ; рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрд╕ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрдХреЗрдЬ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдмреИрдарддрд╛ рд╣реИред

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

рд▓реЗрдХрд┐рди рдпрд╣ рдЬреЗрдирд░рд┐рдХ рдХреА рд╢реБрд░реВрдЖрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред

рдпрд╣ _is_ рдЧреЛ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рдЬреЗрдирд░рд┐рдХ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ/рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

@dc0d

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

'рдЯрд╛рдЗрдк рдЯреА = рдЗрдВрдЯ' рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

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

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

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ ?:

fun<type T>(t T)

рдпрд╛

fun[type T](t T)

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

@dc0d рдиреЗ рд▓рд┐рдЦрд╛

рдФрд░ рдХреЗрд╡рд▓ рд╡реЗ рдкреНрд░рдХрд╛рд░ рдЬрд┐рдирдореЗрдВ + рдСрдкрд░реЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИ (рдпрд╛ - рдпрд╛ *; рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрд╕ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрдХреЗрдЬ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдмреИрдарддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

@ рд╕рд┐рдШреЛрдпрд╛

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

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

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдЙрдкрдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

package genericadd

type T = int

func Add(a, b T) T { return a + b }

рдлрд┐рд░ рд╡рд╕реНрддреБрддрдГ рд╕рднреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ T рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:

package main

import (
    "genericadd"
)

var add = genericadd.Add(
    T = float64
)

func main() {
    var (
        a, b float64
    )

    println(add(a, b))
}

@dc0d

рдлрд┐рд░ рднреА рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ рдпрд╛ рдХреИрд╕реЗред

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ?

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

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

рдмрд╕ рдореЗрд░реА рд╕рдордЭ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ... рдХреЙрдкреА/рдкреЗрд╕реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЗрд╕ рд░реЗрдкреЛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ [ рдпрд╣рд╛рдВ ]ред рдЬрдм рддрдХ рдЖрдк "int" рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рдХреЛрдб рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рд╕рдВрд╢реЛрдзрдиреЛрдВ рд╕реЗ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ "int" рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рд╕ рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

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

рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХреБрдЫ "рдЕрдЬреНрдЮрд╛рдд" рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ [ рдпрд╣рд╛рдБ ]ред рдЗрд╕рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПред

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

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

рд╕реЛрдо рдкрд░, рдЕрдкреНрд░реИрд▓ 9, 2018, 8:32 рдкреВрд░реНрд╡рд╛рд╣реНрди рдПрдВрдЯреЛрдиреЗрдВрдХреЛ рдЖрд░реНрдЯреЗрдо рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@mandolyte https://github.com/mandolyte рдЖрдк рдПрдХ рдФрд░ рд╕реНрддрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рд▓рдкреЗрдЯрдХрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ред рд╡рд╣
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╣реА рд░рд╣ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рддрдм рд╕рдм рдХрд░реЗрдЧрд╛
рдЬрд╛рджреВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдпрд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

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

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕реА ++ рдХреА рдЧреИрд░-рдореЙрдбреНрдпреВрд▓рд░рд┐рдЯреА рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдкреВрд░реНрдг рд░рди-рдЯрд╛рдЗрдо рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЗ рд╣реИрдВ:

  1. рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред рдпрд╣ рдпрд╛ рддреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╣реА рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░реЗрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдЬрд╛рддреАрдп рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд╢реНрдпрдХ рдкреНрд░реЗрд╖рдг рдореЗрдВ рддрдмреНрджреАрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ C# рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд░рди-рдЯрд╛рдЗрдо рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдХреЛрдб рд▓реЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рд╕реНрдкреИрдЪ рдЯреЗрдмрд▓ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд░реНрдерди рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  2. рдПрдХ рдПрдХрд▓ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЯреА рдХреА рдПрдХ рд╕рд░рдгреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдЯреА рдХреЛ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ PolyJ, Genus рдФрд░ Familia рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛, рдЬрд╛рд╡рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд┐рддрдирд╛ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИред

@dc0d

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

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

рдЖрдк рдкреВрд░реЗ рдкреИрдХреЗрдЬ/рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдЪрд░ 'рдЯреА' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, <> рдпрд╛ [] рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рдореЙрдбреНрдпреВрд▓рд░ рд╣реИрдВред

@ рдХреНрд░реЗрдХрд░

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

рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдорд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

@DemiMarie

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

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

рдЬрд╛рдУ рдЬрд╛рд╡рд╛ рд╡реЗ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐:

"рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмреАрдЪ рд╕рдВрдХрд▓рд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдирд░реА рд╕рдВрдЧрддрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ"

рдЬрдмрдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

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

рдЖрдк рдпрд╣рд╛рдВ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

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

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

рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдЖрдкрдХрд╛ рдорддрд▓рдм рддреАрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ "рдХреЛрдб рдмреНрд▓реЛрдЯ" рдФрд░ "рдкреНрд░рджрд░реНрд╢рди" рд╕реЗ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ: _ рдЬрдм рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдбреАрдмрдЧ рдХреЛ рдУрд╡рд░-рд░рд┐рдЯреЗрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд╛рдирдХрд╛рд░реА,_ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВред


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

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

@ рд╕рд┐рдШреЛрдпрд╛

рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдорд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

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

рддреБрдордиреЗ рдпреЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛?

рд╕реЛрдо рдкрд░, рдЕрдкреНрд░реИрд▓ 9, 2018, 3:41 рдЕрдкрд░рд╛рд╣реНрди рдПрдВрдЯреЛрдиреЗрдВрдХреЛ рдЖрд░реНрдЯреЗрдо рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@рд╕рд┐рдШреЛрдпрд╛ https://github.com/sighoya

рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдорд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдореИрдВрдиреЗ рдЬреЛ рдкрдврд╝рд╛ рд╣реИ, рдЙрд╕рд╕реЗ C# JIT рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
рд╕рднреА рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ рдПрдХ рдмрд╛рд░ред рдХреЛрдИ рд╕рдВрдХрд▓рди-рд╕рдордп рдирд╣реАрдВ рд╣реИ
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реА # рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЯреАрдо рдЬрд╛рдУ
рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдЬрдирд░реЗрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ
рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, iOS рдкрд░ рдЖрдкрдХреЛ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ
рдЪрд▓рдиреЗ рдХреЗ рд╕рдордп рдкрд░ред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди Apple рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ
рдЗрд╕реЗ рдРрдкрд╕реНрдЯреЛрд░ рдореЗрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292#issuecomment-379870005 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AGGWB-tslGeUSGXl2ZlEDLf0dCATUaYvks5tm7lvgaJpZM4IG-xv
.

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд░реЙрдм рдкрд╛рдЗрдХ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ 5 рдирд┐рдпрдореЛрдВ рдкрд░ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред

рджреВрд╕рд░рд╛ (рдЖрдИрдПрдордПрдЪрдУ):

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

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

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

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

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

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

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

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

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

рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ, рдЕрдкреНрд░реИрд▓ 10, 2018, 5:46 рдкреВрд░реНрд╡рд╛рд╣реНрди рдХреЗрд╡ рд╢рд╛рд╣рдмрд╛рдЬрд┐рдпрди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд░реЙрдм рдкрд╛рдЗрдХ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ 5 рдирд┐рдпрдореЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛
https://users.ece.utexas.edu/%7Eadnan/pike.html рдПрдХ рдмрд╛рд░ рдФрд░ред

рджреВрд╕рд░рд╛ (рдЖрдИрдПрдордПрдЪрдУ):

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

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

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

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

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

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

@ рдХреНрд░реЗрдХрд░

рдореИрдВрдиреЗ рдЬреЛ рдкрдврд╝рд╛ рд╣реИ, рдЙрд╕рд╕реЗ рд╕реА # рдЬреЗрдЖрдИрдЯреА рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рдФрд░ рдПрдХ рдмрд╛рд░ рд╕рднреА рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рд╕рдВрдХрд▓рди-рд╕рдордп (IL-time) рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВ рд╣реИред

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

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

@dc0d

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

рдХреНрдпрд╛ рдЖрдк рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ рд╕рд┐рдШреЛрдпрд╛ рдореЗрд░реА рдЧрд▓рддреА; рдореЗрд░рд╛ рдорддрд▓рдм рдмрд╛рдЗрдирд░реА рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдмрд╛рдЗрдирд░реА рдкреИрдХреЗрдЬ рдерд╛ - рдЬреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

@creker рдЕрдЪреНрдЫрд╛ рдпреЛрдЧ! (рдПрдордУ) рдЬрдм рддрдХ рдХреЛрдИ рдордЬрдмреВрдд рдХрд╛рд░рдг рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЧреЛ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯрд╛рдЗрдк рдПрд▓рд┐рдпрд╛рд╕ рд░рд┐рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╕реНрд▓рд╛рдЗрд╕ рдпрд╛ рдореИрдкреНрд╕ рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдХрдВрдкреЛрдЬрд┐рдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╣реИред

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

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

рдирд╛рдореЛрдВ рдХреА рддреАрди рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рджреИрдирд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИ:

  • рдбреЛрдореЗрди рд╕рдВрд╕реНрдерд╛рдУрдВ/рддрд░реНрдХ рдХреЗ рд▓рд┐рдП
  • рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░/рддрд░реНрдХ
  • рд╕реЗрд╡рд╛рдПрдВ/рдЗрдВрдЯрд░рдлреЗрд╕рд┐рдВрдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░/рддрд░реНрдХ

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

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

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

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

рдореИрдВрдиреЗ рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдХреНрдпреЛрдВ рдФрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рдХрдИ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝реЗред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЧреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЧреЛрдореИрдХреНрд░реЛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ?

рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХреБрдЫ рдЕрдиреБрднрд╡ рд╣реИ, рдЕрддреАрдд рдореЗрдВ рджреЛ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝ рдЪреБрдХрд╛ рд╣реВрдВ

  1. рдЕрдм рдПрдХ рдкрд░рд┐рддреНрдпрдХреНрдд рднрд╛рд╖рд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рддрдм рдмрдирд╛рдпрд╛ рдЬрдм рдореИрдВ рднреЛрд▓реА рдереА :) рдпрд╣ рд╕реА рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдИ
  2. рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реАрдПрд▓-рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд▓рд┐рд╕реНрдк - рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрдВрд╢рд┐рдХ рдФрд░ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

@ cosmos72 рдпрд╣ рдПрдХ рдРрд╕реА рддрдХрдиреАрдХ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдПрдЧрд╛ рдЬреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╣реИред

рдЕрднреА рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред рдЖрдк https://github.com/cosmos72/gomacro/tree/generics-v1 рдкрд░ рдкреНрд░рдЧрддрд┐ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдлрд┐рд▓рд╣рд╛рд▓ рдореИрдВ https://github.com/golang/proposal/blob/master/design/15292-generics.md#Proposal рдкрд░ рд╕реВрдЪреАрдмрджреНрдз рддреАрд╕рд░реЗ рдФрд░ рдЪреМрдереЗ рдЗрдпрд╛рди рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдПрдХ (рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд) рдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@cosmos72 рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорд┐рд╢реНрд░рдг рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ?
https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4

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

рдлрд┐рд▓рд╣рд╛рд▓ рдореИрдВ рд╕реА ++, рд░рд╕реНрдЯ рдФрд░ рдЕрдиреНрдп рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА "рдЯрд╛рдЗрдк рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди" рддрдХрдиреАрдХ рдХреА рдУрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд╕рдВрднрд╡рддрдГ "рдкреИрд░рд╛рдореАрдЯрд░реЗрдЯреЗрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрдХреЛрдк" рдХреЗ рд╕рд╛рде, рдХреНрдпреЛрдВрдХрд┐ рдирдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ type ( Foo ...; Bar ...) рд╣реИ рдФрд░ рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП template[T1,T2...] type ( Foo ...; Bar ...) ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ "рд╡рд┐рд╡рд╢ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛" рдХреЗ рд▓рд┐рдП рджрд░рд╡рд╛рдЬрд╛ рдЦреБрд▓рд╛ рд░рдЦ рд░рд╣рд╛ рд╣реВрдВред

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

рдореИрдВ рдЬрд┐рд╕ рдорд┐рд╢реНрд░рдг рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ https://github.com/golang/proposal/blob/master/design/15292/2013-10-gen.md рдФрд░ https://github.com/golang/proposal/blob/ рдХреЗ рдмреАрдЪ рд╣реИред

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

рдЕрджреНрдпрддрди 2: рдкрд╣рд▓рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдХрд▓рд┐рдд рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рджреЗрдЦреЗрдВ https://github.com/cosmos72/gomacro/tree/generics-v1

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

рдЬреЗрдирд░рд┐рдХ рдХреЛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдлреАрдЪрд░ (рдХреЛрдб рдЬрдирд░реЗрд╢рди, рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рдЖрджрд┐) рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдПрдХ рднрд╛рд╖рд╛ рдлреАрдЪрд░ (рд╕рднреА рд╕реНрддрд░реЛрдВ рдкрд░ рдЧреЛ рдХреЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рджрдЦрд▓)ред

@dc0d
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ C++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдлреАрдЪрд░ рдирд╣реАрдВ рд╣реИрдВ?

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

рдореИрдВ @dc0d рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдПрдХ рдПрдХреАрдХреГрдд рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧреАред

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

type BinaryTreeOfStrings struct {
    left, right *BinaryTreeOfStrings;
    string content;
}

// Its methods here

type BinaryTreeOfBigInts struct {
    left, right *BinaryTreeOfBigInts;
    uint64 content;
}

// AGAIN the same methods but different type

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

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ:

  • рд╣рд╛рдВ, рдЕрдВрддрд┐рдо рдХреЛрдб рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рд╣рдо рдЬреЗрдирд░реЗрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдмрд╛рдЗрдирд░реА рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ред
  • рд╣рд╛рдВ, рд╡рд┐рдЪрд╛рд░ рдореВрд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди C++ рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рд╣рд╛рдБ, MyType рдХреЗ рдХрд╛рд░реНрдпT (рдкреНрд░рддреНрдпрдХреНрд╖ рдпрд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ) рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рднреА рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЗ рдЬреЛ T рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрдЫ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ-рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реВрдЪрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛- рдкреНрд░рддреНрдпреЗрдХ T рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ; рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рдг рд░рдЦрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреНрд░рддреНрдпреЗрдХ T рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдкреНрд░рддреНрдпреЗрдХ T рдХреЗ рд▓рд┐рдП рднреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдЬрдмрдХрд┐ рд╡реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЬрд╣рд╛рдВ T рдХрд╛ рдЙрдирдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдВрджрд░реНрдн рд░рд┐рд╕реАрд╡рд░ рдореЗрдВ *T рд╣реИ, рдФрд░ рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдЙрди рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдХрд░ рдФрд░ рд╕рдорд╛рди рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА, рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ)ред рд╡реИрд╕реЗ рднреА, IMO рдпрд╣ рдмрд┐рдВрджреБ рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдХрдо рд╣реИ: рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдореМрдЬреВрдж рди рд╣реЛред
  • рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдХреЛрдИ рд╡рд╕реНрддреБ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдирдВрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреА рд╣реИред рджреЛрдмрд╛рд░рд╛: рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ред

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

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

@andrewcmyers рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЯрд╛рдЗрдк рдПрд▓рд┐рдпрд╛рд╕ рд░рд┐рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдХреЗрдЬ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ interface{} рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ type T = interface{} рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрдХреЗрдЬ-рд╕реНрддрд░реАрдп рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдмрд╕ рдпрд╣реАред

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмреЛрдирд╕: рдЧреЛ рдореЗрдВ рдХреЛрдИ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) type T = int , рди рдХрд┐ рдХреЗрд╡рд▓ рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдХреЗрдЬ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди + рд╣реИ

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

рдЕрдм, рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрдкрд░ рдмрджрд╕реВрд░рдд рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬреЛ Error рдФрд░ Stringer рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рднреА рд╣реИ рдЬреЛ + рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ !

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

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

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

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

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

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

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

type Point struct {
    x,y int
}

рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП (2) рджреЗрдЦреЗрдВред

(1) https://github.com/albrow/fo; рджреВрд╕рд░рд╛ рдЙрдкрд░реЛрдХреНрдд рд╣реИ https://github.com/cosmos72/gomacro#generics
(2) https://github.com/mandolyte/fo-experiments

@mandolyte рдЖрдк рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП *new(T) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдЯреА) рдпрд╛ рд╢реВрдиреНрдп (рдЯреА) рдХреА рддрд░рд╣ рдПрдХ рднрд╛рд╖рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг (рдкрд╣рд▓рд╛ рд╡рд╛рд▓рд╛ рдПрдХ рд╣реИ
C# IIRC рдореЗрдВ) рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди OTOH *new(T) рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдзрд┐рдХ .)
рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛)ред

2018-07-06 9:15 GMT-05:00 рдЯреЙрдо рдереЛрд░реЛрдЧреВрдб рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com :

@mandolyte https://github.com/mandolyte рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП *new(T) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рдиред

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

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

19642 рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ

@tmthrgd рдХрд┐рд╕реА рддрд░рд╣ рдореИрдВ рдЙрд╕ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ред рдзрдиреНрдпрд╡рд╛рдж!

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛

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

  • рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкреНрд░рдХрд╛рд░, Type<T> - рдПрдХ _array_;
  • рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЧрдгрдирд╛, F<T>(T) рдпрд╛ F<T>(Type<T>) - рдПрдХ _sortable array_;
  • рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдЯреЗрд╢рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП _LINQ_ - select рдпрд╛ for рдХрдерди рдЧреЛ рдореЗрдВ;

рдмреЗрд╢рдХ рдРрд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВ рдЬреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрдорд╛рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рдЬреИрд╕реЗ _C++_, _C#_ рдпрд╛ _Java_ рдХрдореЛрдмреЗрд╢ рдЗрд╕ рд╕реВрдЪреА рддрдХ рд╕реАрдорд┐рдд рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред

рд╡рд┐рдЪрд╛рд░реЛрдВ

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░/рдирд┐рд░реНрдорд╛рдг рдХреА рдкрд╣рд▓реА рд╢реНрд░реЗрдгреА рдкреНрд░рдХрд╛рд░ рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░/рдирд┐рд░реНрдорд╛рдг рдХреА рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рдХреЛ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ _property_ рдкрд░ _act_ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ _sortable array_ рдХреЛ рдЕрдкрдиреЗ рдЖрдЗрдЯрдореНрд╕ рдХреА _comparable properties_ _compare_ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╛рди рд▓реЗрдВ рдХрд┐ T.(P) T рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдФрд░ A(T.(P)) рдПрдХ рдЧрдгрдирд╛/рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИ, (A, .(P)) рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЖрдЗрдЯрдо рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЧрдгрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореВрд▓ рдЕрдиреБрдХреВрд▓рди рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг sort.Interface рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдордХрдХреНрд╖ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди sort.Reverse рднреА рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░/рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рддреАрд╕рд░реА рд╢реНрд░реЗрдгреА _рдЯрд╛рдЗрдк-рд╡рд┐рд╢рд┐рд╖реНрдЯ_ рднрд╛рд╖рд╛ рд╕рдВрдХреЗрддрди рд╣реИрдВ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

рдкреНрд░рд╢рди

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА ...

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

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

@ dc0d рдЬреЗрдирд░рд┐рдХ рдХреЛ рдШрдЯрдХ рднрд╛рдЧреЛрдВ рдореЗрдВ рддреЛрдбрд╝рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ 3, "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЕрдВрдХрди" рдХреЛ рдЕрдкрдирд╛ рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдорд╛рдирд╛ рдерд╛ред рд╢рд╛рдпрдж рдЗрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреАрдПрд╕рдПрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

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

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

(IMHO)

@infogulch

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

рддреБрдо рд╕рд╣реА рд╣реЛред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╡реЗ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕реЗрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдИрдПрдордУ рдЙрдиреНрд╣реЗрдВ рдбреАрдПрд╕рдПрд▓ рдмреБрд▓рд╛рдирд╛ рдереЛрдбрд╝рд╛ рдЧрд▓рдд рд╣реЛрдЧрд╛ред

1 рдФрд░ 2 ... рдЕрдХреНрд╕рд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВ

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

sort.Interface рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк _storage_ рдФрд░ _behavior_ рдХреЗ рдмреАрдЪ рдПрдХ рд░реЗрдЦрд╛ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ

рдЦреВрдм рдХрд╣рд╛ рд╣реИ;

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ

рдпрд╣ рдореЗрд░реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ: рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬреИрд╕реЗ List<T> where T:new, IDisposable ) рдпрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд _protocol_ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд╕реНрддреБрдУрдВ (рдПрдХ рд╕реЗрдЯ рдХреЗ; рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ) рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ?

@ рдХреАрди

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

рд╕рддреНрдпред рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ (рдпрд╛ рд╕рд░рдгреА) рдХрд╛ _property_ рд╣реИред рддреЛ рдПрдХ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрдВрдЯреЗрдирд░ (рдпрд╛ _tree_-рд╕рдХреНрд╖рдо рдХрдВрдЯреЗрдирд░ рдЬреЛ рднреА _tree_ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИ) рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдПрдХ _access рдФрд░ mutate (рд╕реНрд╡реИрдк) _ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рджреВрд╕рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдЗрдЯрдо рддреБрд▓рдиреАрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ (рдореЗрд░реЗ рд▓рд┐рдП) рдЬрд┐рд╕реЗ рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╣рддреЗ рд╣реИрдВ: рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рджреЛрдиреЛрдВ рддрд░рдл (рдХрдВрдЯреЗрдирд░ рдкрд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░) рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╡рд╣ рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд╕рдорд╕реНрдпрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрдХреНрд╖ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрди рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рдкреНрд░рднрд╛рд╡реА рд╕рдВрдХреЗрддрди рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП?

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

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

рд╕реЙрд░реНрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

bubble_sort : forall T U I => T U -> T U requires
   ForwardIterator<T>, Readable<T>, Writable<T>,
   Ord<U>,  ValueType(T) == U, Distance type(T) == I

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

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

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

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

@ рдХреАрди
рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдпрд╣реА рдорддрд▓рдм рдерд╛ред рд▓реЗрдХрд┐рди рдЧреЛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЗрд╕рдХрд╛ рд╢рд╛рдпрдж рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣рд╛рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рд▓реНрдЯрд┐рди рдСрдкрд░реЗрд╢рдВрд╕, рдЬреИрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рдпрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ sort.Slice рдпрд╛ math.Max рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЫрджреНрдо рдХреЛрдб) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

type [T] OrderedIterator interface {
   Len() int
   ValueAt(i int) *T
}

...
package sort

func [T] Slice(s [T]OrderedIterator, func(i, j int) bool) {
   ...
}

рдФрд░ рддрдм рд╕рднреА рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдпреЗ рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ?

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

type T ForwardIterator interface {
   type DistanceType D
   successor(x T) T
}

type T Readable interface {
   type ValueType U 
   source(x T) U
}

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

рд░реИрдВрдбрдо рдПрдХреНрд╕реЗрд╕ рдЗрдЯрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:

type T RandomIterator interface {
   type DistanceType D
   setPosition(x DistanceType)
}

рддреЛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ/рд╕рдордиреНрд╡рдп рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдПрдХ рдЕрдореВрд░реНрдд рд╣реИ, рд╕рдВрдЧреНрд░рд╣ рд╣реА рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдирд╛рдо 'рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ' рдЗрд╕реЗ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИред

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

type SortableContainer[C,T] struct {
    Less func(C,T,T) bool
    Swap func(C,int,int)
    Next func(C) (T,bool)
}

func (bs *SortableContainer[C,T]) BubbleSort(container C, e1,e2 T) {    
    swapCount := 1
    var item1, item2 T
    item1, ok1 = bs.Next()
    if !ok1 {return}
    item2, ok2 = bs.Next()
    if !ok2 {return}
    for swapCount > 0 {
        swapCount = 0
        for {
            if Less(item2, item1) { 
                bs.Swap(C,item2,item1)
                swapCount += 1
            }
        }
    }
}

рдХреГрдкрдпрд╛ рдХрд┐рд╕реА рднреА рдЧрд▓рддреА рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬ рдХрд░реЗрдВ... рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рд┐рдд рдирд╣реАрдВ!

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

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

рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type I ForwardIterator interface {
   successor(x I) I
}
type R V Readable interface {
   source(x R) V
}
type V Ord interface {
   less(x V, y V) : bool
}

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

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

рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ:

  1. рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди f(x I) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реИрд╕реЗ рднреА рдЗрдВрдЯрд░рдлреЗрд╕ (рдЬреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВ) рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред
  2. рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
  3. рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@keean рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЧрд┐рдирддреА рдЗрддрдиреА рдЕрдзрд┐рдХ рдХреИрд╕реЗ рдпрд╛ рдХреНрдпреЛрдВ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рдкреВрд░реНрдг рдХрд╛рдордХрд╛рдЬреА рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://play.folang.org/p/BZa6BdsfBgZ (рд╕реНрд▓рд╛рдЗрд╕ рдЖрдзрд╛рд░рд┐рдд, рд╕рд╛рдорд╛рдиреНрдп рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛрдИ рдЕрдЧрд▓рд╛() рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред

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

рдХрд┐рд╕реА рднреА рджрд░ рдкрд░, рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИред

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

рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рдПрдХ рд╣рд▓ рдХреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ Quicksort.go рдХреЗ рд▓рд┐рдП рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЛ-рд▓реА (рдЧреЛрд▓рдВрдЧ рдЗрдореНрдкреНрд░реВрд╡реНрдб) рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

func main(){
    var data = []int{5,3,1,8,9}

    Sort(data, func(a *int, b *int) int {
        return *a - *b
    })

    fmt.Println(data)
}

рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЖрдк рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдЪрд┐рдкрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ Quicksort рдкреИрдХреЗрдЬ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

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

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

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

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

map<I, O, U>(first I, last I, out O, fn U) requires
   ForwardIterator<I>, Readable<I>,
   ForwardIterator<O>, Writable<O>,
   UnaryFunction<U>, Domain(U) == ValueType(I), Codomain(U) == ValueType(O)

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

@keean рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрди рдкрдардиреАрдп рдФрд░ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдореЙрдбрд▓ рдХрд░реЗрдВ?

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ A рдЯрд╛рдЗрдк рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рдо B рдЯрд╛рдЗрдк рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ UnaryFunction рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ func (input A) B (рджрд╛рдПрдВ?) рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓рд┐рдВрдЧ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп map (рдпрд╛ filter , reduce , рдЖрджрд┐) рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓рд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

@ geovanisouza92 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рд╡рд╛рд░" рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдСрд░реНрдереЛрдЧреЛрдирд▓ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рддреЛ рдЕрдЧрд░ рд╣рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

ValueType MyIntArrayIterator -> Int

рдлрд╝рдВрдХреНрд╢рдВрд╕ рдереЛрдбрд╝реЗ рдкреЗрдЪреАрджрд╛ рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

fn(x : Int) Float

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

Int -> Float

рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ -> рд╕рд┐рд░реНрдл рдПрдХ рдЗрдВрдлрд┐рдХреНрд╕ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ, рдЬреИрд╕реЗ '[]' рдПрдХ рдРрд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ;

Fn Int Float
Or
Fn<Int, Float>

рдЯрд╛рдЗрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╡рд░реАрдпрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдЕрдм рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

Domain  Fn<Int, Float> -> Int
Codomain Fn<Int, Float> -> Float

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

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

рдзрдиреНрдпрд╡рд╛рдж, @рдХреАрдиред

рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд/рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╣реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐ libs рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдЧреА?

рдХреБрдЫ рддреНрд░реБрдЯрд┐ рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрди "рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рд╡рд╛рд░" рдХреЛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕, рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?


рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рд╕рд┐рд░реНрдл рдЙрддреНрд╕реБрдХ рд╣реВрдВ, рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

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

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

f(x I, y I) requires ForwardIterator<I>

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

f(x ForwardIterator, y ForwardIterator)

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

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

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

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

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

рджреНрд╡рд┐рджрд┐рд╢ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ (рдЯреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ func (*T) *[2]*T ) рдХрд╛ рдкреНрд░рдХрд╛рд░ func (*) *[2]* рдЧреЛ-рд▓реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╣реИред рд╢рдмреНрджреЛрдВ рдореЗрдВ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдЧрд▓реЗ рдФрд░ рдкрд┐рдЫрд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рджреЛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕реВрдЪрдХ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдореВрд▓рднреВрдд рдареЛрд╕ рдЖрдзрд╛рд░рднреВрдд рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрд╣рд░реА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

func Foreach(link func(*) *[2]*, list **, direction byte, f func(*)) {

    if nil == *list {
        return
    }

    var end *
    end = *list

    var e *
    e = (*link(*list))[direction]
    f(end)

    for (e != end) && ((*link(e))[direction] != nil) {
        var newe = (*link(e))[direction]
        f(e)
        e = newe
    }
    return
}

Foreach рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд╕рд╛рде рдлреЙрд░-рд▓реВрдк-рдЬреИрд╕реЗ-рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдУрд╡рд░ рд▓рд┐рд╕реНрдЯ рдпрд╛ рд╕рдВрдЧреНрд░рд╣ рддрддреНрд╡реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

const forward = 1
const backwards = 0
Foreach(iterator, collection, forward, func(element *element_type){
    // do something with every element
})

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

Foreach(iterator, collection, backwards, function_to_be_mapped_on_elements)

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧреЛ 1 рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреНрд╡рд┐рджрд┐рд╢ рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рднреА рдореЙрдбрд▓рд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
interface Iterator { Iter() [2]Iterator } рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ ("рдмреЙрдХреНрд╕") рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрдЯрд░реЗрдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрдм рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЧреНрд░рд╣ рддрддреНрд╡ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдЖрдк рдЖрдЧреЗ рдЬреЛ рд╡рд░реНрдгрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд┐рд░рд╛рд╕рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИред

func modern(x func  (*) *[2]*, y func  (*) *[2]*){}

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

func modern_T_syntax<T>(x func  (*T) *[2]*T, y func  (*T) *[2]*T){}

рдКрдкрд░ рдЬреИрд╕рд╛ рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдкрд░рд┐рдЪрд┐рдд рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯрд╛рдЗрдк рдХрд░реЗрдВ

func legacy(x Iterator, y Iterator){}

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

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

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

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

рдПрдХ рдЕрдиреНрдп рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрдЯрд░реЗрдЯрд░ рдкрд░ рдУ (рдПрди) рдЯрд╛рдЗрдо рд▓реВрдк рдореЗрдВ рдЬрд▓реНрджреА рд╕реЗ, рддрддреНрд╡реЛрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдЬреЗрдиреЗрд░рд┐рдХ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕реЗ []*T рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдФрд░ рдЦрд░рд╛рдм рд╕реНрд▓рд╛рдЗрд╕ рд╕реЙрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди рдЬреЗрдиреЗрд░рд┐рдХ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВред

рдХреГрдкрдпрд╛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдПрдХ рдореМрдХрд╛ рджреЗрдВ

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

Bidirectional iterator<T> =
    ForwardIterator<T>
/\ predecessor : T -> T
/\ predecessor takes constant time
/\ (forall i in T) successor(i) is defined =>
        predecessor(successor(i)) is defined and equals i
/\ (forall i in T) predecessor(i) is defined =>
        successor(predecessor(i)) is defined and equals i

рдпрд╣ рдлреЙрд░рд╡рд░реНрдбрдЗрдЯрд░реЗрдЯрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:

ForwardIterator<T> =
    Iterator<T>
/\ regular_unary_function(successor)

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

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

id(x T) T

рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рдорд╛рдгрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рднреА рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ id<T>(x T) T рд╣реЛрдЧрд╛ рдЬрдмрдХрд┐ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рдорд╛рдгрд┐рдд рдПрдХ id(x T) T рд╣реИ (рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ forall T )ред рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ id рдХреЗ рд▓рд┐рдП рдХреЙрд▓рд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЯреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд░рд┐рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЬреЛ рддрдм рддрдХ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рд╕рдВрдХрд▓рди рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЯреА рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡реИрдз рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрдм рдЯреА рдХреЛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рдорд╛рдгрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде id рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ forall T . T -> T рдЬрд┐рд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ Int рдХреА рддрд░рд╣ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@go-li

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

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

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

рдореИрдВ рдХрд┐рд╕реА рднреА рджрд╛рд╡реЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╕реА ++ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓рд┐рд╕реНрдХреЛрд╡ рдПрдЯ рдЕрд▓ рдкрдврд╝реЗрдВред 1977 CACM рдкреЗрдкрд░ рдпрджрд┐ рдЖрдк рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореЙрдбрд▓ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЯрд╛рдЗрдк-рд╕реЗрдл, рдореЙрдбреНрдпреВрд▓рд░, рдиреЛ рдХреЛрдб рдмреНрд▓реЛрдЯ): https://dl.acm.org/citation.cfm?id=359789 (рдзрд╛рд░рд╛ 4 рджреЗрдЦреЗрдВ) )

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

https://peter.bourgon.org/blog/2018/07/27/a-response-about-dep-and-vgo.html

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

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

рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рдЕрдЧрд░ рд╡реЗ рдлрд┐рд░ рд╕реЗ рдЦреБрдж рд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдареАрдХ рд╣реИ, рдмрд╕ рдЗрд╕реЗ рдХрд░ рд▓реЗрдВ ЁЯСН

@andrewcmyers рдЦреИрд░ рд╢рд╛рдпрдж "рдЖрд╡рд┐рд╖реНрдХрд╛рд░" рдереЛрдбрд╝рд╛ рдЦрд┐рдВрдЪрд╛рд╡ рдерд╛, рдЬреЛ рд╢рд╛рдпрдж 1 9 71 рдореЗрдВ рдбреЗрд╡рд┐рдб рдореБрд╕рд░ рдХреА рддрд░рд╣ рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдмрд╛рдж рдореЗрдВ рдПрдбрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рд╕реНрдЯреЗрдкрд╛рдиреЛрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред

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

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА GitHub рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдХреА рд╕реАрдорд╛ рдХреЗ рддрд╣рдд рддрдирд╛рд╡рдкреВрд░реНрдг рд╣реИред рдХреГрдкрдпрд╛ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреЛ рдЧреЛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдареЛрд╕ рдореБрджреНрджреЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд░рдЦреЗрдВред

рдЧреЛ рдХреЗ рд▓рд┐рдП C++ рдорд╛рд░реНрдЧ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реЛрдЧрд╛ред

@andrewcmyers рд╣рд╛рдВ, рдореИрдВ рддрд╣реЗ рджрд┐рд▓ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдХреГрдкрдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЪреАрдЬреЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ C++ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХреГрдкрдпрд╛ рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд▓рд┐рдП D рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ ред

@ рдЦрд╛рдирд╛рдмрджреЛрд╢-рд╕реЙрдлреНрдЯрд╡реЗрдпрд░

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

рдореБрдЭреЗ рдкрд╛рд╖рд╛рдг рдпреБрдЧ рд╕реЗ рдЙрдкрдЬреА рд╕реА ++ рдореЗрдВ рднреА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдЯрд╛рдЗрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?рдЬрд╛рд╡рд╛ рдпрд╛ C# рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдорд╛рдирдХ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдХреЛрдИ рдЗрд╕реЗ ParametricType рдХреЗ рд╕рд╛рде рдЕрдзрд┐рднрд╛рд░рд┐рдд рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ

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

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

рддреЛ рд╕реА ++ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрд╛рд▓рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП +1 рдФрд░ рдЯрд╛рдЗрдк-рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд╛рдЧреВ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП +1 :-)

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

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

рдХреНрдпрд╛ D рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ:

auto add(T)(T lhs, T rhs) {
    return lhs + rhs;

рдпрд╣ C++/Java/рд░рд╕реНрдЯ рд╕реНрдЯрд╛рдЗрд▓ рд╕реЗ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИ:

T add<T>(T lhs, T rhs) {
    return lhs + rhs;
}

рдпрд╛ рд╕реНрдХреИрд▓рд╛ рд╢реИрд▓реА:

T add[T](T lhs, T rhs) {
    return lhs + rhs;
}

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

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

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

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

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

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

@andrewcmyers

рдЧреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ - рд╡реЗ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рд╣реИрдВ

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

f(x : Addable) == f<T>(x : T) requires Addable<T>

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

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

IMHO:

рдЯрд╛рдЗрдк рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдбреАрдПрд╕рдПрд▓ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди f(s T fmt.Stringer) рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ fmt.Stringer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рднреА/рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреИрд╕реЗ:

func add(a, b T int) T int {
    return a + b
}

рдЕрдм рдлрд╝рдВрдХреНрд╢рди add() рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ T рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ int s + рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

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

type T U Collection interface {
   member(c T, v U) Bool
   insert(c T, v U) T
}

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

func[T, U] f(c T, e U) (Bool, T) requires Collection[T, U] {
   a := member(c, e)
   d := insert(c, e)
   return a, d
}

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

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

type Collection interface (T interface{}, U interface{}) {
   member(c T, v U) Bool
   insert(c T, v U) T
}

рдЕрдм (T interface{}, U interface{}) рднрд╛рдЧ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рд╕рджрд╕реНрдп fmt.Stringer рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рддреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрдЧреА:

type Collection interface (T fmt.Stringer, U fmt.Stringer) {
   member(c T, v U) Bool
   insert(c T, v U) T
}

@ dc0d рдпрд╣ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╡рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

type OrderedCollection[T, U] interface
   requires Collection[T, U], Ord[U] {...}

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

type OrderedCollection interface(T, U)
   requires Collection(T, U), Ord(U) {...}

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

@keean рдЖрдЗрдП heap.Interface рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:

type Interface interface {
    sort.Interface
    Push(x interface{}) // add x as element Len()
    Pop() interface{}   // remove and return element Len() - 1.
}

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

type Interface interface (T interface{}) {
    sort.Interface
    Push(x T) // add x as element Len()
    Pop() T   // remove and return element Len() - 1.
}

рдпрд╣ рдЧреЛ 1.x рдХреЛрдб рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯрд╛рдЗрдк рдПрд▓рд┐рдпрд╛рд╕ рд░рд┐рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдмреЗрд╣рддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рд╣рдо рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Go 1.x рд╕реНрдЯрд╛рдЗрд▓ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрд┐рдирд╛ рдХреБрдЫ рддреЛрдбрд╝реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрди рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрдбрд╝реА рдЬреАрдд рдЖрдИрдПрдордУ рд╣реИред

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

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

@keean рдореИрдВ requires Collection[T, U], Ord[U] рднрд╛рдЧ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред рд╡реЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ T рдФрд░ U рдХреЛ рдХреИрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

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

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

type OrderedCollection interface(T, U)
{
   first(c T) U
}

func[T] first(c T[]) T requires Collection(T[], T), Ord T
{...}

func[T] f(c T[]) requires OrderedCollection(T[], T), Collection(T[], T), Ord(T)
{...}

рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

type OrderedCollection interface(T, U) 
   requires Collection(T, U), Ord(U)
{
   first(c T) U
}

func[T] first(c T[]) T
{...}

func[T] f(c T[]) requires OrderedCollection(T[], T)
{...}

@keean (IMO) рдЬрдм рддрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИ, рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдЧреЛ 1.x рдХреЛрдб рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрд╣реА рд╡рд╣ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

@ рдХреАрди

рдЧреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реИрдВ - рд╡реЗ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рд╣реИрдВ

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

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

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

@andrewcmyers

рд╣рд╛рдВ, рд╡реЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдмрд╣реБрд░реВрдкрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

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

https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance

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

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

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

Addable[] == exists T . T[] requires Addable[T], Reflection[T]

рдпрд╣ рд╢рд╛рдпрдж рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреИрд╕реЗ "рдЯреНрд░реЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕" рдЬрдВрдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

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

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

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

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

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

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

@Merovius Variance рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИред рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдХреЛрдИ рднрд┐рдиреНрдирддрд╛ рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рднрд┐рдиреНрдирддрд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдк-рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╡рд░реНрд╕рд┐рд╕/рдХреЙрдиреНрдЯреНрд░рд╛рд╡реЗрд░рд┐рдПрдВрд╕ рд╕рдорд╕реНрдпрд╛ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ, рд╕рднреА рдЯрд╛рдЗрдк-рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реИред

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

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

type (T, U) Collection interface {
    member : (c T, e U) Bool
    insert: (c T, e U) T
}

member(c int32[], e int32) Bool {...}
insert(c int32[], e int32) int32[] {...}

member(c float32[], e float32) Bool {...}
insert(c float32[], e float32) float32[] {...}

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

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

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

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

package main

type Cloneable interface {
    Clone() Cloneable
}

type CloneableZ interface {
    Clone() Cloneable
    zero() int
}

type S struct {}

func (t S) Clone() Cloneable {
    c := t
    return c
}

func (t S) zero() int {
    return 0
}

var x CloneableZ = S{}
var y Cloneable = x

func main() {
    print("ok\n")
}

x рд╕реЗ y рддрдХ рдХрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ y рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ x рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдПрдХ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдВрдмрдВрдз рд╣реИ, рдмреБрджреНрдзрд┐ рдХреЗ рд▓рд┐рдП: CloneableZ <: Cloneable , рдФрд░ S <: CloneableZ рднреАред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рдпрд╣рд╛рдВ рдЦреЗрд▓рдиреЗ рдкрд░ рдПрдХ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдВрдмрдВрдз рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХреБрдЫ S <: тИГT.CloneableZ[T] <: тИГT.Cloneable[T] ред

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

@andrewcmyers рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЕрдореВрд░реНрдд рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ x рд╕реЗ y рддрдХ рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдмрд┐рдирд╛ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ (рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ) рдЖрдк рд▓рд┐рдЦреЗрдВрдЧреЗ:

class Cloneable t => CloneableZ t where...

рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ x рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ CloneableZ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Cloneable рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ y рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

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

@ рдХреАрди

рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕рд╛рд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА?

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

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

рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ "рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЙрдбрд▓" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдФрд░ рд╕реА # рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рджрд╛рд╡рд╛ рдореБрдЭреЗ рдЬреНрдпрд╛рджрд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

рдЬрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ x рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ CloneableZ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ Cloneable рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ y рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд╣реАрдВ, рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, x рдПрдХ рдЪрд░ рд╣реИ рдФрд░ y рдПрдХ рдЕрдиреНрдп рдЪрд░ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ y рдХреБрдЫ CloneableZ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ x рдХреБрдЫ Cloneable рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ y рд╕реЗ x рддрдХ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИред

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

type Cloneable interface {
    Clone() Cloneable
}

type CloneableZ interface {
    Clone() Cloneable
    zero() int
}

type S struct {}

func (t S) Clone() Cloneable {
    c := t
    return c
}

type T struct { x int }

func (t T) Clone() Cloneable {
    c := t
    return c
}

func (t S) zero() int {
    return 0
}

var x CloneableZ = S{}
var y Cloneable = T{}
var a [2]Cloneable = [2]Cloneable{x, y}

@andrewcmyers

рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ "рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЙрдбрд▓" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдФрд░ рд╕реА # рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рджрд╛рд╡рд╛ рдореБрдЭреЗ рдЬреНрдпрд╛рджрд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

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

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

{-# LANGUAGE ExistentialQuantification #-}

class ICloneable t where
    clone :: t -> t

class ICloneable t => ICloneableZ t where
    zero :: t

data S = S deriving Show

instance ICloneable S where
    clone x = x

data T = T Int deriving Show

instance ICloneable T where
    clone x = x

instance ICloneableZ T where
    zero = T 0

data Cloneable = forall a . (ICloneable a, Show a) => ToCloneable a

instance Show Cloneable where
    show (ToCloneable x) = show x

main = do
    x <- return S
    y <- return (T 27)
    a <- return [ToCloneable x, ToCloneable y]
    putStrLn (show a)

рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдВрддрд░, рдЧреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ data Cloneable = forall a . (ICloneable a, Show a) => ToCloneable a рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рднрдВрдбрд╛рд░рдг рдирд╣реАрдВ рд╣реИ) рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ (рдЬрд┐рд╕рдореЗрдВ рднрдВрдбрд╛рд░рдг рд╣реИ) рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрдВрдЧ рднреА рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ "рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╕реНрддреБрдПрдВ" рдХрд╣рддрд╛ рд╣реИред . рдЬрд╛рд╡рд╛, рд╕реА # рдФрд░ рд╕реНрдХреИрд▓рд╛ рдЬреИрд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рддрддреНрдХрд╛рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд╕рд╣реА" рд╣реИ, рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдХреЛрдИ рднрдВрдбрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдЧреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХреЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реИ, рдФрд░ рдЧреЛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдХрдВрдЯреЗрдирд░ рдХреЛ рдЙрд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рджреЗрдХрд░ рдЖрдкрд╕реЗ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реА рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ [2]Cloneable{x, y} рд╕рднреА рд╕рджрд╕реНрдпреЛрдВ рдХреЛ Cloneable рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд╣рд┐рдд рджрдмрд╛рд╡ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ ToCloneable рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдордЬрдмреВрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред .

рдореБрдЭреЗ рдпрд╣ рднреА рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ S рдФрд░ T Cloneable $ рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ S рдФрд░ T рдирд╣реАрдВ рд╣реИрдВ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдВрдЧрддред рд╣рдо рд╕рдЪрдореБрдЪ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреНрд▓реЛрдиреЗрдмрд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓ рдЧреЛ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ clone рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ) рдФрд░ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБ:

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

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

    • рдЬрдм рдареАрдХ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдХреЛ рдХрдо рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИред рд╣рдо рд╣рд░ рд╕рдордп := рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЫреБрдкрд╛рдИ рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рд╣рд░ рдмрд╛рд░ рд╡рд░реНрддрдиреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

    • рдПрдХ рдареЛрд╕ (рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп) рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░рдирд╛ a рдпрд╛ t рд╢рд╛рдпрдж рдЦрд░рд╛рдм рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреЛ рдлрд┐рдХреНрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА?

package main

import "fmt"

type LinkedList a struct {
  Head *Node a
  Tail *Node a
}

type Node a {
  Next *Node a
  Prev *Node a

  Value a
}

func main() {
  // Not sure about how recursive we could get with the inference
  ll := LinkedList string {
    // The string bit could be inferred
    Head: Node string { Value: "hello world" },
  }
}

func (l *LinkedList a) Append(value a) {
  newNode := &Node{Value: value}

  if l.Tail == nil {
    l.Head = newNode
    l.Tail = l.Head
    return
  }

  l.Tail.Next = newNode
  l.Tail = l.Tail.Next
}

рдпрд╣ рдПрдХ рд╕рд╛рд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╡рд░рдг рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ: https://gist.github.com/aarondl/9b950373642fcf5072942cf0fca2c3a2

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

@ рд╣рд╛рд░реЛрдВрдбрд▓реА
рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрдЧрд╛:

type Collection a b interface {
   member(c a, e b) Bool
   insert(c a, e b) a
}

func insert(c *LinkedList a, e a) *LinkedList a {
   c.Append(e)
   return c
}

@keean рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ Collection рдЯрд╛рдЗрдк рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рдПрдВред рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реВрдВ:

type Collection a b interface {
   member(c a, e b) Bool
   insert(c a, e b) a
}

@ dc0d рд╕рдВрдЧреНрд░рд╣ _all_ рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЛ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЗрдбрд╝, рд╕реВрдЪрд┐рдпрд╛рдБ, рд╕реНрд▓рд╛рдЗрд╕ рдЖрджрд┐, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ member рдФрд░ insert рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛-рдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рд┐рдВрдХреНрдбрд▓рд┐рд╕реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП 'рдЗрдиреНрд╕рд░реНрдЯ' рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рд╣реИ:

func insert(c *LinkedList a, e a) *LinkedList a {
   c.Append(e)
   return c
}

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

func insert(c []a, e a) []a {
   return append(c, e)
}

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдкреНрд░рдХрд╛рд░ a рдХреЗ рд╕рд╛рде @aarondl рджреНрд╡рд╛рд░рд╛ рд╕рдЪрд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

func insert(c *LinkedList int, e int) *LinkedList int {
   c.Append(e)
   return c
}

func insert(c *LinkedList float, e float) *LinkedList float {
   c.Append(e)
   return c
}

func insert(c int[], e int) int[] {
   return append(c, e)
}

func insert(c float[], e float) float[] {
   return append(c, e)
}

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

рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ []Collection рдЬрд╣рд╛рдВ рд╕рд╛рдордЧреНрд░реА рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдВрдЧреЗ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП member рдФрд░ insert рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред .

@aarondl рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ type LinkedList a рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡реИрдз рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рддрд░реАрдХреЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ: рд╡реНрдпрд╛рдХрд░рдг рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдмрдирд╛рдирд╛ (рд╕реА, рдпреВрдШ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛) рдпрд╛ рдЕрд╕реАрдорд┐рдд рд▓реБрдХрд╣реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ( рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЦрд░рд╛рдм рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдХрд╛рд░рдг рдЧреЛ рд╡реНрдпрд╛рдХрд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ)ред рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрдИрдПрдордУ рдЬреЛ рдЯреЛрдХрди-рдХрдо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЦрд┐рд▓рд╛рдл рдмреЛрд▓рддрд╛ рд╣реИред

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

type Collection e interface {
    Element(e) book
    Insert(e)
}

func (l *(LinkedList e)) Element(el e) book {
    // ...
}

func (l* (LinkedList e)) Insert(el e) {
    // ...
}

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

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

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

@Merovius рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреЛ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ 'рдлрд╝рдВрдХреНрд╢рди' рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдмрдирд╛рддрд╛ рд╣реИ? рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдмреЗрд╣рддрд░ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

type Collection interface {
   type Element
   Member(e Element) Bool
   Insert(e Element) Collection
}

type IntSlice struct {
    value []Int,
}

type IntSlice.Element = Int

func (IntSlice) Member(e Int) Bool {...}
func (IntSlice) Insert(e Int) IntSlice {...}

func useIt(c Collection, e Collection.Element) {...}

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

func[A] useIt(c A, e A.Element) requires A:Collection

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

@ dc0d a рдФрд░ b рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЬреИрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВред рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ Collection рдорд╛рдирд╛ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ a рдФрд░ b рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ @Merovius рдиреЗ рдмрддрд╛рдпрд╛ рд╣реИ, рдЧреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рдзрд┐ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдФрд░ рдмрд╣реБ-рдкреНрд░реЗрд╖рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЧреЛ рдХреЗ рд╕рд┐рдВрдЧрд▓-рдкреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде, рдлрд┐рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдПрдХрд╛рдзрд┐рдХ-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдмреЗрд╣рддрд░ рдлрд┐рдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдХреА рдХрдореА unify(x, y) рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛рддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдбрдмрд▓-рдкреНрд░реЗрд╖рдг рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

рдорд▓реНрдЯреА-рдкреИрд░рд╛рдореАрдЯрд░ рдЪреАрдЬрд╝ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

type Cloneable[A] interface {
   clone(x A) A
}

рдпрд╣рд╛рдВ a рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ, рд╣рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╕рд╣реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ Cloneable рдорд╛рдирддреЗ рд╣реИрдВред рд╣рдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВрдЧреЗред

func clone(x int) int {...}

рдЗрд╕рд▓рд┐рдП 'рдХреНрд▓реЛрди' рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ int a рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд╣рдо рдХреНрд▓реЛрди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рд╕рдВрдХреЗрддрди рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ:

func[A] test(x A) A requires Cloneable[A] {...}

рдпрд╣ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

type Cloneable interface {
   clone() Cloneable
}

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

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

@Merovius рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЖрдЗрдП рдореИрдВ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рджреБрдЦ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдкрд░ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ - рдпрд╛ рд╢рд╛рдпрдж рдЖрдк рдореЗрд░рд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ :)

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

рднрд▓реЗ рд╣реА рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд type LinkedList a рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдЗрддрдиреА рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ a рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ type LinkedList рдЖрдЬ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ: prog.go:3:16: expected type, found newline (and 1 more errors) ред рдореВрд▓ рдкреЛрд╕реНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЖрдИ рдФрд░ рдЗрд╕реЗ рдХрд╣рд╛ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ [a-z]{1} рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ- рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрд▓рд┐рджрд╛рди рд╣реИ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рдм рдареАрдХ рд╣реЛрдВрдЧреЗ рдмрдирд╛рдирд╛ (рдореИрдВ рдЖрдЬ рдХреЗрд╡рд▓ рдЧреЛ рдХреЛрдб рдореЗрдВ рдПрдХрд▓ рдЕрдХреНрд╖рд░ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдиреБрдХрд╕рд╛рди рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ)ред

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

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

func Sort(slice []a, compare func (a, a) bool) { ... }

рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди

рдЖрдкрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рд╣реИ:

type Collection e interface {
    Element(e) book
    Insert(e)
}

func (l *(LinkedList e)) Element(el e) book {
    // ...
}

func (l* (LinkedList e)) Insert(el e) {
    // ...
}

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

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

рд╕рд┐рдВрдЧрд▓ рд▓реЗрдЯрд░ рд▓реЛрдЕрд░рдХреЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рд╣реИ рдЬреЛ рдЙрд╕ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ

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

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдЬреЛ рдЕрдм рд╣рдо + . рдЬреИрд╕реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ

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

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

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

рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдРрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

@рдореЗрд░реЛрд╡рд┐рдпрд╕

@aarondl . рд╕реЗ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ

рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдРрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрдВрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рджрд┐рдП рдЧрдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ Addable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛:

type Addable interface {
   + (x Addable, y Addable) Addable
}

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

type Addable[A] interface {
   + (x A, y A) A
}

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

рд▓реЗрдХрд┐рди рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЕрдм рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

type S struct {
   value: int
}

func (+) (x S, y S) S {
   return S {
      value: x.value + y.value
   }
}

func main() {
    println(S {value: 27} + S {value: 5})
}

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

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

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

рдХреНрдпрд╛ рдмрд╣реБ-рдкреНрд░реЗрд╖рдг (рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ) рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдХрднреА рднреА рдЧреЛ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

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

@рдореЗрд░реЛрд╡рд┐рдпрд╕

рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ :)

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

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

рдРрд╕рд╛ рдХреБрдЫ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдд рдкреНрд░рддреАрдд рд╣реЛрдЧреА:

type Collection interface {
   type Element
   Member(e Element) Bool
   Insert(e Element) Collection
}

type IntSlice struct {
    value []Int,
}

type IntSlice.Element = Int

func (IntSlice) Member(e Int) Bool {...}
func (IntSlice) Insert(e Int) IntSlice {...}

func useIt<T>(c T, e T.Element) requires T:Collection {...}

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

f(useIt) // not okay with parametric types
f(useIt<List>) // okay with parametric types

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

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ, SFINAE рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХреЗрд╡рд▓ @bcmills рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╣реИ)ред
рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рд▓рд┐рдВрдХреНрдбрд▓рд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП Sort рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ?

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

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

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

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

@aarondl рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рднреА рджрд┐рдпрд╛ред

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

@urandom

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

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

type<T> []T.Element = Int

func<T> ([]T) Member(e T) Bool {...}
func<T> ([]T) Insert(e T) Collection {...}

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

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

@рдореЗрд░реЛрд╡рд┐рдпрд╕

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдореИрдВ рдмрдбрд╝реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рднреА рдмрд┐рдирд╛ рдареАрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

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

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

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

рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реБред

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

рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ, рдЖрдкрдХреЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ, рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рддрдирд╛% рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╣реЛрдЧрд╛?
рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдпрд╣ 2% рд╕реЗ рдХрдо рд╣реИ (115k LOC рд╡рд╛рд▓реЗ рдХреЛрдбрдмреЗрд╕ рд╕реЗ), рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк "рд╕рдВрдЧреНрд░рд╣" рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдВрддрддрдГ рдЬреЗрдирд░рд┐рдХ рдорд┐рд▓реЗрдВ

@ рдХреАрди

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

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

@andrewcmyers

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

рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

type Cloneable interface {...}

рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛-рдкреНрд░рдХрд╛рд░ 'рдХреНрд▓реЛрдиреЗрдмрд▓' рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдЖрдк 'ICloneable' рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдШреЛрд╖рдгрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рдЖрдк рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред

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

@keean рдореИрдВ Cloneable рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдорд╛рдиреВрдВрдЧрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░" рдирд╣реАрдВред рдЬрд╛рд╡рд╛ рдЬреИрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ Cloneable рдЕрдореВрд░реНрддрддрд╛ рдореЗрдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛрдИ рдЖрд╡рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

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

@andrewcmyers
рдореИрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд╕реНрдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдбреЗрдЯрд╛-рдкреНрд░рдХрд╛рд░ рд╣реИред

рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛрдИ рдЖрд╡рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

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

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

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

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

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

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

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

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

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

@Merovius рдирд┐рд░рдВрддрд░ рд╕рдВрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

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

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

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдирд┐рд╖реЗрдзрд╛рддреНрдордХ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдкреНрд░рддрд┐-рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрд┐рд╕ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдиреЗ рд╢рд┐рдХрд╛рдпрдд рдХреА рдереА, рд╡рд╣ рд╡рд╣ рдирд╣реАрдВ рдерд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдерд╛, рдмрд▓реНрдХрд┐ рдпрд╣рд╛рдВ рдореВрд▓ рдерд╛: https://golang.org/pkg/sort/#Interface рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рдХрд┐ рдмрд╕ рдерд╛ рдЕрдкрдирд╛ рдЯреБрдХрдбрд╝рд╛ + рдкреНрд░рдХрд╛рд░, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдкрд░ 3 рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЬреБрдбрд╝реА рд╢рд┐рдХрд╛рдпрддреЛрдВ рдФрд░ рджрд░реНрдж рдХреЗ рдЖрд▓реЛрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: https://golang.org/pkg/sort/#Slice , рдореБрдЭреЗ рдЗрд╕ рдПрдкреАрдЖрдИ рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рджрдВрдб рдХреА рд╡рд╕реВрд▓реА рдХрд░реЗрдВрдЧреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рд╣рдо рдХреЗрд╡рд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ func Slice(slice []a, less func(a, a) bool) рдореЗрдВ рдмрджрд▓рдХрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

container/heap рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкреВрд░реНрдг рдкреБрдирд░реНрд▓реЗрдЦрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред container/heap рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ sort рдкреИрдХреЗрдЬ рд╕рд┐рд░реНрдл рдЖрдкрдХреА рдЦреБрдж рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рди рддреЛ рдкреИрдХреЗрдЬ рдХрднреА рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ []interface{} рдФрд░ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝реА рд▓рд╛рдЧрддред рд╕рдВрднрд╡рддрдГ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ Heap рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ, рдФрд░ рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЧрдП рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рд╕рдЪ рд╣реИ (рдореЗрд░реЗ рдЕрдкрдиреЗ рд╕рд╣рд┐рдд) .

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

// Hasher turns a key into a hash
type Hasher interface {
  func Hash() []byte
}

type HashTable v struct {
   Keys   []Hasher
   Values []v
}

// Note that the generic arguments must be repeated here and immediately
// understood without reading another line of code, which to me
// is a readability win over the sudden appearance of the K and V which are
// defined elsewhere in the code in the example below. This is of course because
// the tokenized type declarations with constraints are fairly painful in general
// and repeating them everywhere is simply too much.
func (h (*HashTable v)) Insert(key Hasher, value v) { ... }

рдХреНрдпрд╛ рд╣рдо рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ []Hasher рдкреНрд░рджрд░реНрд╢рди/рднрдВрдбрд╛рд░рдг рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдЧреИрд░-рд╕реНрдЯрд╛рд░реНрдЯрд░ рд╣реИ рдФрд░ рдЧреЛ рдореЗрдВ рдПрдХ рд╕рдлрд▓ рдЬреЗрдирд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

// Without selecting another proposal I have no idea how the constraint might be defined or implemented so let's just pretend
type [K: Hasher, V] HashTable a struct {
   Keys   []K
   Values []V
}

func (h *HashTable) Insert(key K, value V) { ... }

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

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рджреЗрдЦ рд░рд╣реЗ рд╣реЛрдВ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпрд╣ рдЗрди рджреЛрдиреЛрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ?

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

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

рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЬреБрдбрд╝реА рд╢рд┐рдХрд╛рдпрддреЛрдВ рдФрд░ рджрд░реНрдж рдХреЗ рдЖрд▓реЛрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: https://golang.org/pkg/sort/#Slice

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

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

рд╣рдо рдЬрд┐рд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рддрд╣рдд рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рджрдВрдб рдХреЛ рдХреЗрд╡рд▓ func рд╕реНрд▓рд╛рдЗрд╕ (рд╕реНрд▓рд╛рдЗрд╕ [] рдП, рдХрдо рдлрдВрдХ (рдП, рдП) рдмреВрд▓) рдореЗрдВ рдмрджрд▓рдХрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

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

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

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

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

type hasherA uint64

func (a hasherA) Hash() []byte {
    b := make([]byte, 8)
    binary.BigEndian.PutUint64(b, uint64(a))
    return b
}

type hasherB string

func (b hasherB) Hash() []byte {
    return []byte(b)
}

h := new(HashTable int)
h.Insert(hasherA(42), 1)
h.Insert(hasherB("Hello world"), 2)

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

type HashTable k v struct {
    Keys []k
    Values []v
}

func (h *(HashTable k v)) Insert(key k, value v) {
    // You can't actually do anything with k, as it's unconstrained. i.e. you can't hash it, compare itтАж
    // Implementing this is impossible in your proposal.
}

// If it weren't impossible, you'd get this:
h := new(HashTable hasherA int)
h[hasherA(42)] = 1
h[hasherB("Hello world")] = 2 // compile error - can't use hasherB as hasherA

рдпрд╛, рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╣реИрд╢-рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдкрдХреЛ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реЗрдЧреА рд▓реЗрдХрд┐рди рдЕрдм рдкрд░рд┐рдгрд╛рдореА рдХрдВрдЯреЗрдирд░ рдореЗрдВ interface{} рдкрд░ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред

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

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

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

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

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

рдЗрд╕реЗ рдкрдврд╝рдХрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рдЬреЗрдиреЗрд░рд┐рдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реИред рдЗрд╕ рдЧрд▓рддрдлрд╣рдореА рдХреЗ рдХрд╛рд░рдг рдЖрдк рдЗрд╕ рдЧрд▓рдд рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рд╣реИрдВ рдХрд┐ "рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрднреА рднреА рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ"ред рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреБрдХрдбрд╝рд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рдпрд╣реА рд╕реЛрдЪрддрд╛ рд╣реВрдВред рдФрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ len() рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: func len(slice []a) , рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреБрдХрдбрд╝рд╛ рддрд░реНрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ (рдЖрд╕рд╛рди рд╕реНрд▓рд╛рдЗрд╕ рд╣реЗрд░рдлреЗрд░) рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛ред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреБрдХрдбрд╝рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рдиреА рд╕реЗ []int рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рдлрд┐рд░ рд╕реЗ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдХреЛрдИ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреЛ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд╕реНрд▓рд╛рдЗрд╕/рд╕рд░рдгреА рд╕реНрд╡реИрдк, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рд▓реЗрди, рдХреИрдк рдЗрддреНрдпрд╛рджрд┐ред ) рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдХрдо рдкрдбрд╝ рд░рд╣рд╛ рд╣реИред

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

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐-рдЙрджрд╛рд╣рд░рдг рд╡рд╣ рд╕реЙрд░реНрдЯ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рдереЗред

type Sort(slice []a:Lesser, less func(a:Lesser, a:Lesser)) { ... }

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

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

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

// Decorator style, follows the definition of the type thorugh all
// of it's methods.
<strong i="14">@a</strong>: Lesser, Hasher, Equaler
func Sort(slice []a) { ... }
<strong i="15">@k</strong>: Equaler, Hasher
type HashTable k v struct

// Inline, follows the definition of the type through
// all of it's methods.
func [a: Hasher, Equaler] Sort(slice []a) { ... }
type [k: Hasher, Equaler] HashTable k v struct

// File-scope global style, if k appears as a generic argument
// it's constrained by this that appears at the top of the file underneath
// the imports but before any other code.
<strong i="16">@k</strong>: Equaler, Hasher

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

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

func map(slice []a, mapper func(a) b) {
  for i := range slice {
    slice[i] = mapper(slice[i])
  }
}

type Result a b struct {
  Ok  a
  Err b
}

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

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

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

func m(slice []a) []b {
   mapper := func(x a) b {...}
   return map(slice, mapper)
}

mapper рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рд╣рдо x рдкрд░ рдХреМрди рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@keean рдореИрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдХрд╛рд░реНрдп рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдореИрдВ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрдВрдЯреЗрдирд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░ (рд╕рд╛рдорд╛рдиреНрдп рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП) рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд▓рд╛рдЗрд╕ рдЬреИрд╕реА рд╕рд╛рдзрд╛рд░рдг рдЪреАрдЬреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╣рддреНрд╡ рдирд╣реАрдВ рджреЗрддрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

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

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк x рдкрд░ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрд▓рд╛рдЗрд╕ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ func рдХреЗ рдЕрдВрджрд░ func рдХреНрдпрд╛ рд╣реИ ... рд╢рд╛рдпрдж рдЖрдк рдПрдХ var рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ?

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

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

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

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

рдХреНрдпрд╛ рдмрд╣реБ-рдкреНрд░реЗрд╖рдг рдпрд╣ рд╕рдм рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдЖрдИрдПрдордПрдЪрдУ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @keean рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕/рдЗрдВрдЯрд░рдлреЗрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕реНрдерд┐рд░ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд▓рддрд╛ рд╣реИред
рдпрд╣ рд╕реА ++ рдореЗрдВ рд╡рд┐рдзрд┐ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореБрдЭреЗ рд╕реА # рдХреЗ рд▓рд┐рдП рдкрддрд╛ рдирд╣реАрдВ рд╣реИ)

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

рдХреНрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ "рдмрд╕" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

func Append(t, t2 type, arr []t, value t2) []t {
    v := t(value) // conversion
    return append(arr, v)
}

var arr []float64
v := 0

arr = Append(float64, int, arr, v)

@ рдЗрдиреБрдЖрд░реНрдЯ рдиреЗ рд▓рд┐рдЦрд╛:

рдХреНрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ "рдмрд╕" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

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

рдпрджрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func Append(arr []t, value s) []t  requires Convertible<s,t>{
    v := t(value) // conversion
    return append(arr, v)
}

var arr []int64
v := 0.5

arr = Append(arr, v)

рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреА рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

func convert(value s) t requires Convertible<s,t>{
    return t(value);
}

f:float64:=2.0

i:int64=convert(f)

рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рд╣рдорд╛рд░реА рдЬреАрдирд╕ рднрд╛рд╖рд╛ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП Convertible<s,t> рдЕрдВрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдЬрд╛рдВрдЪ рдореЗрдВ рдЕрд╡рдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

func Append(t, t2 type, arr []t, value t2) []t {
    v, ok := t(value) // conversion
    if !ok {
        panic(...) // or return an err
    }
    return append(arr, v)
}

var arr []float64
v := 0

arr = Append(float64, int, arr, v)

рд▓реЗрдХрд┐рди рдпрд╣ reflect рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

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

@ рдХреНрд░реЗрдХрд░

рдХреНрдпрд╛ рдмрд╣реБ-рдкреНрд░реЗрд╖рдг рдпрд╣ рд╕рдм рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рджрд┐рдорд╛рдЧ рдореЗрдВ рд╣реВрдВред рдПрдХ рддрд░рдл рдмрд╣реБ-рдкреНрд░реЗрд╖рдг (рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде) рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ 'рдЧреЛ' 'рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди' рдХрд╣рддрд╛ рд╣реИред

type Equals<T> interface {eq(right T) bool}
(left I) eq(right I) bool {return left == right}
(left I) eq(right F) bool {return false}
(left F) eq(right I) bool {return false}
(left F) eq(right F) bool {return left == right}

func main() {
    x := []Equals<?>{I{2}, F{4.0}, I{2}, F{4.0}}
}

рд╣рдо Equals рдХреЗ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрд╕реА рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╣реИред рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ:

data Equals = forall a . IEquals a a => Equals a

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

data Equals = forall a b . IEquals a b => Equals a

рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ b рдХреЛ a (рдпрджрд┐ a рднреА рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реИ) рдХреЗ рд╕рдорд╛рди рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ:

(left K) eq(right I) bool {return false}
(left K) eq(right F) bool {return false}
(left I) eq(right K) bool {return false}
(left F) eq(right K) bool {return false}
(left K) eq(right K) bool {return left == right}

рдФрд░ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдпрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рднреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрдЧрд╛ред

рджреВрд╕рд░реА рдУрд░ рд╣рдо рдЗрд╕реЗ 'рдЧреЛ' рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

package main

type I struct {v int}
type F struct {v float32}

type EqualsInt interface {eqInt(left I) bool}
func (right I) eqInt (left I) bool {return left == right}
func (right F) eqInt (left I) bool {return false}

type EqualsFloat interface {eqFloat(left F) bool}
func (right I) eqFloat (left F) bool {return false}
func (right F) eqFloat (left F) bool {return left == right}

type EqualsRight interface {
    EqualsInt
    EqualsFloat
}

type EqualsLeft interface {eq(right EqualsRight) bool}
func (left I) eq (right EqualsRight) bool {return right.eqInt(left)}
func (left F) eq (right EqualsRight) bool {return right.eqFloat(left)}

type Equals interface {
    EqualsLeft
    EqualsRight
}

func main() {
    x := []Equals{I{2}, F{4.0}, I{2}, F{4.0}}
    println(x[0].eq(x[1]))
    println(x[1].eq(x[0]))
    println(x[0].eq(x[2]))
    println(x[1].eq(x[3]))
}

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

type EqualsRight interface {
    EqualsInt
    EqualsFloat
}

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

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

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ (рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕?) Blah[E] рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдЬреЗрдирд░рд┐рдХ рдпреБрдХреНрдд рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

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

type Comparer[C] interface {
    Compare(other C) bool
}
// or
type Comparer c interface {
    Compare(other c) bool
}
...

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА type рдШреЛрд╖рдгрд╛ рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ?

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

type Comparer interface[C] {
    Compare(other C) bool
}

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Comparer рдХреЗрд╡рд▓ interface[C] { ... } рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ interface[C] { ... } рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ interface { ... } рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕рдХрд╛ рдирд╛рдо рд▓рд┐рдП рдмрд┐рдирд╛ (рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реИ рдФрд░ рдЧреЛ рдХреЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВред

рдиреЛрдЯ: рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗрд╡рд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕, рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдФрд░ рдлрдВрдХ рдкрд░ рд╣реА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧреА:
interface[G] { ... }
struct[G] { ... }
func[G] (vars...) { ... }

рдлрд┐рд░ рдЬреЗрдирд░рд┐рдХ рдХреЗ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдВрдЧреЗ:
interface[G] { ... }[string]
struct[G] { ... }[string]
func[G] (vars...) { ... }[int](args...)

рдФрд░ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

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

package add

type Adder interface[E] {
    // Adds the element and returns the size
    Add(elem E) int
}

// Adds the integer 5 to any implementation of Adder[int].
func AddFiveTo(a Adder[int]) int {
    return a.Add(5)
}

рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕

package heap

type List struct[T] {
    slice []T
}

func (l *List) Add(elem T) { // T is a type defined by the receiver
    l.slice = append(l.slice, elem)
}

рдХрд╛рд░реНрдпреЛрдВ

func[A] AddManyTo(a Adder[A], many ...A) {
    for _, each := range a {
        a.Add(each)
    }
}

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

рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

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

type X(type T C) struct {
  R // A regular type with method Foo()
  T // Some type parameter
}
// X defines some methods other than Foo(),
// some of which invoke Foo.

рдХреБрдЫ рдордирдорд╛рдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП R рдФрд░ рдХреБрдЫ рдордирдорд╛рдиреЗ рдЕрдиреБрдмрдВрдз C рдЬрд┐рд╕рдореЗрдВ Foo() рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред

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

рдорд╛рди рд▓реЗрдВ рдХрд┐ Bar рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬреЛ C рдХреЗ рддрд╣рдд рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдЬрд┐рд╕рдореЗрдВ Foo рдирд╛рдо рдХреА рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИред

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

X(Bar) Foo X(Bar).R.Foo рд░реВрдк рдореЗрдВ рд╣рд▓ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЦрди рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓реНрдк рдирд┐рдпрдореЛрдВ рдХреЗ рдирд╛рдЗрдЯрдкрд┐рдХрд░реА рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рдкрд╛рдардХ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред X рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд╣рд░, рдЪрдпрдирдХрд░реНрддрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд░рд╣реЗрдЧрд╛, рдЬрдмрдХрд┐ interface { Foo() } X X рдХреА рдХреБрдЫ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛рдПрдВ рд╣реЛрдВрдЧреА рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗред

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

(рдпрджрд┐ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдо T рд╣реЛрдЧрд╛, рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдХрд┐ $#$ type S = io.Reader $#$ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдореНрдмреЗрдбреЗрдб S рдХрд╛ рдлрд╝реАрд▓реНрдб рдирд╛рдо S рд╣реИ Reader рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рднреА рдХрд┐ T рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╛рдо рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред)

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

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

type R struct(type T) {
    io.Reader
    T
}

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

func (r R) Do() {
     r.Read(buf)     // Illegal
     r.Reader.Read(buf)  // ok
}

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

func (r R) Do() {
    var x interface{} = r
    x.(io.Reader)    // Succeeds
}

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

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

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

contract C(t T) {
  interface { Foo() } (X(T){})
  // ...
}

type X(type T C) struct {
  R // A regular type with method Foo()
  T // Some type parameter
}
// X defines some methods other than Foo(),
// some of which invoke Foo.

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

@stevenblenkinsop рд╣рдореНрдо, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдЕрдЧрд░ рдЕрдЬреАрдм рд╣реИ, рддреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП X рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд┐рдП рдмрд┐рдирд╛

contract C(t T) {
  struct{ R; T }{}.Foo
}

C рдЕрднреА рднреА X рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдвреАрд▓рд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ

func (x X(T)) Fooer() interface { Foo() } {
  return x
}

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

рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

Go2 рдХреЗ рдорд╕реМрджреЗ рдХреА рдШреЛрд╖рдгрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ред

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

рдпрд╣ @ianlancetaylor рдХреЗ рдкрд╣рд▓реЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрд▓рдмреНрдз рдерд╛ред рдпрд╣ рдореМрд▓рд┐рдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ (type T рдЖрджрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рд╕рдордХрдХреНрд╖ рдХреБрдЫ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрди рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╕ рдХреБрдЫ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдпрд╣ рдпрд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реИ: https://gist.github.com/jimmyfrasche/656f3f47f2496e6b49e041cd8ac716e4

рдирд┐рдпрдо рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдХреЛ рддрдм рддрдХ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ (1) рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдХреА рдкрд╣рдЪрд╛рди рдЬреНрдЮрд╛рдд рди рд╣реЛ рдпрд╛ (2) рд╡рд┐рдзрд┐ рдХреЛ рдмрд╛рд╣рд░реА рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВред рд╕рдВрдХрд▓рдХ рдЧрд╣рд░рд╛рдИ рдкрд░ рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реА рд╕реАрдорд╛рдУрдВ рдХреЛ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдЪрд╛рд░рд┐рдд рд╡рд┐рдзрд┐ рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ O рдХреЗ рднреАрддрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ рдЬреЛ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ O , рдпрд╛рдиреА рдЕрдиреНрдп рдкреНрд░рдЪрд╛рд░рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рднреАрддрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЧрд╣рд░рд╛рдИ рд╕реАрдорд╛ [0, inf) рд╣реЛрдЧреАред

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

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

type Wrapper(type T) { T }

рдЖрдк рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ *Wrapper(T) рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХрд╛ рдЕрдиреБрдмрдВрдз рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдмрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

type Interface interface {
  SomeMethod(int) error
}

contract MightBeAPointer(t T) {
  Interface(t)
}

func Example(type T MightBeAPointer)(v T) {
  var i Interface = v
  // ...
}

рдореИрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдХреЛрдИ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ

type S struct{}
func (s *S) SomeMethod(int) error { ... }
...
var s S
Example(S)(s)

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ S рдХреЛ Interface рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛, рдХреЗрд╡рд▓ *S рд╣реА рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЬрд╡рд╛рдм "рдРрд╕рд╛ рдордд рдХрд░реЛ" рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдиреБрдмрдВрдз рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ:

contract Contract(t T) {
    var _ error = t.SomeMethod(int(0))
}

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

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

рдлрд┐рд░ рд╕реЗ рдПрдореНрдмреЗрдб рдХрд░рдирд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдПрдХ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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

contract Embeddable(type X, Y) {
    type S struct {
        X
        Y
    }
}

type Embedded(type First, Second Embeddable) struct {
        First
        Second
}

// Error: First and Second both provide method Read.
// That must be diagnosed to the Embeddable contract, not the definition of Embedded itself.
type Boom = Embedded(*bytes.Buffer, *strings.Reader)

@bcmills рдЕрд╕реНрдкрд╖реНрдЯ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕ рдЕрдиреБрдмрдВрдз рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

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

@bcmills рдЕрд╕реНрдкрд╖реНрдЯ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕ рдЕрдиреБрдмрдВрдз рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рд╣рдореНрдо, рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБред рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмрд╛рдзрд╛ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИред┬╣

contract Embeddable(type X, Y) {
    type S struct {
        X
        Y
    }
    var _ io.Reader = S{}
}

┬╣ https://play.golang.org/p/3wSg5aRjcQc

рдЗрд╕рдХреЗ рд▓рд┐рдП X рдпрд╛ Y рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХреЛ io.Reader рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рдкреНрд░рдгрд╛рд▓реА рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореБрдЭреЗ рдРрд╕реЗ рдЬрд╛рдирд╡рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

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

рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд░рддреЗ рд╣реИрдВ

type S (type T C) struct {
  io.Reader
  T
}
func (s *S(T)) X() io.Reader {
  return s
}

рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ T рдореЗрдВ Read рдЪрдпрдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ C рди рд╣реЛ

struct{ io.Reader; T }.Read

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

рдХреНрдпрд╛ рд╣рд░ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ S рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рдЪрдпрдирдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рд╣рд╛рдБ, рдРрд╕рд╛ рд╣реА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдХреБрдЫ рдЧрд╣рд░рд╛ рд╣реИ ...

рдореИрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмреБрд░рд╛ рдХреБрдЫ рднреА рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╖рдорддрд╛ рдХрд╛рдлреА рдЕрдкреНрд░рд┐рдп рд╣реИ рдФрд░ рдореБрдЭреЗ рдЕрд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░рд╛рддреА рд╣реИ:

type I interface { /* ... */ }
a := G(A) // ok, A satisfies contract
var _ I = a // ok, no selector overlap
b := G(B) // ok, B satisfies contract
var _ = b // error, selector overlap

рдореИрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдЬрдм G0(B) рдПрдХ G1(B) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред . . Gn(B) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ Gn рд╡рд╣ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред . . .

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

// Error: Duplicate field name Reader
type Boom = Embedded(*bytes.Reader, *strings.Reader)

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

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

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

type Lockable(type T) struct {
    T
    mu sync.Mutex
}

func (l *Lockable(T)) Get() T {
    l.mu.Lock()
    defer l.mu.Unlock()
    return l.T
}

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

рдореИрдВ рдЕрднреА рдпрд╣рд╛рдБ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдмреИрдард╛ рд╣реВрдБ рдФрд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБред рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рдЪрд┐рдВрддрд╛ рднреА рд╣реЛ рд░рд╣реА рд╣реИред

рдПрдХ рдмрд╛рдд рдХрд╣рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдХреЛрдИ рд╢рд░реНрдо рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ 90% рдореЗрд░реЗ рд╕рд┐рд░ рдкрд░ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ, рдпрд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдЬреНрдо рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ 20 рд╕рд╛рд▓ рдХреА рдХрдорд╛рдИ рдиреЗ рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрд╛ред

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

рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЧрд▓рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред

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

рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдмрд╕ рдЦреЗрд▓ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдЧреЛ рдХреЗ рд╕рд╛рде рджреБрдирд┐рдпрд╛ рдХреЛ рдЬреАрддрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрдВрднреАрд░ рдирд╣реАрдВ рдерд╛ред

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

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

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

рд╕рд░рд▓рддрд╛, рдФрд░ рд╕реАрдЦрдиреЗ рдХреА рдЧрддрд┐ред рдпреЗ рднрд╛рд╖рд╛ рдХреА рдЕрд╕рд▓реА рд╣рддреНрдпрд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдорд╣реАрдиреЛрдВ рдХреА рдХрдбрд╝реА рдореЗрд╣рдирдд рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдХреНрд╕рд░ рд╡реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рд╣реИ, рдФрд░ рдирд┐рдпреЛрдХреНрддрд╛ рдЬреЛ рд░реЛрдЬрд╝рд╛рдирд╛ рдкреНрд░рдЧрддрд┐ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдзрдиреНрдпрд╡рд╛рдж рдЪреБрд╕реНрдд, рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВ)

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЧреЛ рдЯреАрдо рджреЛ рдмрд╛рддреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреА рд╣реИ:

1) рд╣рдо рдХрд┐рд╕ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣ рд░рд╣реЗ рд╣реИрдВ?

рдореБрдЭреЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рдПрдХ рд╢реЛ рд╕реНрдЯреЙрдкрд░ рдХреЗ рд╕рд╛рде рдЬрд┐рд╕реЗ рдЬреЗрдирд░рд┐рдХ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рд░рд╕реЛрдИ рдХреА рдХрд┐рддрд╛рдм рдХреА рд╢реИрд▓реА рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣рд░ рджрд┐рди рдХреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИрдВ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд┐ рдЗрди рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

2) рдЗрд╕реЗ рд╕рд░рд▓ рд░рдЦреЗрдВ, рдЬреИрд╕реЗ рдХрд┐ Go . рдХреА рдЕрдиреНрдп рд╕рднреА рдмреЗрд╣рддрд░реАрди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рдпрд╣рд╛рдБ рдХреБрдЫ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмреБрджреНрдзрд┐рдорд╛рди рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЪреАрдЬреЛрдВ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЦреБрд╢ рдФрд░ рдЙрддреНрдкрд╛рджрдХ рд╣реИрдВ рдЬреИрд╕реЗ рд╡реЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдРрд╕реА рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддрд░реНрдХ? '--рдХрдЯреНрдЯрд░'

рдЕрдЧрд░ рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреБрдЦ рд╣реЛрдЧрд╛ред рдмрд╕ 'рдирд╣реАрдВ' рдХрд╣реЛ

рдФрд░ рдпрд╣реА рд╡рд╣ рдЪреАрдЬ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ..... рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдо рд╕рднреА рдпрд╣рд╛рдВ рдЗрд╕рдХреА рдкреНрд░рджрд░реНрд╢рди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рдЧрддрд┐ рд╕реЗ рдЗрд╕реЗ рд╕реАрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдЙрди 8 рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдмреЗрдЬреЛрдбрд╝ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд╕реАрдЦрд╛ рд╣реИред

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реБрдБред рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд░рд▓рддрд╛ рдХреЗ рд╕рд╛рде рд╢рдХреНрддрд┐ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдЧреЛ рдЗрд╕реЗ рдЦреЛ рджреЗ, рдФрд░ рдЬрд┐рддрдирд╛ рдореБрдЭреЗ рдЬреЗрдирд░рд┐рдХ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдЙрд╕ рдХреАрдордд рдкрд░ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдЦреЛрдирд╛ рдЬрд░реВрд░реА рд╣реИред

рдореБрдЭреЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рдПрдХ рд╢реЛ рд╕реНрдЯреЙрдкрд░ рдХреЗ рд╕рд╛рде рдЬрд┐рд╕реЗ рдЬреЗрдирд░рд┐рдХ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рджреЛ рдореБрдЦреНрдп рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ: рдмрд╛рдЗрдирд░реА рдЯреНрд░реА, рд╕реЗрдЯ, рдФрд░ sync.Map рдЬреИрд╕реЗ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЙрдиреНрдореВрд▓рди, рдФрд░ _compile-time_ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛ рдЖрдзрд╛рд░рд┐рдд рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░, рди рдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЙрдирдХреЗ рд▓реЗрдЖрдЙрдЯ рдкрд░ред рд╡рд╣рд╛рдБ рдХреБрдЫ рдХрдЯреНрдЯрд░ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд░рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА рдЕрдЧрд░ рднрд╛рд╖рд╛ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред

рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдХрд╛рдлреА рдЕрдкрдорд╛рдирдЬрдирдХ рд╣реИрдВред рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╡реЗ _not_ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдХреНрд╕рд░, 'рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░' рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЧреЛ рд╕рдВрд╕реНрдХреГрддрд┐ рд╣реИ, рдЬреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЦреЛрдЬрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди, рдЖрд╕рд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрдм рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

@camstuart

рдореБрдЭреЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рдПрдХ рд╢реЛ рд╕реНрдЯреЙрдкрд░ рдХреЗ рд╕рд╛рде рдЬрд┐рд╕реЗ рдЬреЗрдирд░рд┐рдХ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЬреЗрдирд░рд┐рдХ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА, рдмрд╛рдЗрдирд░реА рдЯреНрд░реА, рдбреЗрдХ, рдпрд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛-рдХрддрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдХрднреА рднреА рд╕реЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдердо, рд╡рд┐рднрд╛рдЬрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдпрд╛ рд░реЛрдЯреЗрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЖрджрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдорд╛рдирдХ рд╕рдВрдЧреНрд░рд╣ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдирдХреНрд╢рд╛) рдХреА рд░рдЪрдирд╛ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рд░рдЪрдирд╛ рдХрд░рддрд╛ рд╣реИ (рдореБрдЭреЗ рдбреЗрдЯрд╛, рд╡рд┐рднрд╛рдЬрди рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдШреБрдорд╛рдПрдБ)ред рдпрджрд┐ рдЖрдк рдЗрди рдШрдЯрдХреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рддреНрд░реБрдЯрд┐ рджрд░ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрддрд╛рд░, рдпрд╛ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЧрд▓рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдмрдЧ рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХрдо рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдорд╛рдирдХ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЕрдореВрд░реНрдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдпрд╣ рд╕рдм рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЕрднреА рдЧреЛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рдореБрдЦ, рд░рдирдЯрд╛рдЗрдо рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд╛ _and_ рдХреЗ рдкреВрд░реНрдг рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рдеред рдЬреЗрдирд░рд┐рдХ рдЖрдкрдХреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдбрд╛рдЙрдирд╕рд╛рдЗрдб рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

/*

* "generic" is a KIND of types, just like "struct", "map", "interface", etc...
* "T" is a generic type (a type of kind generic).
* var t = T{int} is a value of type T, values of generic types looks like a "normal" type

*/

type T generic {
    int
    float64
    string
}

func Sum(a, b T{}) T{} {
    return a + b
}

рдлрдВрдХреНрд╢рди рдХреЙрд▓рд░:

Sum(1, 1) // 2
// same as:
Sum(T{int}(1), T{int}(1)) // 2

рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

type ItemT generic {
    interface{}
}

type List struct {
    l []ItemT{}
}

func NewList(t ItemT) *List {
    l := make([]t)
    return &List{l}
}

func (p *List) Push(item ItemT{}) {
    p.l = append(p.l, item)
}

рдлреЛрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛:

list := NewList(ItemT{int})
list.Push(42)

рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдИ рд╕рд┐рд░реНрдл рд╕реНрд╡рд┐рдлреНрдЯ рд╕реАрдЦ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЛ, рд╕реА, рдЬрд╛рд╡рд╛, рдЖрджрд┐ рдЬреИрд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдиреБрднрд╡ рд╣реИ; рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ (рдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ, рдпрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдЧреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧреЛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕реА ++ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдЧреНрд░реЗрд╢рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рд┐рдХ T рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдпрд╣ рд╕рдордЭрдирд╛ рдЗрддрдирд╛ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдпрд╣ рдЬрдореАрди рдкрд░ рдЖрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдиреЗ 2 рд╕реЗрдВрдЯ (рд░рд╛рдп) рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

@jlubawy
рдХреНрдпрд╛ рдЖрдк рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореБрдЭреЗ рдХрднреА рднреА рдПрдХ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдпрд╛ рдХреНрд╡рд┐рдХреЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рд╕реНрдЯреЗрдкрд╛рдиреЛрд╡ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ "рдиреНрдпреВрдирддрдо" рдФрд░ "рдЕрдзрд┐рдХрддрдо" рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рдордп рдХреЗ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрдпрд╛ рдЙрдореНрдореАрдж рд╣реИред рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЦреАрдВрдЪреВрдВрдЧрд╛ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ?

@jlubawy

рдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ, рдпрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

рд╕рдм рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо C++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рд╣рд╛рдБ, рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рд╣рдо C# рдЬреЗрдирд░рд┐рдХ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд╕рд░реА рдмрд╛рдд рд╣реИред рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реА рдпрд╣рд╛рдБ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЧреЛ рдЯреАрдо рдиреЗ рдЧреЛ 2.0 рдХреЗ рдорд╕реМрджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ:
https://golang.org/s/go2designs

рдЧреЛ 2.0 (рдЕрдиреБрдмрдВрдз) рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╕реМрджрд╛ рд╣реИред рдЖрдк рдЙрдирдХреЗ рд╡рд┐рдХреА рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЦрдВрдб:

рдЬреЗрдиреЗрд░рд┐рдХреНрд╕

рдорд╕реМрджрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдкреВрдЫрддрд╛ рд╣реВрдВ:

рдХреНрдпреЛрдВ

рдЯреА: рдЬреЛрдбрд╝рдиреЗ рдпреЛрдЧреНрдп

рдорддрд▓рдм "рдПрдХ рдкреНрд░рдХрд╛рд░ рдЯреА рдЕрдиреБрдмрдВрдз рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпреЛрдЧреНрдп"? рдПрдХ рдирдпрд╛ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ
рдЕрд╡рдзрд╛рд░рдгрд╛ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ? рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИ
рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдпрд╣рд╛рдБред рд╣рдо рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: Any
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ Addable рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ T рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЯреА:_ рдпрд╛ рдЯреА: рдХреЛрдИ рднреА
(рдХреЛрдИ рднреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреАрд╡рд░реНрдб рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдирд╛рдо {} рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ) рдХрд░реЗрдЧрд╛
рдЪрд╛рд▓ред

рдмрд╕ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ
рд╕реЗрдВрд╕ рдФрд░ рд╡рд┐рд▓ рдмреЗрдорд╛рдиреА рд╣реЛрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдмреЗрдорд╛рдиреА рд╣реИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдирдИ рд╣реИрдВрдбрд▓рд┐рдВрдЧ wrt
рдЖрддрдВрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ)ред

2018-09-14 6:15 рдЬреАрдПрдордЯреА-05:00 рдХреЛрдЖрд▓рд╛ рдпреЗрдЙрдВрдЧ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com :

рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЧреЛ рдЯреАрдо рдиреЗ рдЧреЛ 2.0 рдХреЗ рдорд╕реМрджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ:
https://golang.org/s/go2designs

рдЧреЛ 2.0 (рдЕрдиреБрдмрдВрдз) рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╕реМрджрд╛ рд╣реИред рдЖрдк рдЪрд╛рд╣реЗрдВрдЧреЗ
рджреЗрдЦрдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП
рдЙрдирдХреЗ рд╡рд┐рдХреА рдкрд░ https://github.com/golang/go/wiki/Go2GenericsFeedback
https://github.com/golang/go/wiki/Go2GenericsFeedback ред

рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЦрдВрдб:

рдЬреЗрдиреЗрд░рд┐рдХреНрд╕

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292#issuecomment-421326634 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AlhWhS8xmN5Y85_aUKT5VnutoOKUAaLLks5ua4_agaJpZM4IG-xv
.

--
рдЯреНрд░рд┐рдкрд▓рдорд┐рдВрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЗрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: "[...] рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЪрд╛рд▓ рдЪрд▓реЗрдВрдЧреЗ
рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ"ред

2018-09-17 11:10 рдЬреАрдПрдордЯреА-05:00 рд▓реБрдЗрд╕ рдорд╛рд╕реБрдПрд▓реА [email protected] :

рдорд╕реМрджрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдкреВрдЫрддрд╛ рд╣реВрдВ:

рдХреНрдпреЛрдВ

рдЯреА: рдЬреЛрдбрд╝рдиреЗ рдпреЛрдЧреНрдп

рдорддрд▓рдм "рдПрдХ рдкреНрд░рдХрд╛рд░ рдЯреА рдЕрдиреБрдмрдВрдз рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпреЛрдЧреНрдп"? рдПрдХ рдирдпрд╛ рдХреНрдпреЛрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ
рдЕрд╡рдзрд╛рд░рдгрд╛ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ? рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИ
рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдпрд╣рд╛рдБред рд╣рдо рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: Any
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ Addable рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ T рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЯреА:_ рдпрд╛ рдЯреА: рдХреЛрдИ рднреА
(рдХреЛрдИ рднреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреАрд╡рд░реНрдб рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдирд╛рдо {} рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ) рдХрд░реЗрдЧрд╛
рдЪрд╛рд▓ред

рдмрд╕ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ
рд╕реЗрдВрд╕ рдФрд░ рд╡рд┐рд▓ рдмреЗрдорд╛рдиреА рд╣реЛрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдмреЗрдорд╛рдиреА рд╣реИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдирдИ рд╣реИрдВрдбрд▓рд┐рдВрдЧ wrt
рдЖрддрдВрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ)ред

2018-09-14 6:15 рдЬреАрдПрдордЯреА-05:00 рдХреЛрдЖрд▓рд╛ рдпреЗрдЙрдВрдЧ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com :

рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЧреЛ рдЯреАрдо рдиреЗ рдЧреЛ 2.0 рдХреЗ рдорд╕реМрджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ:
https://golang.org/s/go2designs

рдЧреЛ 2.0 (рдЕрдиреБрдмрдВрдз) рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╕реМрджрд╛ рд╣реИред рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдЙрдирдХреЗ рд╡рд┐рдХреА рдкрд░ https://github.com/golang/go/wiki/Go2GenericsFeedback
https://github.com/golang/go/wiki/Go2GenericsFeedback ред

рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЦрдВрдб:

рдЬреЗрдиреЗрд░рд┐рдХреНрд╕

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292#issuecomment-421326634 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AlhWhS8xmN5Y85_aUKT5VnutoOKUAaLLks5ua4_agaJpZM4IG-xv
.

--
рдЯреНрд░рд┐рдкрд▓рдорд┐рдВрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЗрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ

--
рдЯреНрд░рд┐рдкрд▓рдорд┐рдВрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЗрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ

@ luismasuelli-jobsity рдЕрдЧрд░ рдореИрдВ рдЧреЛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реВрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдереЗред

рдПрдХ рдкреВрд░реНрд╡ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬрд┐рд╕реЗ рдЕрдВрддрддрдГ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдмрд╣реБрд░реВрдкрддрд╛ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ '+' рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдЕрдиреБрдмрдВрдз рдЖрдкрдХреЛ t == t рдпрд╛ t + t рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдорд╛рдирддрд╛ рдпрд╛ рдЬреЛрдбрд╝ рдЖрджрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЧреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рддрд░рд╣ рд╕реЗ рдЧреЛ рдиреЗ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЕрдиреБрдмрдВрдз рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛ рдЖрдкреВрд░реНрддрд┐ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред рдпрд╣ рдЬреЛ рдЦреЛ рджреЗрддрд╛ рд╣реИ рд╡рд╣ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрд╣ рдпрдХреАрдирди рд╕рд░рд▓ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдпрджрд┐ рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреНрдпреЛрдВ T:Addable рдХрд╛ рдЕрд░реНрде рд╣реИ "рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреА рдЬреЛ рдЕрдиреБрдмрдВрдз рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ"?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ; рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдорд╕реМрджреЗ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рддрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЦреНрдп рдЕрдВрддрд░ рдЖрддрд╛ рд╣реИред рдЕрдиреБрдмрдВрдз рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрдпрд╛рди рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕

func Example(type K, V someContract)(k K, v V) V

рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

contract someContract(k K, v V) {
  k.someMethod(v)
}

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдордиреНрд╡рдп рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ, рд╡реЗ 'рдЙрддреНрд╕реБрдХрддрд╛рдкреВрд░реНрд╡рдХ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди' рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛

type someMethoder(V) interface {
  someMethod(V)
}

func Example(type K: someMethoder(V), V)(k K, v V) V

рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдЯрдкрдЯрд╛ рд╣реИред рдЕрдиреБрдмрдВрдз рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЖрдкрдХреЛ рдЕрднреА рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрдмрдВрдз рдХреЗ 'рддрд░реНрдХ' рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рддрдГ рднрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк func Example(type K, V someContract(K, V))(k K, v V) V рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рдкреВрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрд░реНрдХ рдирд╣реАрдВ, рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

contract Example(k K, v V) {
  k.someMethod(v)
}

func Example(type K, V)(k K, v V) V

рдЙрдкрд░реЛрдХреНрдд рдЬреИрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рдкреБрди: рдЙрдкрдпреЛрдЧ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рдЖрдк рдЕрдиреБрдмрдВрдз рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрдЧреЗ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди рдХреЛ рдХреНрдпреЛрдВ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдкрде рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рд╡реЗ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд░рд╣реЗред рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде, рдкрд░рд┐рднрд╛рд╖рд╛ рд╣рд╡рд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ

type E(Node) interface {
  Nodes() []Node
}

type N(Edge) interface {
  Edges() (from, to Edge)
}

type Graph(type Node: N(Edge), Edge: E(Node)) struct { ... }
func New(type Node: N(Edge), Edge: E(Node))(nodes []Node) *Graph(Node, Edge) { ... }
func (*Graph(Node, Edge)) ShortestPath(from, to Node) []Edge { ... }

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдмрдВрдз рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ 'рд╕рд╛рдорд╛рдиреНрдп' рдХрд╛рд░реНрдп рдирд┐рдХрд╛рдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреЛрдлрдПрдордЯреА-рдЬреИрд╕реЗ рд╕рд░рд▓реАрдХреГрдд рдХреЛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рд╕реНрд╡рдд: рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ рдмрд╛рд╣рд░реА рд╣рд┐рд╕реНрд╕реЗред рдлрд┐рд░ рдЖрдк _could_ рдЗрд╕рдореЗрдВ рдПрдХ рдлрдВрдХреНрд╢рди рдмреЙрдбреА рдХреЛ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗред

рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЕрднреА рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реЛрдВрдЧреА, рдФрд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ рдУрд╡рд░рд▓реИрдк рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ "рд╕реАрдЖрд░рдЯреАрдкреА" рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ, рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ, рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ (рдЕрдиреБрдмрдВрдз рдмрдирд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдЪрд░ рдХреЗ рдПрдХ рд╕реЗрдЯ рдкрд░ рдкреВрд░реНрд╡-рдореМрдЬреВрджрд╛ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ)ред рдмреЗрд╢рдХ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдиреБрдмрдВрдз рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рджреЛрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

"""
рдпрд╣ рдпрдХреАрдирди рд╕рд░рд▓ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдпрджрд┐ рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
"""

рдЬрдм рддрдХ рд╡реЗ рдЖрдкрдХреЛ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЗ рдЕрдВрджрд░, рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ (рдХреЗрд╡рд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕ рдкреНрд░рдХрд╛рд░ DRY рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдпрд╣ рдореБрджреНрджрд╛ (рдФрд░ рдореЗрд░рд╛ рджрд╛рд╡рд╛) рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдиреБрдмрдВрдз рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рд╛ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛, рдФрд░ рдпрд╣ рднреА рдПрдХ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдЙрдХреНрдд рд╕реБрд╡рд┐рдзрд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?

contract Example(t T, v V) {
  t.(interface{
    SomeMethod() V
  })
}

рдЖрдк рдПрдХ рдРрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдХрд╛рд░рдг рдХрд╣реАрдВ рдФрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕реА рдкреИрдХреЗрдЬ рд╕реЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрдмрдВрдз рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рд╡реЗ рдЙрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рдереЗ; рдпрд╣ рдереЛрдбрд╝рд╛ рдордирдорд╛рдирд╛ рд▓рдЧрддрд╛ рд╣реИред

@DeedleFake рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЯрд╛рдЗрдк-рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдлрд┐рд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрдмрдВрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

t.(someInterface) рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдЕрдЪреНрдЫреА рдмрд╛рддред рд╡реВрдкреНрд╕ред

рдЗрд╕рдХреЗ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг 'рдЗрд╕реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдирд╛' рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдРрд╕реЗ рдмрд╣реБрдд рд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд░рдВрдЧ, рдЖрджрд┐, рд▓реЗрдХрд┐рди рдПрдХ рдЙрдкрдХрд░рдг рдЗрд╕реЗ рд▓реЗрдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рддрдм рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЙрдкрдХрд░рдг рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдк-рднрд╛рд╖рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд░рдЯрдХрд░ рд╕реАрдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╣рд╛рде рд╕реЗ рдЕрдиреБрдмрдВрдз рд▓рд┐рдЦрддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐

contract I(t T) {
  var i interface { Foo() }
  i = t
  t.(interface{})
}

рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ T рдХрдо рд╕реЗ рдХрдо Foo() рд╡рд╛рд▓рд╛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдФрд░ рднреА рдХрдИ рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

T рдХрдо рд╕реЗ рдХрдо Foo() рд╡рд╛рд▓рд╛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдФрд░ рднреА рдХрдИ рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ? рдЕрдиреНрдпрдерд╛ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреА рддрд░рд╣

contract Example(t T) {
  t + t
}

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдШрдЯрд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрд┐ рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдШрдЯрд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдЧрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдШрдЯрд╛рд╡ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рджрд┐рдпрд╛, рддреЛ рд▓реЛрдЧ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Sum() рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдкрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рдирд╣реАрдВ, рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдирдЬрд╛рдиреА (рдореЗрд░реЗ рд▓рд┐рдП) рд╕рдВрдкрддреНрддрд┐ рдереА, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдХреЙрдлреА рдХреЗ рдХрд╛рд░рдг рдереАред

рдпрд╣ рдХрд╣рдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдмрдВрдз рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╕рдВрдХрд▓рдХ рд╕рдВрджреЗрд╢ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рд╡реИрдз рдЕрдиреБрдмрдВрдз рдХреЗ рдирд┐рдпрдо рд╕рдЦреНрдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдирдорд╕реНрддреЗ
рдореИрдВрдиреЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд▓рдЧрднрдЧ 1/2 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред
рдЕрдм рдореИрдВрдиреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг 2 рдмрдирд╛ рд▓рд┐рдпрд╛ рд╣реИред рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ:

  • рдЧреЛ-рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд╛рдлреА рд╕рд░рд▓реАрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • рдХрдбрд╝рд╛рдИ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╕рдордЭреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдирд┐рдХрд╛рд▓ рджрд┐рдП рдЧрдП рд╣реИрдВред

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЯрд╛рдЗрдк рдкрд╣рдЪрд╛рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк (рд▓реЗрдХрд┐рди рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЙрдкрдпреБрдХреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд?) рдкреНрд░рд╢реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛:

func Foo() interface{} {
    type S struct {}
    return S{}
}

func Bar(type T)() interface{} {
    type S struct {}
    return S{}
}

func Baz(type T)() interface{} {
    type S struct{t T}
    return S{}
}

func main() {
    fmt.Println(Foo() == Foo()) // 1
    fmt.Println(Bar(int)() == Bar(string)()) // 2
    fmt.Println(Baz(int)() == Baz(string)()) // 3
}
  1. true рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд░рд╣реЗ рд╣реИрдВред
  2. рдЫрд╛рдкреЗ...?
  3. рдкреНрд░рд┐рдВрдЯ false , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╛рдиреА рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдореЗрдВ рдШреЛрд╖рд┐рдд рджреЛ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рд╡реЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ ~ рдХрд▓реНрдкрдирд╛ ~ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ? рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдирд╣реАрдВ рдвреВрдБрдв рд╕рдХрддрд╛ :)

@merovius рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдордзреНрдп рдорд╛рдорд▓рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛:

fmt.Println(Bar(int)() == Bar(int)()) // 2

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ "рдЬреЗрдирд░реЗрдЯрд┐рд╡" рдпрд╛ "рдПрдкреНрд▓рд┐рдХреЗрдЯрд┐рд╡" рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдордПрд▓ рдХреЗ рд╡реЗрд░рд┐рдПрдВрдЯ рд╣реИрдВ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдЕрдкрдирд╛рддреЗ рд╣реИрдВред рдЖрд╡реЗрджрдХ рдкреНрд░рдХрд╛рд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП f(int) == f(int)ред рдЬрдирд░реЗрдЯрд┐рд╡ рдкреНрд░рдХрд╛рд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╣рд░ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдПрдХ рдирдпрд╛ рдЕрджреНрд╡рд┐рддреАрдп 'рдЗрдВрд╕реНрдЯреЗрдВрд╕' рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП t<int> != t<int>ред рдЗрд╕реЗ рдкреВрд░реЗ рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдкрд░ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдПрдХреАрдХрд░рдг, рдЕрдиреБрдорд╛рди рдФрд░ рд╕реБрджреГрдврд╝рддрд╛ рдХреЗ рд▓рд┐рдП рд╕реВрдХреНрд╖реНрдо рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИрдВред рдЙрд╕ рд╕рдордп рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдВрдбреНрд░рд┐рдпрд╛рд╕ рд░реЙрд╕рдмрд░реНрдЧ рдХреЗ "рдПрдл-рдЖрдИрдПрдирдЬреА рдореЙрдбреНрдпреВрд▓" рдкреЗрдкрд░ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ: https://people.mpi-sws.org/~rossberg/f-ing/ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреЗрдкрд░ рдПрдордПрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ " functors" рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ML рдЕрдкрдиреЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рджреЛ рд╕реНрддрд░реЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд╝реИрдХреНрдЯрд░ ML рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдореЙрдбреНрдпреВрд▓ рд╕реНрддрд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВред

@keean рдЖрдк рдЧрд▓рдд рдорд╛рдирддреЗ рд╣реИрдВред

@merovius рд╣рд╛рдВ, рдореЗрд░реА рдЧрд▓рддреА рд╣реИ, рдореБрдЭреЗ рд╕рд╡рд╛рд▓ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рдкреНрд░реЗрдд рдкреНрд░рдХрд╛рд░)ред

рдЬрдирд░реЗрдЯрд┐рд╡ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк 'рдПрд╕' рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рднрд▓реЗ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рд╡реЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдЖрд╡реЗрджрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рддрддреНрдХрд╛рд▓рддрд╛ рд╕реЗ 'рдПрд╕' рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реЗ рдмрд░рд╛рдмрд░ рд╣реЛрдВрдЧреЗред

рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо 2 рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрджрд▓ рдЧрдпрд╛ред рдпреВрдмреА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ 2018 рдХреЗ рд▓реЛрдЧ рд╣реИрдВ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1982 рдореЗрдВ рдЗрд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

func рдорд┐рдирдЯ (рдПрдХреНрд╕, рд╡рд╛рдИ рдЗрдВрдЯ) рдЗрдВрдЯ {
рдЕрдЧрд░ рдПрдХреНрд╕ <рд╡рд╛рдИ {
рд╡рд╛рдкрд╕реА x
}
рддреБрдо рд╡рд╛рдкрд╕ рдЖрдУ
}

func рдЕрдзрд┐рдХрддрдо (x, y int) int {
рдЕрдЧрд░ рдПрдХреНрд╕> рд╡рд╛рдИ {
рд╡рд╛рдкрд╕реА x
}
рддреБрдо рд╡рд╛рдкрд╕ рдЖрдУ
}

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рджреЛрд╕реНрддреЛрдВ рдорд┐рди (рдЖрдИрдПрдирдЯреА, рдЖрдИрдПрдирдЯреА) рдЖрдИрдПрдирдЯреА, рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдХреИрд╕реЗ рдирд╣реАрдВ рд╣реИ?
рдореИрдВ рдирд╛рд░рд╛рдЬрд╝ рд╣реВрдБред

@ dataf3l рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдкреВрд░реНрд╡-рдЖрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ рддреЛ:

func min(x, y int) int {
   if x <= y {
      return x
   }
   return y
}

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХрд┐ рдЬреЛрдбрд╝реА (рдиреНрдпреВрдирддрдо (рдПрдХреНрд╕, рд╡рд╛рдИ), рдЕрдзрд┐рдХрддрдо (рдПрдХреНрд╕, рд╡рд╛рдИ)) рд╣рдореЗрд╢рд╛ рдЕрд▓рдЧ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрд╛ рддреЛ (рдПрдХреНрд╕, рд╡рд╛рдИ) рдпрд╛ (рд╡рд╛рдИ, рдПрдХреНрд╕) рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рджреЛ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рд╣реИред

рддреЛ рдПрдХ рдФрд░ рдХрд╛рд░рдг рдпрд╣ рднрд╛рд╖рд╛ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реЛрдЧ рдЬреНрдпрд╛рджрд╛рддрд░ рдЙрдиреНрд╣реЗрдВ рдЧрд▓рдд рд╕рдордЭрддреЗ рд╣реИрдВ :-)

рдореИрдВрдиреЗ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП <рдмрдирд╛рдо <= рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдХрд╛рдлреА рдЕрдВрддрд░ рджреЗрдЦрддрд╛ рд╣реВрдВред
рд╢рд╛рдпрдж рдореИрдВ рдЧреВрдВрдЧрд╛ рд╣реВрдБ ...

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдХрд╛рдлреА рдЕрдВрддрд░ рджреЗрдЦрддрд╛ рд╣реВрдВред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ рд╣реИред

@cznic рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдЪ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдзрд╛рдЧрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛, рдореИрдВрдиреЗ рдорд╛рдирд╛ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЯрд┐рдкреНрдкрдгреА рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереА, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдУрдкреА рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рдирд╛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдмреБрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзрд╛рдЧреЗ рдореЗрдВ рд╕рд░рд▓ рдПрдХреАрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╖рдп рд╕реЗ рджреВрд░ рдереЗ :-)

рдЬреЗрдирд░рд┐рдХ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХреА рдХрдореА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред рдЕрдм рддрдХ рдЧреЛ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдФрд░ рдЖрд╕рд╛рди рднрд╛рд╖рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдмрдВрдж рд╣реИ, рдЬреЛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХреЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рдмрдбрд╝реА рдЦрд╛рдореА рд╣реИред рдирд┐рдЪрд▓рд╛ рд░реЗрдЦрд╛, рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ, рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ T рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЕрд╡рд▓реЛрдХрди рдХреЛ рдпрд╣рд╛рдВ 'рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛' рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдпреЛрдЧрджрд╛рди рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВ рдбрд┐рдЬрд╛рдЗрди рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрднрд╡реА рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рдХрд░реЗрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдФрд░ рдЯреВрд▓рд┐рдВрдЧ рдЕрднреА рднреА рдХрдорд╛рд▓ рдХреА рдмрдиреА рд╣реБрдИ рд╣реИ)ред

@webern рдзрдиреНрдпрд╡рд╛рджред https://go.googlesource.com/proposal/+/master/design/go2draft.md рджреЗрдЦреЗрдВред

@webern рдзрдиреНрдпрд╡рд╛рджред https://go.googlesource.com/proposal/+/master/design/go2draft.md рджреЗрдЦреЗрдВред

@ianlancetaylor , рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдПрдХ рдХрд╛рдлреА рдХрдЯреНрдЯрд░рдкрдВрдереА/рдЕрджреНрд╡рд┐рддреАрдп рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрднрд╛рд╖рд╛ рдФрд░ рдЯреВрд▓рд┐рдВрдЧ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рд╡рд╣ 'рд╣рд▓реНрдХрд╛' рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЖрдкрдХрд╛ рд▓рд┐рдВрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рдореИрдВ рдХрд░реВрдБрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдПрдордбреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░/рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░реВрдВрдЧрд╛?

рдзрдиреНрдпрд╡рд╛рджред

@webern рдЗрд╕реЗ рд▓рд┐рдЦреЗрдВ (рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ) рдФрд░ рдпрд╣рд╛рдВ рд╡рд┐рдХреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ https://github.com/golang/go/wiki/Go2GenericsFeedback

рдмрд╣реБрдд рд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╣реА рдРрд╕рд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдирд╡реАрдирддрдо рдЯрд┐рдк рдХреЗ рдЦрд┐рд▓рд╛рдл) рдФрд░ рдЕрдиреБрдмрдВрдз рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдкрд╛рд░реНрд╕рд░ (рдФрд░ рдкреНрд░рд┐рдВрдЯрд░) рдХреЗ рд╣рдорд╛рд░реЗ рдкреНрд░реА-рдЧреЛрдлрд░рдХреЙрди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕реАрдПрд▓ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: https://golang.org/cl/149638 ред

рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП:

1) рдЪреЗрд░реА-рд╕реАрдПрд▓ рдХреЛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рд░реЗрдкреЛ рдореЗрдВ рдЪреБрдиреЗрдВ:
рдЧрд┐рдЯ рдлрд╝реЗрдЪ https://go.googlesource.com/go refs/changes/38/149638/2 && git рдЪреЗрд░реА-рдЪреБрдиреЗрдВ FETCH_HEAD

2) рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
cmd/рд╕рдВрдХрд▓рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

3) рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ:
рдЧреЛ рдЯреВрд▓ рдХрдВрдкрд╛рдЗрд▓ foo.go

рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕реАрдПрд▓ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВред рдЖрдирдВрдж рд▓реЗрдирд╛!

contract Addable(t T) {
    t + t
}

func Sum(type T Addable)(x []T) T {
    var total T
    for _, v := range x {
        total += v
    }
    return total
}

рдпрд╣ рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди, func Sum(type T Addable)(x []T) T , рдмрд╣реБрдд рдмрд╣реБрдд рдмрд╣реБрдд рдмрджрд╕реВрд░рдд рд╣реИ !!!

func Sum(type T Addable)(x []T) T рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ func Sum<T: Addable> (x []T) T рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмреЛрдЭ рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ?
рдХреЛрдИ рдХрд╛рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ func Sum(T Addable)(x []T) T рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред

type рдХреАрд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╕реНрд╡рдпрдВ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

@urandom рддрддреНрдХрд╛рд▓ рд╕рдордп рдкрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рд╣рдореЗрдВ type рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдПрдЖрдИрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рд░рд╣рддреЗ рд╣реИрдВред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ type рдХреАрд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛, func Foo(x T) (y T) рдХреЛ рдпрд╛ рддреЛ T рд▓реЗрддреЗ рд╣реБрдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди T рдФрд░ рдПрдХ T рд▓реМрдЯрд╛рдирд╛ред

func рд╕реБрдо(рдПрдХреНрд╕ []рдЯреА) рдЯреА

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореИрдВ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЬреЗрдирд░рд┐рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рднрд╛рд╖рд╛рдИ рджрд╛рдпрд░реЗ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП "рдзреНрдпрд╛рди рджреЗрдВ" рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдирд╡ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЖрд╕рд╛рди (рдкрдврд╝реЗрдВ: рдХрдо рд▓рд┐рд╕реНрдк-рд╡рд╛рдИ) рдмрдирд╛ рджреЗрдЧрд╛, рд╕рд╛рде рд╣реА рд▓рд╛рдЗрди рдХреЗ рдиреАрдЪреЗ рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдорд╛рд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ (рд╕реА ++ рдХрд╛ "рдореЛрд╕реНрдЯ рд╡реЗрдХреНрд╕рд┐рдВрдЧ рдкрд╛рд░реНрд╕" рджреЗрдЦреЗрдВ, рд╕рд╛рд╡рдзрд╛рдиреА рдХреА рдПрдХ рдмрд╣реБрддрд╛рдпрдд рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

рдпрд╣ 2018 рдХреЗ рд▓реЛрдЧ рд╣реИрдВ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1982 рдореЗрдВ рдЗрд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

func рдорд┐рдирдЯ (рдПрдХреНрд╕, рд╡рд╛рдИ рдЗрдВрдЯ) рдЗрдВрдЯ {
рдЕрдЧрд░ рдПрдХреНрд╕ <рд╡рд╛рдИ {
рд╡рд╛рдкрд╕реА x
}
рддреБрдо рд╡рд╛рдкрд╕ рдЖрдУ
}

func рдЕрдзрд┐рдХрддрдо (x, y int) int {
рдЕрдЧрд░ рдПрдХреНрд╕> рд╡рд╛рдИ {
рд╡рд╛рдкрд╕реА x
}
рддреБрдо рд╡рд╛рдкрд╕ рдЖрдУ
}

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рджреЛрд╕реНрддреЛрдВ рдорд┐рди (рдЖрдИрдПрдирдЯреА, рдЖрдИрдПрдирдЯреА) рдЖрдИрдПрдирдЯреА, рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдХреИрд╕реЗ рдирд╣реАрдВ рд╣реИ?
рдореИрдВ рдирд╛рд░рд╛рдЬрд╝ рд╣реВрдБред

рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╣реИред
рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЪрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреА рдкрдВрд╕рджред

рдореБрдЭреЗ рдкреВрд░реА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕реЗ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдПрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ "рдЖрдк рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рджреВрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ" рд░рд╡реИрдпрд╛, рджреВрд╕рд░реЛрдВ рдХреЛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрдкрдШрд░реНрд╖рдХ рдкрдврд╝рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рдореБрджрд╛рдп @ petar-dambovaliev рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рдСрдирд▓рд╛рдЗрди рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдореЗрд░рд╛ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдордЬрдмреВрдд рднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рдЧреЛрдлрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред рдХреГрдкрдпрд╛ рдмрд╛рддрдЪреАрдд рдХреЛ рд╣рд░ рддрд░рдл рд╕реЗ рд╕рдореНрдорд╛рдирдЬрдирдХ рдФрд░ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рд░рдЦреЗрдВред

@bcmills рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рд╕рдореБрджрд╛рдп рдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рдЬрдЧрд╣ рдмрдирд╛рддреЗ рд╣реИрдВред

@katzdm рдиреЗ рд╕рд╣рдорддрд┐ рд╡реНрдпрдХреНрдд рдХреА, рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрд╖реНрдардХ рд╣реИрдВ, рдпрд╣ рдирдпрд╛ рд╕рд╛рдорд╛рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ

generics рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ type's type рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ Go рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╖рдп-рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди function overload рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рдереАред

@xgfone рд╕рд╣рдордд рд╣реИрдВ, рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдХреЛрд╖реНрдардХ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИред
func Sum<T: Addable> (x []T) T рдпрд╛ func Sum<type T Addable> (x []T) T рдмреЗрд╣рддрд░ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде), func Sum[T: Addable] (x []T) T func Sum<T: Addable> (x []T) T рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

рдореИрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдХрд╛рдо рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ Sum<T: Addable> (x []T) T рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдкрдардиреАрдп рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ @katzdm рд╕реЗ рднреА рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рдирдпрд╛ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣ рдЧреЛ рдореЗрдВ рдХреВрджрдиреЗ рд╡рд╛рд▓реЗ рдЧреИрд░-рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╣реИред

FWIW, рд▓рдЧрднрдЧ 0% рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдХреЛрдг рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рд╕реА ++ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдП, рдмреА, рдФрд░ рд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрдордВрддреНрд░рдг рд╕реЗ <рдмреА> рд╕реА (рддреБрд▓рдирд╛ рдХреА рдПрдХ рдХрд╛рдиреВрдиреА рд▓реЗрдХрд┐рди рдЕрд░реНрдерд╣реАрди рд╢реНрд░реГрдВрдЦрд▓рд╛) рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдХреЛрдг рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддреА рд╣реИрдВред

func a < b Addable> (...
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ func рдХреЗ рдмрд╛рдж рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо, ( рдпрд╛ < рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@carlmjohnson рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВ

f := sum<int>(10)

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ sum рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИ..

рд╕реА ++ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдП, рдмреА, рдФрд░ рд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрдордВрддреНрд░рдг рд╕реЗ <рдмреА> рд╕реА (рддреБрд▓рдирд╛ рдХреА рдПрдХ рдХрд╛рдиреВрдиреА рд▓реЗрдХрд┐рди рдЕрд░реНрдерд╣реАрди рд╢реНрд░реГрдВрдЦрд▓рд╛) рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЧреЛ, рд╕реА ++ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ < рдФрд░ > рдСрдкрд░реЗрдЯрд░ bool s рдЧреЛ рдФрд░ < рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ > рдХрд╛ рдЙрдкрдпреЛрдЧ bool s рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ _is_ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХрд╛рдиреВрдиреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИред

рдХреЛрдг рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ List<List<int>> , рдЬрд┐рд╕рдореЗрдВ >> рдХреЛ рд╕рд╣реА рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреЛрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

[] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ, f := sum[int](10) , рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рд░рдгреА рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдПрдХреНрд╕реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░рдирд╛ рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд░реЗ рдФрд░ рдореИрдк рдПрдХреНрд╕реЗрд╕ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ред рдпрд╣ <> рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдПрдХрд▓ < рдХрд╛рдиреВрдиреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ [ рдирд╣реАрдВ рд╣реИред
  • func Example[T](v T) T рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИред
  • ]] рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдЯреЛрдХрди рдирд╣реАрдВ рд╣реИ, рддрд╛рдХрд┐ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рднреА рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред

рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдорд╕реМрджреЗ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ type A [T] int рдореЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЯрд╛рдЗрдк рдирд╛рдо рдХреЗ рдмрдЬрд╛рдп рдХреАрд╡рд░реНрдб рдореЗрдВ рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд:

  • func[T] Example(v T) T
  • type[T] A int

рдпрд╣рд╛рдВ рдЬрдЯрд┐рд▓рддрд╛ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рдгрд╛ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЖ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ

type (
  A int
)

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рджреБрд░реНрд▓рдн рд╣реИ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд╣рдирд╛ рдареАрдХ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рдЬреЗрдирд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк рдЙрди рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реЛрдЧрд╛

type[T] A []T
var s A[int]

рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдЧрд╛рдХрд╛рд░ рдХреЛрд╖реНрдардХ A рдХреЗ рдПрдХ рддрд░рдл рд╕реЗ рджреВрд╕рд░реА рддрд░рдл рдЬрд╛рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдмреЗрд╣рддрд░ рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ type рдХреАрд╡рд░реНрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдХреЛрд╖реНрдардХ рдХреЛ рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдЕрд▓рдЧ [N]T рдмрдирд╛рдо arr[i] рд╣реИ, рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред рд╣рд╛рдВ, рдореЗрдВ var arr [N]T , рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ arr рдХреЗ рдЙрд╕реА рддрд░рдл рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ arr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд▓реЗрдХрд┐рди рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рд╡рд┐рдкрд░реАрдд рд╣реЛрдирд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ ( рдмрдирд╛рдо < рдмрдирд╛рдо [ $ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ type рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ рд╣реИ рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ

@ianlancetaylor ... рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдХреНрдпрд╛ рдлреАрдбрдмреИрдХ рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ? рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдЕрдкрдиреА рд╕рдордЭ рдпрд╣ рдереА рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдРрд╕рд╛ рд▓рдЧрд╛ рдХрд┐ рджреЛрдиреЛрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдореИрдВ рд░реБрдЭрд╛рдиреЛрдВ рдХреЛ рдЧрд▓рдд рдкрдврд╝ рд░рд╣рд╛ рдерд╛ред рдЗрд╕ рд╕рд╛рд▓ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдПрдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ!

рд╣рд╛рдВ, рд╣рдо рдорд╕реМрджрд╛ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрдИ рдкреНрд░рддрд┐-рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдХреБрдЫ рднреА рдлрд╛рдЗрдирд▓ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред

рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП:
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЧреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ https://github.com/cosmos72/gomacro рдореЗрдВ рднрд╛рд╖рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рджреЛрдиреЛрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛

type[T] Pair struct { First T; Second T }
type Pair[T] struct { First T; Second T }

рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдПрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛: рджреВрд╕рд░реЗ рдХреЛ рдПрдХ рдШреЛрд╖рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЛрдбрд╝реА T structs рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рдЬрд╣рд╛рдВ рдЯреА рдХреБрдЫ рд╕реНрдерд┐рд░ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИред рдЬрдм Pair рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдПрдВ рднреА рд╣реЛрддреА рд╣реИрдВ: Pair[int] рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ Pair рдирд╛рдордХ рдПрдХ рд╕рд░рдгреА/рд╕реНрд▓рд╛рдЗрд╕/рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди int (рдиреЛрдЯ: int рдФрд░ рдЕрдиреНрдп рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдЧреЛ рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдкрдбрд╝рд╛ - рдмреЗрд╢рдХ рдмрджрд╕реВрд░рдд, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

template[T] type Pair struct { First T; Second T }
type pairOfInt = Pair#[int]
var p Pair#[int]

рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП:

template[T] func Sum(args ...T) T { /*...*/ }
Sum#[int] (1,2,3)

рдЗрд╕рд▓рд┐рдП, рдЬрдмрдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдПрдХ рд╕рддрд╣реА рдорд╛рдорд▓рд╛ рд╣реИ, рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐:
1) рдПрдХ рддрд░рдл рд╕реЗ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рдордиреЗ рдХреНрдпрд╛ рдЖрдПрдЧрд╛ - рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ, рд╕рд░рд▓ рдФрд░ рд╕рдВрднрд╡рддрдГ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
2) рджреВрд╕рд░реА рдУрд░, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЦрд░рд╛рдм рд╡рд┐рдХрд▓реНрдк рдкреЗрд╢ рдХреА рдЧрдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░, рдЯрд╛рдЗрдкрдЪреЗрдХрд░ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрдЧрд╛

Pair[int] рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди int $ рдХреЗ рд╕рд╛рде Pair рдирд╛рдордХ рдПрдХ рдРрд░реЗ/рд╕реНрд▓рд╛рдЗрд╕/рдореИрдк рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЕрд░реНрдердкреВрд░реНрдг (рдирд╛рдо рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рдж рддрдХ); рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╕рдВрд░рдЪрдирд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рди рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Sum#[int] рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ Sum рдХреНрдпрд╛ рд╣реИред рдореМрдЬреВрджрд╛ рдХреЛрдб рдореЗрдВ (*T) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдпрд╣реА рд╕рдЪ рд╣реИред рдЬрдм рддрдХ рдирд╛рдо рд╕рдорд╛рдзрд╛рди рдкрд╛рд░реНрд╕ рдХреА рдЬрд╛ рд░рд╣реА рд╕рд╛рдордЧреНрд░реА рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛, рддрдм рддрдХ рдЖрдк рдареАрдХ рд╣реИрдВред

рдЗрд╕рдХреА рддреБрд▓рдирд╛ <> рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдХрд░реЗрдВ:

f ( a < b , c < d >> (e) )

рдЖрдк рдЗрд╕реЗ рдЯреЛрдХрди рднреА рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ >> рдПрдХ рдпрд╛ рджреЛ рдЯреЛрдХрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░, рдЖрдк рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рдХрд┐ f рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛ рджреЛ рддрд░реНрдХ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ ... рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕рдВрд░рдЪрдирд╛ a рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдИ рдЧрдИ рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓рддреА рд╣реИред

рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯреАрдо рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реЛрдЪ рдХреНрдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреНрдпрд╛ "рдмрд╛рдзрд╛рдПрдВ-рдмрд╕-рдХреЛрдб" рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдпрд╛ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдмрд╛рдзрд╛ рднрд╛рд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦрди рдХреЛрдб рдЬреЛ рд╢рд╛рдорд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рд╢реИрд▓реА рдХреЛ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рднреА рд╕реАрдорд╛ рд▓рдЧрд╛рдиреА рд╣реЛрдЧреА рдХрд┐ рд╕рдВрдХрд▓рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдпреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрдереНрдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ рдмреНрд░рд╣реНрдорд╛рдВрдб72

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ, рд▓реЗрдХрд┐рди @stevenblenkinsop рджреНрд╡рд╛рд░рд╛ рдЬреЛ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ, рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ рд╢рдмреНрдж:

a b

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдмреА рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ [identifier] рдХреЗ рд╕рд╛рде рдЕрд▓реНрдлрд╛ рдиреНрдпреВрдореЗрд░рд┐рдХ (рдХреЛрдИ рдСрдкрд░реЗрдЯрд░/рдХреЛрдИ рд╡рд┐рднрд╛рдЬрдХ рдирд╣реАрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреАрд╡рд░реНрдб/рд╡рд┐рд╢реЗрд╖ рдЕрд▓реНрдлрд╛рдиреНрдпреВрдореЗрд░рд┐рдХ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрдпрд╛рдд/ рдкреИрдХреЗрдЬ/рдкреНрд░рдХрд╛рд░/func)?.

рдЧреЛ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдкрддрд╛ред

рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ int рдФрд░ Sum[int] рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡реИрд╕реЗ рднреА рднрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛:

type (
    nodeList = []*Node  // nodeList and []*Node are identical types
    Polar    = polar    // Polar and polar denote identical types
)

рдпрджрд┐ рдЧреЛ рдЗрдВрдлрд┐рдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ a type tag рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ type рдПрдХ рдЗрдВрдлрд┐рдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЖрдЬ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рджрд╛рд╡реЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░рддреА рд╣реИ:

рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдХрд┐ T Equatable рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ == рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдорд╛рдиреНрдп рдмрдирд╛рддрд╛ рд╣реИред Equatable рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрд┐рдП рдЧрдП рдирд┐рд░реНрдгрдпреЛрдВ рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдХреБрдЫ рдкреНрд░реЗрд░рдгрд╛ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИ рднрд╛рд╖рд╛ рдореЗрдВ рдкреВрд░реНрд╡-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд▓рдЧрднрдЧ Equatable (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рддрд╛рдХрд┐ рдмрд╣реБрдд рд╕реЗ рдЕрдиреНрдп рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ "рдЕрдиреБрд░реВрдк" рдХрд░ рд╕рдХреЗрдВ)ред рд╕рдорд╛рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ:

protocol Equatable2 {
    static func == (lhs: Self, rhs: Self) -> Bool
}

class uniq: Equatable2 {
    static func == (lhs: uniq, rhs: uniq) -> Bool {
        return false
    }
}

let narf = uniq(), poit = uniq()

func !=<T: Equatable2> (lhs: T, rhs: T) -> Bool {
    return !(lhs == rhs)
}

print(narf != poit)

@ рд╕рд┐рдШреЛрдпрд╛
рдореИрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ a[b] рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - a b рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВред

рдЗрд╕ рдмреАрдЪ рдореИрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЬрдм рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдЬреЗрдирд░рд┐рдХ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рдкрд░рд┐рд╖реНрдХрд╛рд░ рдиреЗ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рджрд┐рдпрд╛ред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕рдХреА рдПрдХ рдЕрдЬреАрдмреЛрдЧрд░реАрдм рдирд╛рдордХрд░рдг рдпреЛрдЬрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд╕рдордЭрдирд╛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП class рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ (рд╕рд╛рдорд╛рдиреНрдп рдпрд╛ рдирд╣реАрдВ) рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдзрд╛ рд╣реИред Eq рд╡рд░реНрдЧ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ '==' рдФрд░ '/=' рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

class Eq a where
  (==) :: a -> a -> Bool
  (/=) :: a -> a -> Bool

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ a рдмрд╛рдзрд╛ Eq рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЗрдВрдлрд┐рдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди == рдФрд░ /= рдХреА "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛" рдореМрдЬреВрдж рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ "рдЙрджрд╛рд╣рд░рдг") a рдХреЗ рд╕рд╛рде рдФрд░ рдПрдХ Bool рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдкрд╛рдП рдЧрдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЧреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдХрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдХрд┐ C++ рдФрд░ Java рд╕реЗ рдкрд░реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪ рдЪрд▓ рд░рд╣реА рд╣реИ:

рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрд╡рд┐рдлреНрдЯ рдЙрджрд╛рд╣рд░рдг, рдФрд░ рдореЗрд░реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдФрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рдЕрдиреБрднрд╡ рдХреА рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдорд╛рддреНрд░рд╛ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдмреАрдЪ рдЙрдкрд▓рдмреНрдз рд╣реИ (рдФрд░ рдЕрдиреНрдп) рднрд╛рд╖рд╛рдПрдБред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЧреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрднрд╡ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рд╣реИред

рднрдЯрдХрд╛ рд╣реБрдЖ рд╡рд┐рдЪрд╛рд░: рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛ рдХрд╛ рд░реВрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХрдо-рдпрд╛-рдХрдо рдЕрдиреБрд░реВрдк рд╣реЛ, рддреЛ рдЖрдк рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░-рдЕрднрд┐рдХрдерди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрджреА рд╣реИрдВ:

type Comparer interface {
  Compare(v interface{}) (*int, error)
}
type PriorityQueue<T.(Comparer)> struct {
  things []T
}

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╣реАрдВ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИ; рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рд╕рд╛рд╣рд┐рддреНрдп рдкрд░ рдкрдХрдбрд╝ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕реЗ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐, рдореБрдЭреЗ рдЧреЛ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдпрддрд╛ рдХреА рднрд╛рд╡рдирд╛ рд╣реИред

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЖрдк рдЧреЛ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрдж рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдЬрдм рднреА рдореИрдВ 'рд╕реА' рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЦреБрдж рдХреЛ рдХреБрдЫ рдирдП рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рдкрд░ рд▓рд┐рд╕реНрдЯ рдпрд╛ рдЯреНрд░реА рдЬреИрд╕реА рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдЧ рд╕реЗ рднрд░реЗ рд╣реЛрддреЗ рд╣реИрдВред рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреВрд░рд╛ рд╕рдореБрджрд╛рдп рдЙрд╕ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдмрдирд╛рдиреЗ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рди рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рдЖрдкрдХрд╛ рдЙрдкрд╛рдп рдХреНрдпрд╛ рд╣реИ?

рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ (рдЬреИрд╕реЗ '==' рдФрд░ '+') рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдЖрдЧреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рддрдВрддреНрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЧреЛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рд╕рд░рд▓ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдирдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк '+' рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рддрд░реНрдХ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ '+' рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рддрд░реНрдХ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВ 'рдкреНрд░рд┐рдВрдЯ' рдирд╛рдордХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ ' рдЬреЛ рдореЗрд░реА рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рдХреЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдореИрдВ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡рд┐рдЯреА рдпрд╛ рд╕рд╣рдпреЛрдЧреАрддрд╛ рдЬреИрд╕реЗ рдХреБрдЫ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рдЧреБрдгреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдЬреНрдпрд╛рджрд╛ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЗрдВрдлрд┐рдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рд╣реИред

рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдПрдВ рдЬреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреА рд╣реИрдВ, рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИрдВ, рдпрджрд┐ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдПрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдмрд╛рдзрд╛рдПрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕рдВрдмрдВрдз рд╣реЛрддреА рд╣реИрдВред рдЧреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдпрд╛ рддреЛ рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рддреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдЧреЛ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдмреЛрд▓реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рдЙрдк-рдЗрд╖реНрдЯрддрдо рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ, рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛ рдХреЛ рдЫреЛрдЯрд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдПрдХ рдирдИ рднрд╛рд╖рд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВред

@keean рдореБрдЭреЗ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдХреБрдЫ рдмрд╛рд░ рдЦреБрдж рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддрдирд╛ рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди, рд╡рд┐рдзрд┐ рд░рд┐рд╕реАрд╡рд░ рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдо рддреМрд░ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрдЧ рдХреЛ рдЦрд╛рдбрд╝реА рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЪрд╛рд░ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдЬрдЯрд┐рд▓ рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдпреЛрдЧреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд▓реЗрдХрд┐рди рдЖрддреНрдордирд┐рд░реНрднрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ - рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╣рддрд╛ рд╣реВрдВ рдкреВрд░реА рдЧрдВрднреАрд░рддрд╛ - рдореБрдЭреЗ рдЧреЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдорд┐рд▓рд╛: рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рд╛ рд╣реИ, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ go:generate рдпрд╛ рдПрдХ рд╕рдорд╛рди рдЙрдкрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж Go1 рд╕рд╣реА рднрд╛рд╖рд╛ рдирд╣реАрдВ рдереА, рдФрд░ рдХреБрдЫ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╢рд╛рдпрдж рдПрдХ рдкреНрд▓рдЧрдЗрди рд░реИрдкрд░ рдХреЗ рд╕рд╛рде рдЕрдЧрд░ рдХреБрдЫ рдЧреЛ рдХреЛрдб рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ _рд╣реЛ рд╕рдХрддрд╛ рд╣реИ_ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ; рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рддрдХ рд╢реВрдиреНрдп рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Go1 рдХреЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рдЕрдЬреАрдм рддрд░реАрдХрд╛ рд╣реЛ, рдпрд╛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд░рд╣рд╛ рд╣реВрдВ рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред

рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдЧреЛ 2 рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдореБрдХреНрдХреЗрдмрд╛рдЬреА/рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ, "рд╕рдВрд╢реЛрдзрди", рд╡рд┐рд░рд╛рд╕рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЗрддреНрдпрд╛рджрд┐ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдЬреАрдм рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реА рдмрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рд╕рд┐рджреНрдз рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдПрдХ рд░рдЪрдирд╛ рд╣реИред рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдПрдХ рдореВрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрдм рд▓рд┐рдЦрд╛ рдерд╛, рд╢рд╛рдпрдж рдПрдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдбреЛрдореЗрди рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╕рдордп рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬрд╛рдиреЗ-рдорд╛рдиреЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рддреЛрдбрд╝рдирд╛ рдЬреЛ рдореИрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдПрдХ рддрд░реНрдХ рдкрд╛рд░реНрд╕рд░, рдХреБрдЫ рдлрд╝рд╛рдЗрд▓ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ, рдпреВрдЖрдИ рдХреЗ рдмрд╛рдзрд╛ рдЖрдзрд╛рд░рд┐рдд рд▓реЗрдЖрдЙрдЯред рдпрд╣ рд╕рд┐рд░реНрдл рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдЧ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рдкрд╣рд▓реА рдмрд╛рд░ "рдиреНрдпреВрдирддрдо" рдФрд░ "рдЕрдзрд┐рдХрддрдо" рдХрд╛ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ (рджреЗрдЦреЗрдВ: http://componentsprogramming.com/writing-min-function-part5/)ред

рдЧреЛ: рдЬрдирд░реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдореИрдХреНрд░реЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЪреЗрдХ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреА, рдЬреЛ рдЖрдк рддрдм рддрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬрдм рддрдХ рдЖрдк рдкреАрдврд╝реА рдХреЛ рдирд╣реАрдВ рдЪрд▓рд╛рддреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореЗрдЯрд╛-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛, рдореИрдВ рд╕рд┐рд░реНрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ :-)

рддреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг _direct_ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрд░реНрде рдХреА рдореЗрд░реА рд╕рдордЭ рд╕реЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд┐рдП рдмрд┐рдирд╛, рдФрд░ рдбреАрдмрдЧ рдХрд░реЗрдВ рдФрд░ рдмрдЧ рдХреЛ рдЬреЗрдирд░реЗрдЯрд░ рдкрд░ рд╡рд╛рдкрд╕ рдХрд╛рдо рдХрд░реЗрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг "рд╕реНрд╡реИрдк" рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рджреЛ рдорд╛рдиреЛрдВ рдХреЛ рд╕реНрд╡реИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВ:

swap<A>(x: *A, y: *A) {
   let tmp = *x
   *x = *y
   *y = tmp
}

рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреЗрдЦрдирд╛ рддреБрдЪреНрдЫ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рд╣реИ, рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХреНрдпреЛрдВ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдореИрдВ рд╕реНрд╡реИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдмреЗрд╢рдХ, рдореИрдВ рдЗрди-рдкреНрд▓реЗрд╕ рд╕реЙрд░реНрдЯ рдХреА рддрд░рд╣ рдЗрд╕рд╕реЗ рдмрдбрд╝реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЧреЛ: рдЬрдирд░реЗрдЯ рдХреЛрдб рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рд▓рд┐рдП рднреА рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИред

рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЧрд▓рддреА рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдЬреИрд╕реЗ:

let tmp = *x
*y = *x
*x = tmp

рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рджреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрд╡реИрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддреЛ рдЗрд╕реЗ рд╣рд╛рде рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдирд╛ред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЧреЛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХрд╛ рдПрдХ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдзреАрдорд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд╕реНрдХреЗрдк-рд╣реИрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рдиреЗ рдХреА рд╢реИрд▓реА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рднрд╛рд╖рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ 'рд░рд╕реНрдЯ' рдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬреЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд┐рд░ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддреА рд╣реИ рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓, рдЧреЛ рдФрд░ рд░рд╕реНрдЯ рдХреЗ рдмреАрдЪ рд╢рд╛рдпрдж рдПрдХ рд╕рднреНрдп рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдХреА рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдмрд┐рдЯреНрд╕ рд╣реИрдВ, рдмрд╕ рд╕рднреА рдорд┐рд╢реНрд░рд┐рдд рд╣реИрдВред

рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП: рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЧреЛ рдЬреЗрдирд░рд┐рдХ рдкрд░ рдПрдХ рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ,

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдореЗрд░реЗ рдЧреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЧреЛрдореИрдХреНрд░реЛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЗрд░рд╛рджреЗ рд╕реЗ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ рдЬреЗрдирд░рд┐рдХ (рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдмрд╛рдж рдореЙрдбрд▓рд┐рдВрдЧ) рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

рдпрд╣ рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ :)

@ рдХреАрди

рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдорд┐рди рдлрдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдФрд░ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝реА рдЪрд╛рд░ рдкреЛрд╕реНрдЯ рдкрдврд╝реАрдВред рдореИрдВрдиреЗ рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ "рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ 'рдорд┐рдирдЯ' рдХрд╛ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ ..."ред рд▓реЗрдЦрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди _is_ рд╕рд╣реА рд╣реИ... рдЬрдм рддрдХ рдХрд┐ рдбреЛрдореЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реИ, рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдЖрдпрд╛рдо рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рдП, рдЬрдм рддрдХ рдХрд┐ рдЙрд╕ рдЖрдпрд╛рдо рдореЗрдВ рдорд╛рди рд╕рдорд╛рди рди рд╣реЛрдВ, рд╕рд┐рд╡рд╛рдп рдХрдм- рдФрд░ рдЖрдЧреЗ, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБ рдкрд░ рддреБрд▓рдирд┐рддреНрд░ рдФрд░ рдЫрдБрдЯрд╛рдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕реВрдХреНрд╖реНрдо рдЫрд┐рдкреА рд╣реБрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдареАрдХ рдпрд╣реА рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рдореИрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ (рдХрдо рд╕реЗ рдХрдо рдЧреЛ рдореЗрдВ; рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИ рдПрдХ рд╕рд╛рде рдкрд░рд┐рдкрдХреНрд╡ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдПрдХ рдЖрд╡реЗрджрди рдореЗрдВ)ред

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдХреНрд░реЛ рдЬреЗрдирд░реЗрдЯрд░ рдореЗрдВ рдЯрд╛рдЗрдк-рд╕реЗрдлреНрдЯреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реВрдВ; рдпрджрд┐ рд╡реЗ рд╕реБрдкрд╛рдареНрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ ( gofmt рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ), рддреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐-рдЬрд╛рдВрдЪ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд░ (рдпрд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб) рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛; рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЫреЛрдЯреЗ рд╕рдордп рдореЗрдВ рдореБрдЭреЗ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ рд╣рдж рддрдХ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг (рдЖрдорддреМрд░ рдкрд░ рдлреНрд▓реЛрдЯ, рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдФрд░ рдкреЙрдЗрдВрдЯрд░-рдЯреВ-рд╕реНрдЯреНрд░рдХреНрдЪрд░ - рдпрджрд┐ рдХреЛрдИ рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП 'рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рди рд╣реЛрдВ, рдЗрди рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реЛрдЧрд╛; рдпрджрд┐ рдЗрди рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЗрдиреЗрд░рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдердо рдирд╣реАрдВ рд╣реИ) рдореИрдХреНрд░реЛ рдХреЛ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред

swap рдПрдХ рдмреБрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ рдореЗрдВ рд╡рди-рд▓рд╛рдЗрдирд░ рд╣реИ, рдЗрд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред

*y, *x = *x, *y

рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА sort рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

type myslice []mytype
func (s myslice) Len() int { return len(s) }
func (s myslice) Less(i, j int) bool { return s[i].whatWouldAlsoBeNeededInAGenericImpl(s[j]) }
func (s myslice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ SortableList<mytype>(myThings).Sort() рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП _lot_ рдХрдо рдШрдирд╛ рд╣реИ, рдмрд╛рдХреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ "рд╣рдХрд▓рд╛рдирд╛" рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрджрд┐ рдмрдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд╛рд░рдг рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдЬрд┐рддрдирд╛ рднрд╛рд░реА рдХреБрдЫ рдЪрд╛рд╣рд┐рдПред рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЭреБрдХ рдЧрдП рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЦреЛ рджреЗрдВрдЧреЗред

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ
'рдиреНрдпреВрдирддрдо/рдЕрдзрд┐рдХрддрдо' рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рддрдм рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ, рдЬрдм рдЖрдк рдПрдХ рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо/рдЕрдзрд┐рдХрддрдо рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреА рдЙрдЪрд┐рдд рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдЬреАрдм рдмрдЧ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рд░рдЪрдирд╛ рдХрд░ рд░рд╣реА рд╣реИ, рдмрд╣реБрдд рдХрдо рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирдП рдЕрднрд┐рдирд╡ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдиреНрдпреВрдирддрдо/рдЕрдзрд┐рдХрддрдо рдФрд░ рд╕реЙрд░реНрдЯ рдХреЗрд╡рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЫреЗрдж рдЪреБрдирдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдЪреБрдиреЗ рд╣реИрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд┐рдВрджреБ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ "рд╕реНрд╡реИрдк" рдЪреБрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рддреНрд╡рд░рд┐рдд рд╣реИред рдореИрдВ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдЪреБрди рд╕рдХрддрд╛ рдерд╛, рд╕реЙрд░реНрдЯ, рд░реЛрдЯреЗрдЯ, рдкрд╛рд░реНрдЯреАрд╢рди, рдЬреЛ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВред рдЬрдм рдЖрдк рдПрдХ рдРрд╕рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдЬреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рд░ рдЕрд▓рдЧ рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрдЧ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ 'рд╕реА' рдореЗрдВ "рд╢реВрдиреНрдп *" рд╕реЗ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИред рдлрд┐рд░ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╡рд╣реА рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЗрди рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдкреНрд░реА-рдСрд░реНрдбрд░, рдЗрди-рдСрд░реНрдбрд░, рдкреЛрд╕реНрдЯ-рдСрд░реНрдбрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рдЦреЛрдЬ, рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЯрд╛рд░реНрдЬрди рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЬреИрд╕реЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╖реНрдХреГрдд рд╕рд╛рдорд╛рди рдкрд░ рдкрд╣реБрдВрдЪреЗрдВред рд╕реЗрдЯ, рдвреЗрд░, рдиреНрдпреВрдирддрдо рдлреИрд▓реЗ рд╣реБрдП рдкреЗрдбрд╝, рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рд░рд╛рд╕реНрддреЗ, рдкреНрд░рд╡рд╛рд╣ рдЖрджрд┐)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдЬреЗрдирд░реЗрдЯрд░ рдХрд╛ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреЗрд╕рди-рд╕реНрдХреАрдорд╛ рдпрд╛ рд╡реНрдпрд╛рдХрд░рдг рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдПрдХ рдкрд╛рд░реНрд╕рд░ рд╕реЗ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХрд┐рд╕реА рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ, рд╕рд░рд▓ рдФрд░ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣реИред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде 'рдЧреЛ' рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ 'рдЧреЛ' рдХреЛ рд╢реБрд░реВ рд╕реЗ рд╣реА рдПрдХ рдЕрдЪреНрдЫреА рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЕрдм рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫреА рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдХреБрдЫ рдкреНрд░рддреНрдпрдХреНрд╖рддрд╛ рдФрд░ рд╕рд░рд▓рддрд╛ рдХреЛ рдЦреЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд╣реИ (рдЬреИрд╕рди-рд╕реНрдХреАрдорд╛ рд╕реЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдпрд╛ рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрд╛рд░реНрд╕рд░реНрд╕ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ рдкрд░реЗ) рддреЛ рдЖрдк рд╢рд╛рдпрдж рд╡реИрд╕реЗ рднреА рдЧрд▓рдд рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: "рдлреНрд▓реЛрдЯ" "рд╕реНрдЯреНрд░рд┐рдВрдЧ" "рдкреЙрдЗрдВрдЯрд░-рдЯреВ-рд╕реНрдЯреНрд░рдХреНрдЪрд░" рдХреЗ рд╕рд╛рде рдЬреЗрдиреЗрд░рд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ рдЬреЛ рдЙрд╕ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж 'рд╕реНрд╡реИрдк' рдХреЛ рдЫреЛрдбрд╝рдХрд░ред рд╕рд╣реА 'рдЬреЗрдиреЗрд░рд┐рдХ' рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреЗрд░рдмрджрд▓ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдмрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╡рд┐рд╡рд╢ рдЬреЗрдирд░рд┐рдХ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╡рд╢ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдорд╛рдирдХ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЗрди-рдкреНрд▓реЗрд╕ рд╕реЙрд░реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рдЖрдк рд╕реАрдорд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреБрдЫ рд╕реАрдорд┐рдд рдЬреЗрдирд░рд┐рдХ 'рдЧреЛ' рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЧреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕рдЪреНрдЪреЗ рд╡рд┐рд╡рд╢ рдЬреЗрдирд░рд┐рдХ рдФрд░ рднреА рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рджреВрд╕рд░рд╛ рдмрд╛рдзрд╛ рддрдВрддреНрд░ рдЬреЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдЬреИрд╕реЗ рд╡рд░реНрддрдорд╛рди рдЬреЗрдирд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдЬрд╣рд╛рдВ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдирдИ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЬреЗрдирд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдиреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдереА, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ '+' рдЬреИрд╕реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗред

@ рдХреАрди
рд╢рд╛рдпрдж рдПрдХ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рдЬрдЧрд╣ рд╣реИред (рд╢рд╛рдпрдж рдирд╣реАрдВ; рдореИрдВрдиреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рджреЗрдЦрд╛ рд╣реИ рдФрд░ рдпрд╣ Go2 рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _the_ рдЬрдЧрд╣ рд╣реИред)

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ! рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдореВрд▓ рдЧреЛ1 рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓реЗрдЦрдХ рднреА рдЗрд╕реЗ рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рд▓реАрдЬ рдХреЗ рдмрд╛рдж рд╕реЗ sort.Stable рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ sort рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ рдЬрдм рд░рд┐рд╕реАрд╡рд░ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХрд┐рддрдиреЗ рдореВрд▓реНрдп рд╣реИрдВ ( Len() int рд╡рд┐рдзрд┐), рдЙрдирдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ ( Less(int, int) bool рд╡рд┐рдзрд┐), рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╕реНрд╡реИрдк рдХрд░реЗрдВ ( Swap(int, int) рд╡рд┐рдзрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)ред рдЖрдк рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ sort.Interface рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдпрд╣ рдзреАрдорд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рдЪреИрдирд▓ рдХреБрд╢рд▓ рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЙрджрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди-рд╕рдордп рдХреЗ рдмрдЬрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЗрд╕реЗ рд╕рд╣реА рд╕рд╛рдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░рд╛ рдорддрд▓рдм рдирд╛рдЗрдЯрдкрд┐рдХ рдХрд░рдиреЗ рдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмреБрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐... рдпрд╣ рдмреБрд░рд╛ рд╣реИред sort рдФрд░ min рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдЬреЗрдирд░рд┐рдХ рдЬреИрд╕реА рдЙрдЪреНрдЪ рдкреНрд░рднрд╛рд╡ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХреЗрд╡рд▓ _not_ рдЕрдВрдХ рд╣реИрдВред рдореИрдВ рдмрд╣реБрдд рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЫреЗрдж рдХрд░рдирд╛ _does_ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд┐рдВрджреБ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ; _my_ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рднрд╛рд╖рд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реЛ рддреЛ рдЬреЗрдирд░рд┐рдХ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ

рднрд╛рд╖рд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ

рдХреМрди - рд╕рд╛? рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЬреЗрдирд░рд┐рдХ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛред рдЬреЗрдирд░реЗрдЯрд░ рдЧреЛ, рдкреНрд▓реЗрди рдФрд░ рд╕рд┐рдВрдкрд▓ рдирд╣реАрдВ рд╣реИрдВред рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд, рдзреАрдорд╛ рдФрд░ рдкреИрдирд┐рдХ рдкреНрд░реЛрди рдХреЛрдб рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЬреЗрдирд░рд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдкреИрдирд┐рдХ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЕрдзрд┐рдХ рдкреНрд░рд╡рдг рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирдП рдПрд░рд░ рдкреИрдХреЗрдЬ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рднреА рдЬреЗрдирд░рд┐рдХ рдХреА рдХрдореА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдПрдкреАрдЖрдИ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХрд╛рдлреА рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ As рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдЧреИрд░ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░, рдШрдмрд░рд╛рд╣рдЯ рд╕реЗ рдЧреНрд░рд╕реНрдд, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди, рдареАрдХ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред

sort , min рдФрд░ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдорд╣рд╛рди рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ - рдХрдВрдкреЛрдЬрд╝рд┐рдмрд┐рд▓рд┐рдЯреАред рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд╡реНрдпрд╛рдкрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЬрдВрдЬреАрд░ рдореЗрдВ рдмрд╛рдВрдзрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рд╕реБрд░рдХреНрд╖рд┐рдд, рддреЗрдЬрд╝ (рдХрдо рд╕реЗ рдХрдо рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрднрд╡ рд╣реИ), рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ, рдЬреЗрдирд░реЗрдЯрд░, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {}, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдЕрдиреНрдп рдЕрд╕реНрдкрд╖реНрдЯ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

@ рдХреНрд░реЗрдХрд░

рдХреМрди - рд╕рд╛?

рд╕рд╛рдорд╛рди рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ sort ред рдХреБрдЫ рднреА рдЬреЛ sort.Interface рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЖрдкрдХреА рдкрд╕рдВрдж рдХреЗ рдПрдХ рд╕реНрдерд┐рд░ рдпрд╛ рдЕрд╕реНрдерд┐рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде; рдХреБрдЫ рдЗрди-рдкреНрд▓реЗрд╕ рд╕рдВрд╕реНрдХрд░рдг sort рдкреИрдХреЗрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ рд╕рдорд╛рди рдпрд╛ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ)ред рдЪреВрдВрдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп sort.Sort рдФрд░ sort.Stable рджреЛрдиреЛрдВ рддрд░реНрдХ рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдореВрд▓реНрдп рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореВрд▓реНрдп рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдорд┐рд▓рддрд╛ рд╣реИ рд╡рд╣ рд╡рд╣реА рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдЖрдкрдиреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ - рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ, рдкреНрд░рдХрд╛рд░ рдЖрдк рд╡рд╛рдкрд╕ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрдкрдиреЗ рд╢реБрд░реБрдЖрдд рдХреА рдереАред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдкреВрд░рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рдХрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдЬреЗрдирд░рд┐рдХ-рд╢реИрд▓реА sort<T> рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдЙрддрдиреЗ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди _at рдХрдо рд╕реЗ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред .

рд╕рд╛рдорд╛рди рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХреЗ рд▓рд┐рдП, рдПрдХ-рд▓рд╛рдЗрдирд░ x, y = y, x ред рдлрд┐рд░, рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд╕реНрдЯ, рдпрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдСрдкрд░реЗрд╢рди рдЯрд╛рдЗрдк-рд╕реЗрдл рд╣реИрдВред

рдПрдХ рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдорд╛рдирддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░рд┐рдХ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред рдореИрдВ рдпрд╣рд╛рдБ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдБ; рдореИрдВ рдЕрднреА рднреА рдХреБрдЫ рдРрд╕рд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ рдЬреЛ рдЬреЗрдирд░рд┐рдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕рднреА рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рднрдпрд╛рдирдХ рд╣реЛрддреЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдореЗрдВ рдЫреЗрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЙрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ xerrors рдкреИрдХреЗрдЬ рднреА рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди xerrors.As рдореБрдЭреЗ рдЧреИрд░-рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди API рд╣реИ json.Unmarshal , рдЖрдЦрд┐рд░рдХрд╛рд░ред рдЗрд╕реЗ рдмреЗрд╣рддрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░/рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдпрдерд╛ рдареАрдХ рд╣реИред

рд▓реЗрдХрд┐рди рдирд╣реАрдВ, sort рдФрд░ min рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ, рдмрд╣реБрдд рднрдпрд╛рдирдХ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдкреВрд░реНрд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЕрдкрдиреЗ рд╡реНрдпрд╛рдкрдХ рдЕрд░реНрдереЛрдВ рдореЗрдВ sort (рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ) рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдпрд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЭреБрдХрд╛рд╡ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╢реЗрд╖ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЗрдирд░рд┐рдХред рдлрд┐рд░ рд╕реЗ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ sort рдкреИрдХреЗрдЬ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдИ рдЬрдирд░реЗрдЯрд░, рдЗрдВрдЯрд░рдлрд╝реЗрд╕{}, рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдпрд╛ "рдЕрд╕реНрдкрд╖реНрдЯ" рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВред рдЧреИрд░-рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ (рдЬреЛ рдПрдкреАрдЖрдИ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ рддрд╛рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд╛рд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ рджрд╛рд╡реЗ)ред рдХреБрдЫ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ _if_ рдЬрд┐рд╕ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЖрдк рд╕реЙрд░реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╣реЛрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдмрд╛рдЗрдирд░реА-рд╕рд░реНрдЪ рдкреЗрдбрд╝ рдХреЗ рд░реВрдЯ рдиреЛрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ?), рддреЛ рдЖрдк рдЗрд╕реЗ sort.Interface рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ

рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрдм рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреЗрд╣рддрд░ рднрд╛рд╖рд╛ рд╣реИ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдмреЗрд╣рддрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ stdlib рдореЗрдВ рдмреЗрд╣рддрд░ sort рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╕реЙрд░реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╡рд░реНрддрдорд╛рди рддрд░реАрдХрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд╛рди рдХреЛрдб рдЯрд╛рдЗрдк рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдореБрдЭреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рджреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реЙрд░реНрдЯ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореБрдЭреЗ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рдкрд╕рдВрдж рд╣реИред

рдкреВрд░реНрд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИред

рдпрд╣ рдПрдХ рдЭреВрдард╛ рджреНрд╡реИрддрд╡рд╛рдж рд╣реИред рдЧреЛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИред рддрдВрддреНрд░ рд╣реА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИред рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдкрд░реЗ рджреЗрдЦреЗрдВ, рдФрд░ рд▓рдХреНрд╖реНрдп рджреЗрдЦреЗрдВ, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред 'рд╕реЙрд░реНрдЯ' рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдХреЗрддрди рдмрд╕ рдЕрд▓рдЧ рд╣реИред рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рдереЗ:

f<T>(x: T) requires Sortable(T)

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЯрд╛рдЗрдк 'рдЯреА' рдХреЛ 'рд╕реЙрд░реНрдЯреЗрдмрд▓' рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред 'рдЧреЛ' рдореЗрдВ рдЗрд╕реЗ func f(x Sortable) рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЧреЛ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рдСрдкрд░реЗрд╢рди рд╣реИрдВ рдЬреЛ рдЕрдВрдХрдЧрдгрд┐рдд, рдпрд╛ рдбреАрд░реЗрдлреЗрд░реЗрдВрд╕рд┐рдВрдЧ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЯрд╛рдЗрдк-рд╡рд┐рдзреЗрдп рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЛ рдХреЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИред

рдЧреЛ рдХреЗ рд╕рд╛рде рд╕реАрдорд╛рдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

func merge(x, y Sortable)

рдЬрд╣рд╛рдВ рд╣рдо рджреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧреЛ рд╣рдореЗрдВ рдпрд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рдЪреАрдЬреЗрдВ рд╕рдорд╛рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

merge<T>(x: T, y: T) requires Sortable(T)

рдпрд╣рд╛рдВ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ рдХрд┐ рд╣рдо рджреЛ рдХреНрд░рдордмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдорд┐рд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди рд╣реИрдВред 'рдЧреЛ' рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╕ "рдХреНрд░рдордмрджреНрдз" рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рднреА рдорд╛рдирддрд╛ рд╣реИред

рдЖрдЗрдП рдПрдХ рдмреЗрд╣рддрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореИрдВ рдПрдХ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рд╣реЛ, рддрд╛рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред

рдЧреЛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИред

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рдХрдерди рдерд╛:

рдпрд╣ рдореБрджреНрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрдХреНрд╡рд┐рд╡реЛрдХреЗрд╢рди рд╕рднреА рдкрд╛рд░реНрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдЕрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ _a_ рд░реВрдк рд╣реИрдВ, рдФрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╣рд░ рдЖрдЦрд┐рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЕрдиреНрдп рд░реВрдк рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдЖрдЗрдП, рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡/рдореБрджреНрджреЗ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ "рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рд╣рд▓" рдорд╛рдирд╛ рдЬрд╛рдПред (рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рднрд╛рд░реА рдмрд╣реБрдордд, рдпрджрд┐ рд╕рднреА рдирд╣реАрдВ, рддреЛ рдЙрд╕ рд╕реЗрдЯ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдПрдХ рд╣реА рднрд╛рд╖рд╛ рдмреЛрд▓ рд░рд╣реЗ рд╣реИрдВред)

рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: func merge(x, y Sortable)

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреЛ рдХреНрд░рдордмрджреНрдз рдЪреАрдЬреЛрдВ (рдпрд╛ sort.Interface рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЗрдВ) рдХреЛ рдорд░реНрдЬ рдХрд░рдирд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рджреЛ рд╕рдВрдЧреНрд░рд╣ _in рд╕рд╛рдорд╛рдиреНрдп_ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП, рд╡рд╣ append рд╣реИ; рдирдХреНрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд╣ for k, v := range m { n[k] = v } рд╣реИ; рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд┐рд▓рдп рд░рдгрдиреАрддрд┐рдпрд╛рдБ рд╣реИрдВ (рдЬрд┐рдирдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдк рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд╛рдЬрди рдФрд░ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рдЙрдк-рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдПрдХ рд╕рд╛рде рд╡рд╛рдкрд╕ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪреБрдирддрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП "рдХреНрд░рдордмрджреНрдз" рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡рд┐рднрд╛рдЬрди рд╣реИрдВ рд╡рд┐рд▓рдп рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА _sorted_ред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд▓рдЧ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд┐рд╕реА рднреА рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ; рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдЕрдкрдиреЗ рдорд░реНрдЬ-рд╕реЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрдареЛрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рдПрдХ _exported_ API рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдмреЛрдЭ рдХрд░рддрд╛ рд╣реИред

рдЖрдк рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдЙрдард╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рджреЛ рдорд╛рди рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ interface{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рдХрдВрдЯреЗрдирд░реЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдкрддреНрд░ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯрд╛рдЗрдк-рд╕реЗрдлреНрдЯреА рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрд┐рд▓реНрдХреБрд▓ рддреБрдЪреНрдЫ рд╣реИ:

type MyStack struct { stack Stack }
func (s *MyStack) Push(v MyType) error { return s.stack.Push(v) }
func (s *MyStack) Pop() (MyType, error) {
  v, err := s.stack.Pop()
  var m MyType
  if v != nil {
    if m, ok := v.(MyType); ok { return m, err; }
    panic("this code should be unreachable from the exported API")
  }
  return nil, err
}

рдореИрдВ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рдПрдХ (рдкрд╛рда /) рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк //go:generate stackify MyType github.com/me/myproject/mytype рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдк рд╕реНрдЯреИрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ go generate рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрдирд╛рдиреЗ рджреЗрдВред рдЬрдм рддрдХ cmd/stackify/stackify_test.go рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА - рдФрд░ рдпрд╣ рд╢рд╛рдпрдж рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рднреА рдХрдВрдкрд╛рдЗрд▓рд░ "рд╣реБрдб рдХреЗ рдиреАрдЪреЗ" рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдзрд┐рдХ рд╕рд╣рд╛рдпрдХ рд╣реЛрддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрдо рд╕рдШрди рд╣реЛрддреА рд╣реИрдВред

(рдРрд╕реЗ рдорд╛рдорд▓реЗ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп _something_ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ "рд╕рд╛рдорд╛рди рдХреЗ рдХрдВрдЯреЗрдирд░" рд╢реНрд░реЗрдгреА рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрдорд╛рдг рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛрдбрд╝рдирд╛ рдЕрднреА рднреА рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред)

рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ _isn't_ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдПрдХ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдЬреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП sort рдпрд╛ encoding/json рдЬреИрд╕реЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕рдлрд▓ рд╣реЛ рдЬрд╛рдКрдБрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐... рдареАрдХ рд╣реИ, рдореИрдВ рдЗрддрдирд╛ рд╕реНрдорд╛рд░реНрдЯ рдирд╣реАрдВ рд╣реВрдБред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд┐рддрдирд╛ рдХрд░реАрдм рдЖ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдпрд╣рд╛рдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реНрдг рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ (рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореИрдВ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рде рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реВрдВ)ред рдмреЗрд╢рдХ, рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рдЕрдиреНрдп рдкреНрд░рдпрд╛рд╕ рднреА рдореМрдЬреВрдж рд╣реИрдВ ред

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА > рд╣рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рдХрдерди рдерд╛:

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ _are_ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлреЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рд╕рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ (рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ 'рд░рд┐рд╕реАрд╡рд░' рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗред рдкрд░рд┐рдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЬреИрд╕реЗ рдХрд┐ рдЬреЛрдбрд╝ рдФрд░ рдбреАрд░реЗрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ, рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рдЗрдВрдЯрд░рдлреЗрд╕ _can_ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╡рд░реЛрдз рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреА рд╕рдордЭ рдХреЗ рд╕рд╛рде рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдЗрдВрдЯрд░рдлреЗрд╕ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░-рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рд░рд╕реНрдЯ рдХреЗ рд▓рдХреНрд╖рдг рдЬреЛ _do_ рдЗрди рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЯрд╛рдЗрдк-рдХреНрд▓рд╛рд╕ рдФрд░ рд▓рдХреНрд╖рдг рд╕рднреА рд╕рдорд╛рди рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ (рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╕рднреА рдореЗрдЯрд╛-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ)ред

рдореИрдВ рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рдПрдХ (рдкрд╛рда /) рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрд╕ рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдЙрдмрд╛рдК рдФрд░ рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред рддреЛ рдлрд┐рд░, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 'рд╕реНрдЯреИрдХ' рдЗрдВрдЯрд░рдлрд╝реЗрд╕/рдЯрд╛рдЗрдк-рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдирд╛ рдЖрдкрдХреЗ рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рдХреЛ 'рд╕реНрдЯреИрдХреЗрдмрд▓' рдмрдирд╛рдиреЗ рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИред

рдЧреЛ рдХреЗ рд╕рд╛рде рджреЛ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ рдЬреЛ рдЖрдЧреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдирд┐рд░рд╛рд╢ рдХрд░рддреА рд╣реИрдВред 'рдЯрд╛рдЗрдк' рддреБрд▓реНрдпрддрд╛ рд╕рдорд╕реНрдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЧрдгрд┐рдд рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдФрд░ рд╕рднреА рддрд░реНрдХ рд╕рдорд╛рди рд╣реЛрдВред рд╣рдо рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

mul<T>(x, y T) T requires Addable(T) {
    r := 0
    for i := 0; i < y; ++i  {
        r = r + x
    }
    return r
}

'+' рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ x рдФрд░ y рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

рджреВрд╕рд░рд╛ рдХреЗрд╡рд▓ рдПрдХ 'рд░рд┐рд╕реАрд╡рд░' рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╕реАрдорд╛ рд╣реИред рдЗрд╕ рд╕реАрдорд╛ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдКрдкрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ (рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдЪрд┐рдд рд╣реИ) рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдк MyStack рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ:

type Stack<T> interface {...}

рдпрд╣ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ T рдореЗрдВ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рд╕реНрдЯреИрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ MyStack рдореЗрдВ рдХреЛрдИ рднреА T рдбрд╛рд▓ рд╕рдХреЗрдВ, рдЬрдм рддрдХ рдХрд┐ рдкреБрд╢ рдФрд░ MyStack рдХреЗ рд╕рдорд╛рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ рдкреЙрдк рд╕рдорд╛рди 'рдорд╛рди' рдкреНрд░рдХрд╛рд░ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдЗрди рджреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЙрдирдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рджреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рд╡реЗ рд╕рднреА рд╣реИрдВ рдЬреЛ рдЧреЛ рдХреЗ рд▓рд┐рдП 'рдЬреЗрдиреЗрд░рд┐рдХ' рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ
рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ 'рдорд╛рдирдЪрд┐рддреНрд░' рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдЬреИрд╕реЗ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type Map<Key, Value> interface {
   put(x Key, y Value) 
   get(x Key) Value
}

рдлрд┐рд░ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдо рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╣реИрд╢-рдЯреЗрдмрд▓, рдпрд╛ рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝, рдпрд╛ рдмреАрдЯреНрд░реА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗ:

f<K, V, T>(index T) T requires Map<K, V> {
   ...
}

рдЕрдм рдЬреЛ рдХреБрдЫ рднреА f рд╣реИ, рд╡рд╣ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, f рдХрд┐рд╕реА рдФрд░ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЖрд╡реЗрджрди рд▓рд╛рд▓ рд░рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ/ рдХрд╛рд▓рд╛ рдкреЗрдбрд╝ рдпрд╛ рд╣реИрд╢-рдореИрдкред

рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреА рд╣реИ, рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

type MapIntString interface {
   put(x Int, y String)
   get(x Int) String
}

рдЬреЛ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ 'рд▓рд╛рдЗрдмреНрд░реЗрд░реА' рдлрд╝рдВрдХреНрд╢рди f рдХреЛ рдХреБрдВрдЬреА рдФрд░ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдЪрд╛рдмрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрддреЗ рд╣реИрдВред

рдЬрдмрдХрд┐ рдореИрдВ @keean рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдХрдард┐рдирд╛рдИ рдЧреЛ рдореЗрдВ рдПрдХ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЛ рд▓рд┐рдЦ рд░рд╣реА рд╣реИ рдЬреЛ рдПрдХ рдЬреНрдЮрд╛рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрднреА рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рд╕рд░реНрд╡рд╡рд┐рджрд┐рдд рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк-рдПрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ interface{} рдФрд░/рдпрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ - рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдзреАрдореЗ рдФрд░ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реИрдВред

@ рдХреАрди

рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рд╕рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдЖрдЬ рддрдХ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реБрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдпрд╣ рдХрд╣рдирд╛ рдХрд╛рдлреА рдЧреИрд░-рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рднреА рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡реЗ рдЦрд╛рдорд┐рдпрд╛рдВ рдХрд┐рд╕реА рднреА рд▓рд╛рдн рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИрдВ, рдФрд░ _claimed_ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрджрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЕрдЯрдХрд▓реЛрдВ рдкрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХрд┐рд╕реНрд╕рд╛ рд╣реИред

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрд╕ рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдЙрдмрд╛рдК рдФрд░ рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдореИрдВ рднреА рдЗрд╕рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред рдПрдХ рд╕рд╢реБрд▓реНрдХ рдкреЗрд╢реЗрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореЗрд░рд╛ рдЙрджреНрджреЗрд╢реНрдп рдореЗрд░реЗ рдирд┐рдпреЛрдХреНрддрд╛ рдХреЗ рд▓рд╛рдн рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рддреЗ рд╣реБрдП _рдЕрдкрдиреЗ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп/рдкреНрд░рдпрд╛рд╕ рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдорд╛рдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдХрд╛рд░реНрдп "рдЙрдмрд╛рдК" рд╣реЛрдиреЗ рдкрд░ рд╣реА рдмреБрд░рд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рд╡рд╣ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рднреА рд╣реЛ; рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдпрд╛ рдпрд╣ рдЙрдмрд╛рдК рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░/рдпрд╛ рдЙрддреНрдкрд╛рдж рдХреЛ рдЬрд▓реНрдж рд╣реА рд░рд┐рд▓реАрдЬрд╝ рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрднреА рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдлрд┐рд░ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рдкреНрд░рдЧрддрд┐ рдХреА рд╣реИ, (рдпрд╣ рдЕрдзреВрд░рд╛ рд╣реИ; рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рд░реАрдбрдореА рднреА рдирд╣реАрдВ рд╣реИ) рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдмрд╣реБрддрд╛рдпрдд рд╕реЗ рдирд╣реАрдВ рд╣реИ рддреЛ рдореИрдВ рдЕрдкрдиреА рдмрд╛рдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд░рд╣рд╛ рд╣реВрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдУрд░ рдХрд╛рдо рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ , рдмрд▓реНрдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдореИрдВ рдПрдХ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕реЗ _рдЙрдкрдпреЛрдЧреА_ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд┐рди _ рд╡рд┐рд╢рд┐рд╖реНрдЯ_ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдкрд░ "рдХрдордЬреЛрд░" рдХреНрд░рдо рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ Less(v interface{}) bool рдирд╛рдордХ рдлрд╝рдВрдХреНрд╢рди _like_ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЙрд▓рд░ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдирд╛рдо Less(v interface{}) bool рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЙрдирдХреЗ рдКрдкрд░ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд░реИрдкрд░/рд╢рд┐рдореНрд╕ рд▓рд┐рдЦреЗрдВред

рдЬрдм рдЖрдк рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ interface{} рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдореЗрд░реА рдЧрд╛рд░рдВрдЯреА рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдиреЗ _is_ рдПрдХ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗ' рд╡рд┐рд╢реНрд╡рд╛рд╕ рди рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдбрд╛рд▓реЗ рдЧрдП рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдареАрдХ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡ рд╣реЛрдВрдЧреЗ рдЬреЛ рдЖрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЙрди рджреЛрдиреЛрдВ рдЧрд╛рд░рдВрдЯрд┐рдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдирд╣реАрдВ рд╣реИред рдЯрд╛рдЗрдк-рдПрд╕реЗрд░реЗрд╢рди рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдПрдХ рджрд░реНрдЬрди рдпрд╛ рдЗрддрдиреА рд╣реА рд▓рд╛рдЗрдиреЗрдВ рд▓рд┐рдЦреЗрдВ (рдпрд╛ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ)ред

рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ (рдлрд┐рд░ рд╕реЗ, рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реБрдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдкрд╣рд▓реА рдЬрдЧрд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣рдирд╛ рд╣реЛрдЧрд╛) рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рдЯреАрдХ рдХрд╛рд░реНрдп рдирд╛рдо рднреА рд╣реИрдВ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдПрдХ рдЬрд╛рд╡рд╛-рд╢реИрд▓реА рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдЬрд╣рд╛рдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХ рдПрдХ _exact_ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкреАрдЫреЗ рдХреА рдУрд░ рдЭреБрдХ рд░рд╣реЗ рд╣реИрдВ (рд╡реЗ рд▓рдЧрднрдЧ _have_ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рднрд╛рд╖рд╛ рдЗрд╕реЗ class MyClassImpl extends AbstractMyClass implements IMyClass рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ) рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдиреМрдХрд░рд╢рд╛рд╣реА рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕рдВрдЧрдарди рдХреЗ рдХреЛрдбрд┐рдВрдЧ рдорд╛рдирдХреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрдЦреМрдЯрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ (рдЬреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рд╕рдорд╛рди рдорд╛рддреНрд░рд╛ рд╣реИ, рдпрджрд┐ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ), рдпрд╛ рдлрд┐рд░ рдЗрд╕реЗ "рдЕрдкрд╡рд╛рдж" рд╣реЛрдиреЗ рджреЗрдВ рдЖрдкрдХреЗ рд╕рдВрдЧрдарди рдХреЗ рдХреЛрдбрд┐рдВрдЧ рдорд╛рдирдХреЛрдВ (рдФрд░ рдЕрдВрддрддрдГ рдЖрдкрдХреЗ рд╕рдВрдЧрдарди рдХреЗ рдорд╛рдирдХреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдЕрдкрд╡рд╛рдж рд╣реИрдВ), рдпрд╛ рдлрд┐рд░ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЪреНрдЫреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ)ред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдо рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╣реИрд╢-рдЯреЗрдмрд▓, рдпрд╛ рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝, рдпрд╛ рдмреАрдЯреНрд░реА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдЖрджрд░реНрд╢ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде:

type MyStorage interface {
  Get(KeyType) (ValueType, error)
  Put(KeyType, ValueType) error
}

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЧрд╛рдпрдм рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ KeyType рдФрд░ ValueType рдХреНрдпрд╛ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдПрдХ (рдХрд╛рд▓реНрдкрдирд┐рдХ) рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ рд╕рднреА рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП interface{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдЬреЛ "рдХреБрдЫ рдбреЗрдЯрд╛" рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ _maybe_ рдХреБрдЫ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдлрд╝рдВрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ string рдФрд░ int рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВред

рдПрдХ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдПрдХ (рдХрд╛рд▓реНрдкрдирд┐рдХ) рдХреЙрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рддреЗрдЬреА рд╕реЗ рднрдВрдбрд╛рд░рдг рдФрд░ рд▓реБрдХрдЕрдк рд╕рдордп рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд▓рд╛рд▓/рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рд╣реИред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рд╕реЗ Get рдЪреАрдЬреЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ Put рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ - рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ - рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЪреАрдЬреЗрдВ рдХреНрдпрд╛ рд╣реИрдВред рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп Get рдФрд░ Put рдирд╛рдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдЬрдм рддрдХ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ Get рдФрд░ Put рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрдмрдХрд┐ рдореИрдВ рдЗрд╕рдореЗрдВ рд╣реВрдВред рдпрджрд┐ рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЖрдорддреМрд░ рдкрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓реЗрдЦрдХ рдХреА рдЧрд▓рддреА рд╣реИ, рднрд╛рд╖рд╛ рдХреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдРрд╕реЗ рдкреНрд░рддрд┐рд░реВрдк рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рд╡реИрд╕реЗ, рдЕрдЧрд░ рдХреЛрдб рдЗрд╕ рддрд░рд╣ _weren't_ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЙрд▓рдЭ рд╕рдХрддрд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдХреБрдВрдЬреА/рдореВрд▓реНрдп рд╕реНрдЯреЛрд░ рдХреЗ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдПрдХ рд╕рд╛рд░ рдХреБрдВрдЬреА/рдореВрд▓реНрдп рднрдВрдбрд╛рд░рдг "рдЕрд╡рдзрд╛рд░рдгрд╛" рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЧреБрдЬрд░рдирд╛ рдХреБрдВрдЬреА/рдореВрд▓реНрдп рднрдВрдбрд╛рд░рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рдФрд░ рдореЗрд░реА рдЯреАрдо рдкрд░ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдЪреБрди рд╕рдХрддрд╛ рд╣реИ (рд╕реНрд╡рдпрдВ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕рд╣рд┐рдд рдЬрд┐рд╕рдХрд╛ рдЬреНрдЮрд╛рди рдХреБрдВрдЬреА рдХрд╛ рд╣реИ /рдореВрд▓реНрдп рднрдВрдбрд╛рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ!) рдХреЛрдб-рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рдЙрд╕рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реВрдХреНрд╖реНрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдирд┐рд░реНрднрд░ рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рдХреБрдВрдЬреА/рдореВрд▓реНрдп рд╕реНрдЯреЛрд░ рдбреАрдмреА рдХреЗ рдХрдиреЗрдХреНрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рджрд░реНрдж рд╣реИ рдЬрдм рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдПрдХ рдмрдбрд╝реЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЖрддреА рд╣реИ, рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдкрдВрдХреНрддрд┐ _real_ рдХреЛрдбрдмреЗрд╕ рдкреЙрдЗрдВрдЯреНрд╕ рдореЗрдВ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИ рдЬреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рдЖрдк рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ) рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрдЬрд╛рдп, рдкрдардиреАрдп рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рдеред

@ рдЬреЗрд╕реА-рдЕрдорд╛рдиреЛ
рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ 'рдЧреЛ' рддрд░реАрдХрд╛ рдкрд╕рдВрдж рд╣реИ рдЬрд╣рд╛рдВ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдХреЛрдб рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдк рдкреБрд╕реНрддрдХрд╛рд▓рдп/рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдкреАрдЫреЗ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдЕрднреА рднреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

  • рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░, рдЬреИрд╕реЗ: RBTree<Int, String> рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред
  • рдкреНрд░рдХрд╛рд░ рдЪрд░, рдЬреИрд╕реЗ: f<T>(x, y T) T , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЬреЛрдбрд╝, рдШрдЯрд╛рд╡ рдЖрджрд┐ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрд░реВрдкреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдПрдХ рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдЯрд╛рдЗрдк рдХреА рдХрдореА, рдЬреИрд╕реЗ: f<T: Addable>(x, y T) T , рдЬреЛ рдЯрд╛рдЗрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЯрд╛рдЗрдк-рд╡реЗрд░рд┐рдПрдмрд▓ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ Addable рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрди рдЯрд╛рдЗрдк рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╣рдо Addable рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ рдФрд░ f(x, y Addable) Addable рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ x рдФрд░ y рдХреЗ рдореВрд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдПрдХ рджреВрд╕рд░реЗ рдпрд╛ рд▓реМрдЯреЗ рдкреНрд░рдХрд╛рд░ред
  • рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕, рдЬреИрд╕реЗ: type<K, V> Map<K, V> interface {...} , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ merge<K, V, T: Map<K, V>>(x, y T) T рдХреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЙрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рди рдХреЗрд╡рд▓ рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдХреБрдВрдЬреА рдФрд░ рдореВрд▓реНрдп рдирдХреНрд╢реЗ рдХреЗ рдкреНрд░рдХрд╛рд░ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдХреА рдЕрдореВрд░реНрдд рд╢рдХреНрддрд┐ рдХреЛ рдмрдврд╝рд╛рдПрдЧрд╛ред

рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдоя╝Я

@leaxoy рдЧреЛрдлрд░рдХреЙрди рдореЗрдВ @ianlancetaylor рджреНрд╡рд╛рд░рд╛ "рдЬреЗрдиреЗрд░рд┐рдХ рдЗрди рдЧреЛ" рдкрд░ рдмрд╛рддрдЪреАрдд рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред рдореИрдВ рдЙрд╕ рд╡рд╛рд░реНрддрд╛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдирдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред

@griesemer рдЙрд╕ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@keean рдореБрдЭреЗ рдпрд╣рд╛рдВ рд░рд╕реНрдЯ рд╕реЗ рд╡реНрд╣реЗрдпрд░ рдХреНрд▓реЙрдЬ рднреА рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдЬреЛ рдЖрдкрдХреЗ type constraints рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдХреНрд╡реЗрд░реА рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░рдиреЗ" рдЬреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕ рдкрд░ рдпрд╣ рд╡реАрдбрд┐рдпреЛ рджреЗрдЦреЗрдВ: https://www.youtube.com/watch?v=jSpio0x7024

@jadbox рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдореЗрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди 'рдХрд╣рд╛рдВ' рдЦрдВрдб рд▓рдЧрднрдЧ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЬрдВрдЧ рдореЗрдВ 'рдХрд╣рд╛рдВ' рдХреЗ рдмрд╛рдж рдХреА рдЪреАрдЬреЗрдВ рдЯрд╛рдЗрдк рдХреА рдХрдореА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкрд╣рд▓реЗ рдХреА рдкреЛрд╕реНрдЯ рдореЗрдВ 'рдЖрд╡рд╢реНрдпрдХрддрд╛' рдХреАрд╡рд░реНрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рд╕рдм рдХрдо рд╕реЗ рдХрдо рдПрдХ рджрд╢рдХ рдкрд╣рд▓реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕рд┐рд╡рд╛рдп рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ '=>' рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдКрдкрд░ рдЕрдкрдиреА рд╕рд╛рд░рд╛рдВрд╢ рдкреЛрд╕реНрдЯ рд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП:

merge<K, V, T>(x, y T) T requires T: Map<K, V>

рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЖрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓рдВрдмреЗ рдмрд╛рдзрд╛ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрд╛рдзрд╛ рдбрд╛рд▓рдХрд░ рдЖрдк 'рдХрд╣рд╛рдВ' рдХреНрд▓реЙрдЬ рдХреЗ рд╕рд╛рде рдЬреЛ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

merge<K, V, T: Map<K, V>>(x, y T) T

рдпрджрд┐ рдЖрдк рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдЪрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╣рд╛рдВ рдХреЛрдИ рднреА рдмрд╛рдзрд╛ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, 'рдХрд╣рд╛рдВ'/'рдЖрд╡рд╢реНрдпрдХрддрд╛' рдЦрдВрдб рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рдЬреЛ рдкрд╛рд░реНрд╕рд░ рдФрд░ рджрдпрд╛рд▓реБ рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рд╡рд░реНрддрдорд╛рди/рдирд╡реАрдирддрдо рдХрд╛рд░реНрдпрд╢реАрд▓ рдЧреЛ 2 рдЬреЗрдирд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛/рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕реВрддреНрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рджрд┐рд╢рд╛ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрдмрдВрдз рддрдВрддреНрд░ред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдХрд┐ рдЙрд╕ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдХ-рджрд┐рдорд╛рдЧ рд╡рд╛рд▓реА рдзрд╛рд░рдгрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ (рд╣рдореЗрд╢рд╛) рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рд▓рд┐рдЦреА рд╣реИрдВ:

рдХреНрдпрд╛ рдЧреЛ 2 рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ?

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдареАрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдо рддреМрд░ рдкрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЧрд┐рдЯрд╣рдм рдореБрджреНрджреЗ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╛рд░реВрдк рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдереНрд░реЗрдбрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪрд┐рдпрд╛рдВ рдмреЗрд╣рддрд░ рд╣реИрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдорд╛рдкрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдорд╛рдорд▓рд╛ рд╕рд░рдгреА рдЖрдпрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ - рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░рди-рдЯрд╛рдЗрдо рддрд░реНрдХ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХреЙрдиреНрд╕реНрдЯ рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ?

рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдФрд░ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдХрднреА рднреА рдХреБрдЫ рдирдпрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдФрд░ рдХрдореА рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдХреАрдорддред

рдЧреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИред рдпрджрд┐ рдпрд╣ рдЯреВрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВ!

рдЬреЛ рд▓реЛрдЧ рдЧреЛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдирд╛рдЦреБрд╢ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрди рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдФрд░ рдХрд╖реНрдЯрдкреНрд░рдж рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред

рдЧреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИред рдпрджрд┐ рдпрд╣ рдЯреВрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВ!

рдпрд╣ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рди рдХрд░реЗ рдЬреИрд╕рд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП-рд▓реЗрдХрд┐рди рддрдм рдХреЛрдИ рднрд╛рд╖рд╛ рдХрднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреАред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЯреВрдЯрд╛ рдирд╣реАрдВ рд╣реИред рдЙрдкрд▓рдмреНрдз рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдмрд╣рд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдПрдХ рд╕реВрдЪрд┐рдд рдФрд░ рд╕рдордЭрджрд╛рд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рд┐рдд рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдХрд╛рд░рдг рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдиреБрдХрд╕рд╛рди рд╣реБрдЖ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ "рдирд╣реАрдВ" рдЕрд╕реНрдерд╛рдпреА рд╣реИ, "рд╣рд╛рдВ" рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╣реИред

рдкрд┐рдЫрд▓реЗ рдореЗрдЧрд╛-рдореБрджреНрджреЛрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрдпрд╛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдЧреЛрдлрд░ рд╕реНрд▓реИрдХ рдкрд░ рдПрдХ рдЪреИрдирд▓ рдЦреЛрд▓рд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рдордп рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдм рдпрд╣ рдореБрджреНрджрд╛ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдореЗрдХрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╕реНрд▓реИрдХ рд╕реЗ рдЪрд░реНрдЪрд╛? рдПрдХ рдмрд╛рд░ рдЦреВрдВрдЦрд╛рд░ "478 рдЫрд┐рдкреЗ рд╣реБрдП рдЖрдЗрдЯрдо рдЕрдзрд┐рдХ рд▓реЛрдб рдХрд░реЗрдВ ..." рд▓рд┐рдВрдХ рдЖрдиреЗ рдХреЗ рдмрд╛рдж рдЬреАрдердм рдореБрджреНрджреЗ рдЕрдм рдПрдХ рдордВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдЧреЛрдлрд░ рд╕реНрд▓реИрдХ рдкрд░ рдПрдХ рдЪреИрдирд▓ рдЦреЛрд▓рд╛ рдЬрд╛рдП
рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪрд┐рдпрд╛рдБ рдмреЗрд╣рддрд░ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рдЦреЛрдЬрдиреЗ рдпреЛрдЧреНрдп рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрднреА рднреА рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдмрдбрд╝реЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрдпрд╛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдЧреЛрдлрд░ рд╕реНрд▓реИрдХ рдкрд░ рдПрдХ рдЪреИрдирд▓ рдЦреЛрд▓рд╛ рдЬрд╛рдПред

рдХреГрдкрдпрд╛ рдЪрд░реНрдЪрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рдмрдВрдж рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рди рд▓реЗ рдЬрд╛рдПрдВред рдпрджрд┐ рдХрд╣реАрдВ рднреА, рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ (рдИрд╢? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Google рдЦрд╛рддреЗ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд╕рдВрдЪрд╛рд░ рдХрд╛ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╣реИ рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП . рдЧрд┐рдЯрд╣рдм рдХрд╛рдлреА рдЦрд░рд╛рдм рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдирд┐рдЪреНрдЫрд╛ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдП рд╣реИрдВ, рд╣рд░ рдХреЛрдИ рд╕реНрд▓реИрдХ рдЦрд╛рддрд╛ рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдкрдиреЗ рднрдпрд╛рдирдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╣рд░ рдХреЛрдИ рдПрдХ рд╕реНрд▓реИрдХ рдЦрд╛рддрд╛ рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдкрдиреЗ рднрдпрд╛рдирдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдпрд╣рд╛рдБ "рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдХреНрдпрд╛ рд╕реНрд▓реИрдХ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ? рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧ рдЬреАрдердм рдХрд╛ рднреА рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред

рд╣рд░ рдХреЛрдИ рдПрдХ рд╕реНрд▓реИрдХ рдЦрд╛рддрд╛ рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдкрдиреЗ рднрдпрд╛рдирдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдпрд╣рд╛рдБ "рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рдХреНрдпрд╛ рд╕реНрд▓реИрдХ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ? рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧ рдЬреАрдердм рдХрд╛ рднреА рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рджреВрд╕рд░реЛрдВ рдХреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрд▓реИрдХ рдПрдХ рдЕрдореЗрд░рд┐рдХреА рдХрдВрдкрдиреА рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЕрдореЗрд░рд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдереЛрдкреА рдЧрдИ рдХрд┐рд╕реА рднреА рд╡рд┐рджреЗрд╢ рдиреАрддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдЧреАред

рдЧреАрдереВрдм рдХреА рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рд╡рд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдИрд░рд╛рдирд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдореЗрдВ рдерд╛ред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рд╣рдо рдЯреЛрд░ рдпрд╛ рдЖрдИрдкреАрдПрдлрдПрд╕ рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЪрд░реНрдЪрд╛ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдпреВрдПрд╕/рдпреВрд░реЛрдкреАрдп рдХрд╛рдиреВрди рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЧреАрдереВрдм рдХреА рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рд╡рд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдИрд░рд╛рдирд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдореЗрдВ рдерд╛ред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рд╣рдо рдЯреЛрд░ рдпрд╛ рдЖрдИрдкреАрдПрдлрдПрд╕ рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЪрд░реНрдЪрд╛ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдпреВрдПрд╕/рдпреВрд░реЛрдкреАрдп рдХрд╛рдиреВрди рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рд╛рдВ, рд╣рдо GitHub рдФрд░ Google Groups рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдП рд╣реИрдВред рдЖрдЗрдП рд╕реВрдЪреА рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рди рдЬреЛрдбрд╝реЗрдВред рдЪреИрдЯ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдЧреНрд░рд╣ рдирд╣реАрдВ рд╣реИ; рдЗрди рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ рдЬрдм рд╡реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд┐рд░реЛрдП рдЧрдП рд╣реЛрдВ рдФрд░ рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдкрд░ рд╣реЛрдВ (рдЬрд╣рд╛рдВ рд╡реЗ рд╕реАрдзреЗ рдЖрдкрдХреЗ рдЗрдирдмреЙрдХреНрд╕ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ)ред рд╕реНрд▓реИрдХ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╕рднреА рдХреЗ рд╕рдорд╛рди рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЪреИрдЯ рдЖрд░реНрдХрд╛рдЗрд╡реНрд╕, рдПрдХ рдЧреИрд░-рдЕрдиреБрдХреНрд░рдордХ, рдЖрджрд┐ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЙрдирдХреЗ рдЙрддреНрддрд░реЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЖрдХрд╕реНрдорд┐рдХ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝реА рдЧрдИ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ 1-рдмрдВрдж рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЯрди рди рдорд┐рд▓реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрд▓реИрдХ рдЦрд╛рддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдмреЗрд╡рдХреВрдл рдЧреНрд░рд╛рд╣рдХ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдорд╢реАрди рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реА рдУрд░ рдорда (рдпрд╛ рдЖрдкрдХреА рдкрд╕рдВрдж рдХрд╛ рдИрдореЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ, рдпрд╛рдп рдорд╛рдирдХ) рд╣рд░ рдЬрдЧрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рдЦреЗрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЧрд┐рдЯрд╣рдм рдореБрджреНрджрд╛ рдЯреНрд░реИрдХрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдЬреИрд╕реЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдКрдкрд░ рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ "рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрдХрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдЧреЛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдЧреЛ рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдЙрддрдирд╛ рдЕрдиреВрдард╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХреБрдЫ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВред рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реАрдПрд▓рдпреВ рдФрд░ рдореЛрдбреБрд▓рд╛ -3 рдХреЗ рд╕рдорд╛рди рд▓рдХреНрд╖реНрдп рдФрд░ рд╕рдорд╛рди рднреБрдЧрддрд╛рди рд╣реИ, рдФрд░ рджреЛрдиреЛрдВ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рд╕реАрдПрд▓рдпреВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ ~ 1975 рдХреЗ рдмрд╛рдж рд╕реЗ!) рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рдФрджреНрдпреЛрдЧрд┐рдХ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдПрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЙрди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдХрдВрдкрд╛рдЗрд▓рд░ред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдХреБрдЫ рдкреВрдЫрддрд╛рдЫ, рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ type рдХреАрд╡рд░реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдФрд░ рдХреНрдпрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП <> рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рдЕрд░реНрде рд╣реЛрдЧрд╛? рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рдкрд░рд┐рдЪрд┐рдд рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ ...

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВ, рдмрд╕ рдЗрд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ

рдХреЗ рдмрдЬрд╛рдП:

type Vector(type Element) []Element
var v Vector(int)
func (v *Vector(Element)) Push(x Element) { *v = append(*v, x) }
type VectorInt = Vector(int)

рд╣рдо рд▓реЗ рд╕рдХрддреЗ рдереЗ

type Vector<Element> []Element
var v Vector<int>
func (v *Vector<Element>) Push(x Element) { *v = append(*v, x) }
type VectorInt = Vector<int>

рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ <> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, @jnerics (рдЖрдкрдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд╣реИ ...) рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░рд╛рдердорд┐рдХ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд╛рд░реНрд╕рд░ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдЖрдо рддреМрд░ рдкрд░, рдпрд╣ рдереЛрдбрд╝реЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рднрд╛рд╖рд╛ рдмрдирд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рдд рдкрд░ рдЕрд╕рд╣рдорддрд┐ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП type рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЕрдиреНрдпрдерд╛ func Example(T)(arg int) {} рдФрд░ func Example(arg int) (int) {} рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдмрддрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдореИрдВрдиреЗ рдЧреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╡реАрдирддрдо рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдврд╝рд╛ред рдЕрдиреБрдмрдВрдз рдШреЛрд╖рдгрд╛ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдореЗрд░реЗ рд╕реНрд╡рд╛рдж рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЧреЛ рдореЗрдВ рд╣рдо рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

type MyStruct struct {
        a int
        s string
}

type MyInterface inteface {
    Method1() err
    Method2() string
}

рд▓реЗрдХрд┐рди рдирд╡реАрдирддрдо рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдиреБрдмрдВрдз рдХреА рдШреЛрд╖рдгрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

contract Ordered(T) {
    T int, int8
}

contract G(Node, Edge) {
    Node Edges() []Edge
    Edge Nodes() (from Node, to Node)
}

рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдЕрдиреБрдмрдВрдз рд╡реНрдпрд╛рдХрд░рдг рдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ:

type Ordered(T) contract {
    T int, int8
}

if there is only one type parameter, the declaration above can be also wrote like this:

type Ordered contract {
    int , int8
}


if there are more than one type parameter, we have to use named parameter:

type G(Node, Edge) contract {
    Node Edges() []Edge
    Edge Nodes() (from Node, to Node)
}

рдЕрдм рдЕрдиреБрдмрдВрдз рдХрд╛ рд░реВрдк рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рд╣рдо рд╕рдВрд░рдЪрдирд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рдЕрдиреБрдмрдВрдз рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type (
        Sequence contract {
                string, []byte
        }

    Stringer(T) contract {
        T String() string
    }

    Stringer contract { // equivalent with the above Stringer(T), single type parameter could be omitted
        String() string
    }

        MyStruct struct {
                a int
                b string
        }

    G(Node, Edge) contract {
        Node Edges() []Edge
        Edge Nodes() (from Node, to Node)
    }
)

рддреЛ "рдЕрдиреБрдмрдВрдз" рд╕рдВрд░рдЪрдирд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╕реНрддрд░ рдХрд╛ рдХреАрд╡рд░реНрдб рдмрди рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@bigwhite рд╣рдо рдЕрднреА рднреА рдЗрд╕ рд╕рдВрдХреЗрддрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдбрд┐рдЬрд╛рдЗрди рдорд╕реМрджреЗ рдореЗрдВ рд╕реБрдЭрд╛рдП рдЧрдП рд╕рдВрдХреЗрддрди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЕрдиреБрдмрдВрдз рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрдмрдВрдз рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рдЕрдиреБрдмрдВрдз рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдЗрдХрд╛рдИ рд╣реИ рдЬреЛ рдПрдХ рд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд░реНрде рд╣реИ , рдлрд╝рдВрдХреНрд╢рди, рдЪрд░, рдпрд╛ рдкреНрд░рдХрд╛рд░ред рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЗрд╡рд▓ рдПрдХ "рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░" (рдпрд╛ рдореЗрдЯрд╛ рдкреНрд░рдХрд╛рд░) рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдХреЗрддрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдФрд░ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ "рдЧреБрдордирд╛рдо" рдЕрдиреБрдмрдВрдз рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ w/o рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, IMHO рдпрд╣ рдЕрднреА рддрдХ рддрдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдбрд╝рдХ рдХреЛ рдмрджрд▓рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реИред

FWIW, CL 187317 рдлрд┐рд▓рд╣рд╛рд▓ рджреЛрдиреЛрдВ рдиреЛрдЯреЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреБрдмрдВрдз рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрдмрдВрдз рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП), рдЙрджрд╛рд╣рд░рдг:

type C contract(X) { ... }

рддрдерд╛

contract C (X) { ... }

рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реНрд╡реАрдХрд╛рд░ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реЛрдЧрд╛:

type C(type X) contract { ... }

рдПрдХ рдЕрдиреБрдмрдВрдз рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдореЗрдЯрд╛-рдкреНрд░рдХрд╛рд░ рднреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ
рдЗрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИрдВред рдХреЛрдИ рдЕрд▓рдЧ рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ
рдЬрд┐рд╕реЗ рдЕрдиреБрдмрдВрдз рдХрд╛ рдореЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЧреЛ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдПрдВ рднреА рд╣реИрдВ:

func Name(args) { body }

рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрдиреБрдмрдВрдз рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдзрд┐рдХ рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЪрд░реНрдЪрд╛рдПрдБ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реВрдЪреА рдореЗрдВ рдХрдо рд▓рдЧрддреА рд╣реИрдВ
рдЗрд╕ рдмрд┐рдВрджреБред рдорд╕реМрджреЗ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рджреЗрдЦрдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░
рд╡реЗ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдб рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░, рдФрд░ рдХреМрди рд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрди-рд▓рд╛рдЗрди рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЧреЛ рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛рд░реНрдп рд╣реИрдВред рдореБрдЭреЗ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рдХрд┐ рдЕрдиреБрдмрдВрдз рд╢рд╛рдмреНрджрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рд╡реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реАрдорд┐рдд рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред

@stevenblenkinsop рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЛ рдмрддрд╛рддреЗ рд╣реБрдП рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛ рдХрд┐ рдПрдХ рдЕрдиреБрдмрдВрдз рдПрдХ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдореЗрдЯрд╛-рдкреНрд░рдХрд╛рд░) рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рддрд░реНрдХ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрдмрдВрдз рдЬреЛ рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП "рдКрдкрд░реА рдмрд╛рдЙрдВрдб" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ: рдХрд┐рд╕реА рднреА рд╡реИрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреБрдмрдВрдз рдХреЗ рдмрдЬрд╛рдп рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдП) рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдорд╛рдорд▓реЗ рдЖрдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ; рдФрд░ рдмреА) рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдмрддрд╛рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдРрд╕рд╛ рдЕрдиреБрдмрдВрдз рдмрд╣реБрдд рд╣рдж рддрдХ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╡рд┐рд░реБрджреНрдз рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреА "рддреБрд▓рдирд╛" рдХреА рдЬрд╛рддреА рд╣реИред

@griesemer рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реБрдП рд░рд╕реЗрд▓ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреЗ 'рд╕рджрд╕реНрдп' рдирд╣реАрдВ рд╣реИрдВ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ 'рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ' рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЛ 'рддрд░реНрдХ' рдХрд╛ рдПрдХ рд░реВрдк рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдкреНрд░реЛрд▓реЙрдЧ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рдХрд╛рд░ рдЪрд░ рддрд░реНрдХ рдЪрд░ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдкреНрд░рдХрд╛рд░ рдкрд░рдорд╛рдгреБ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдиреБрдмрдВрдз/рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдмрд╛рдзрд╛ рддрд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдмрд╣реБрдд рд╕рд╛рдл рдФрд░ рдЧреИрд░-рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИред рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣рдо рдПрдХ рдЕрдиреБрдмрдВрдз рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдмреВрд▓рд┐рдпрди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

@keean рдХреЛрдИ рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рдкреНрд░рдХрд╛рд░ рдкрд░ рдмрд╛рдзрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рд╡реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЯрд╛рдЗрдк рдереНрдпреЛрд░реА рд▓реЛрдЧ рдмрд╣реБрдд рдФрдкрдЪрд╛рд░рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЙрдЪрд┐рдд рддрд░реНрдХ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреЛрдИ "рддрд░реНрдХ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕" рдирд╣реАрдВ рд╣реИ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп-рдкреНрд░рдЧрддрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЙрдбрд▓ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рд╕рдордп рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред

рдЧреЛ рдореЗрдВ @griesemer рдЗрдВрдЯрд░рдлреЗрд╕ 'рдЙрдкрдкреНрд░рдХрд╛рд░' рд╣реИрдВ рдЬреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧреЛ рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдиреБрдХрд╕рд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВрдиреЗ рдКрдкрд░ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд░реНрдерди рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ - рдЕрдЧрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЪрд▓реЗрдВ, рдЧрд┐рд░рд╛рд░реНрдб рдХрд╛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рд░рд╕реЗрд▓ рдХреЗ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо 'рдПрдиреНрдХреЛрдбрд┐рдВрдЧ' рд╣реИред рдЯрд╛рдЗрдк рдереНрдпреЛрд░реА рдЗрди рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╣реНрдорд╛рдВрдбреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдмреНрд░рд╣реНрдорд╛рдВрдб 'рдпреВ + 1' рд╕реЗ рдмреНрд░рд╣реНрдорд╛рдВрдб 'рдпреВ' рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдЙрдЪреНрдЪ рдХреНрд░рдо рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрд▓реНрдл рд▓реИрдореНрдмреНрдбрд╛-рдкреНрд░реЛрд▓реЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ рдЙрдЪреНрдЪ рдХреНрд░рдо рддрд░реНрдХ рдХреЗ рдирд┐рд░реНрдгрд╛рдпрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛ рд╕рдорд╛рдзрд╛рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ (рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдпрд╛ рдЕрдиреНрдпрдерд╛) рдкрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдкрд░ рд╡рд╛рдкрд╕ рд▓реЗ рдЬрд╛рддреА рд╣реИред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЕрдореВрд░реНрддрддрд╛, рдЙрдЪреНрдЪ рдХреНрд░рдо рддрд░реНрдХ рдФрд░ рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рджреЛ рдФрд░ рдкрд░рддреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреЗ рд╕рд╛рд░ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреА рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╢рдХреНрддрд┐ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдирд┐рдпрдореЛрдВ рдпрд╛ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЦрддрд░рд╛ рддрдм рдЖрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕ "рдмрд╛рдзрд╛-рдкреНрд░рдХрд╛рд░" рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдФрд░ 'рдмрд╛рдзрд╛-рдкреНрд░рдХрд╛рд░' рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрддреНрдо-рд╕рдВрджрд░реНрдн (рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдорд╛рдореВрд▓реА рд╣реИ) рдФрд░ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд╕рдВрджрд░реНрдн рд▓реВрдк рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЪреЗрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░реЛрд▓реЙрдЧ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдпрдореЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд░рд╕реНрдЯ рджреЗрд╡реЛрдВ рдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ (рдЪрд╛рдХ рджреЗрдЦреЗрдВ)ред

@griesemer рджрд┐рд▓рдЪрд╕реНрдк, рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдореЙрдбрд▓рд┐рдВрдЧ рдЕрдиреБрдмрдВрдзред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рд╕реЗ, рдореИрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдореЗрдЯрд╛рдЯрд╛рдЗрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░реАрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреВрдВрдЧрд╛ред

type A int
func (a A) Foo() int {
    return int(a)
}

type C contract(T, U) {
    T int
    U int, uint
    U Foo() int
}

var B (int, uint; Foo() int).type = A
var C1 C = C(A, B)

рдпрд╣ рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛-рд╢реИрд▓реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╕реМрджреЗ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрднреА рднреА рдмреЗрд╣рддрд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ "рдпрджрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рддреЛ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреИрд╕рд╛ рджрд┐рдЦрддреЗ рд╣реИрдВ" рдкреНрд░рд╢реНрди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@stevenblenkinsop рдЖрдкрдиреЗ рдореБрдЭреЗ рдЦреЛ рджрд┐рдпрд╛, рдЖрдк T рд╕реЗ C contract рддрдХ рдХреНрдпреЛрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ var рд▓рд╛рдЗрдиреЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реА рд╣реИрдВ?

@griesemer рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЧреЛ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ "рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ"ред рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрдмрдВрдз рдШреЛрд╖рдгрд╛ рдкрддреНрд░ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЯрд╛рдЗрдк рд╕реА (рдЯрд╛рдЗрдк рдПрдХреНрд╕) рдЕрдиреБрдмрдВрдз {...} рдмреЗрд╣рддрд░ рд╣реИред

@ рдЧреБрдбрд╡рд╛рдЗрди рдореИрдВрдиреЗ рдЕрдиреБрдмрдВрдз рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ? (int, uint; Foo() int).type рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореЗрдЯрд╛рдЯрд╛рдЗрдк рд╣реЛрдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ int рдпрд╛ uint рд╣реИ рдФрд░ рдЬреЛ Foo() int рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред var B рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдЯрд╛рдЯрд╛рдЗрдк рд╣реИ (рдЪреВрдВрдХрд┐ рдореЗрдЯрд╛рдЯрд╛рдЗрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ)ред var C1 рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИ, рдФрд░ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдРрд╕реЗ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ "рдпрджрд┐ рдХреЛрдИ рдЕрдиреБрдмрдВрдз рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдореВрд▓реНрдп рдХреНрдпрд╛ рджрд┐рдЦрддреЗ рд╣реИрдВ?"ред рдореБрджреНрджрд╛ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдорд╛рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЖрдк рдЗрд╕реЗ рдЯрд╛рдЗрдк рдкреЗрд░реЗрдореАрдЯрд░ рдЕрдиреБрдмрдВрдз рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝ рдпрд╛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ
type Graph (type Node, Edge) struct { ... }
рддрдерд╛
type Graph (type Node, Edge G) struct { ... } рдареАрдХ рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдПрдХ рдЕрдиреБрдмрдВрдз рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ?

contract G(Node, Edge) {
    Node Edges() []Edge
    Edge Nodes() (from Node, to Node)
}

рдмрдирд╛рдо

contract G(Edge) {
    Edge Nodes() (from Node, to Node)
}

@themez рд╡рд╣ рдорд╕реМрджреЗ рдореЗрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ (type T, U comparable(T)) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@stevenblenkinsop рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдзрдиреНрдпрд╡рд╛рджред

@themez рдпрд╣ рдЕрдм рджреЛ рдмрд╛рд░ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрдереНрдп рд╕реЗ рдХреБрдЫ рднреНрд░рдо рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдПрдХ рдЪрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИ; рдПрдХ рдЕрдиреБрдмрдВрдз рдПрдХ рддрд░реНрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реЗ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ рдЕрдиреБрдмрдВрдз рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рд╕реЗ рдмрдирд╛ рд╣реЛрдЧрд╛, рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп/рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдПред @stevenblenkinsop рдиреЗ рдЬреЛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд╣рд╛рдВ рдЙрд╕ рдзрд╛рд░рдгрд╛ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдХрдо рд╕реЗ рдХрдо, рдореБрдЭреЗ рдпрд╣реА рдзрд╛рд░рдгрд╛ рдорд┐рд▓реА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЗрд╕ рддрдереНрдп рд╕реЗ рдХрд┐ рдЙрдиреНрд╣реЗрдВ 'рдЕрдиреБрдмрдВрдз' рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

@keean рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо "рдмрд╛рдзрд╛" рд╢рдмреНрдж рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ; рдореИрдВ рдЗрд╕реЗ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ I , рдФрд░ рдПрдХ рдЪрд░ x рдкреНрд░рдХрд╛рд░ I рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЗрд╡рд▓ I рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рд╡рд╛рд▓реЗ рдорд╛рди x рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ I рдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ "рдмрд╛рдзрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдЕрд╕реАрдорд┐рдд рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ "рдмрд╛рдзрд╛" рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ)ред рдЗрд╕реА рддрд░рд╣, рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ P рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ I рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ; I рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдердб рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░ I рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рднреА рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЙрдкрд▓рдмреНрдз рд╕рдВрдЪрд╛рд▓рди (рд╡рд┐рдзрд┐рдпреЛрдВ) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ I рдХрд╛ рдЙрдкрдпреЛрдЧ (рдорд╛рди) рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ I рд╣рдо рдПрдХ "рдмрд╛рдзрд╛" (рдЕрдиреБрдмрдВрдз рдХреЗ рд╕реНрдерд╛рди рдкрд░) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрддрдиреЗ рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рднреА рдорд╛рди рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИред

рдореБрдЭреЗ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рд┐рдВрдЧрд▓-рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдмрд┐рдирд╛ "рдмреНрд░реЗрдХ рдбрд╛рдЙрди" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдмрддрд╛рдпрд╛ рдерд╛ред

рдЕрдиреБрдмрдВрдз рдкреНрд░рд╕реНрддрд╛рд╡ рдХреИрд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдЧреЛ рдореЙрдбреНрдпреВрд▓ go1.14 рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛? рдПрдХ GO114CONTRACTS рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░? рджреЛрдиреЛрдВ? рдХреБрдЫ рдФрд░..?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рд╡рд░реНрддрдорд╛рди рдЬреЗрдирд░рд┐рдХ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╛рдд рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдпрд╣ contracts рдФрд░ interfaces рдХреЗ рдмреАрдЪ рд╕рд╛рдл рдкрд╛рдиреА рдбрд╛рд▓рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЙрдирдХреЗ рдмреАрдЪ рддреАрди рдмреБрдирд┐рдпрд╛рджреА рдЕрдВрддрд░ рд╣реЛрдВ:

  1. Contracts рдПрдХ _set_ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ interfaces рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ _single_ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

  2. Contracts рдмрд┐рд▓реНрдЯ-рдЗрди рдСрдкрд░реЗрд╢рдВрд╕, рдХрдиреНрд╡рд░реНрдЬрд╝рди рдЖрджрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ; interfaces рдХреЗрд╡рд▓ рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

  3. рд╡реЗ рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, contracts рдЙрд╕ рдЕрд░реНрде рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдЧреЛ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдпрд╛рдиреА рдЖрдк contract рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реА рдУрд░ interfaces рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЖрдк рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрдЪрд┐рдд рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдПрдХ contract рдХреА рднрд╛рд╡рдирд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп interface (рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЕрддреАрдд рдореЗрдВ рднреА рд╡рдХрд╛рд▓рдд рдХреА рд╣реИ рдкреНрд░рд╕реНрддрд╛рд╡), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдпрд╣ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдХрджрдо рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд┐рд░ рд╕реЗ contracts рдФрд░ interfaces рдХреЗ рдмреАрдЪ рдХреЗ рдкрд╛рдиреА рдХреЛ рдЧрдВрджрд╛ рдХрд░ рджреЗрдЧрд╛ред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рде рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ рдХрд┐ contracts рдХреЛ рдореМрдЬреВрджрд╛ 'рдкреНрд░рдХрд╛рд░' рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ @bigwhite рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рддрд░реАрдХреЗ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд┐рд░ рд╕реЗ рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реВрдБ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдКрдкрд░ (3) рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд░реЗрдЧрд╛ред рд╕рд╛рде рд╣реА, рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдХрд╛рд░рдгреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) type рдХреАрд╡рд░реНрдб рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп:

type List(type Element) struct {
    next *List(Element)
    val  Element
}

рд╕рдВрднрд╡рдд: рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдпрджрд┐ contracts рдХреЛ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ 'рдмрдХрд╡рд╛рд╕' рд╣реИред

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реВрдВ рд╡рд╣ рд╣реИ 'рдЕрдиреБрдмрдВрдз рд╢рд╛рдмреНрджрд┐рдХ' рдЬреЛ contracts рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп 'рдЬрдЧрд╣ рдореЗрдВ' рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдВ, рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред

рдЬреЗрдиреЗрд░рд┐рдХ рдорд╕реМрджреЗ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкреНрд░рддрд┐ рдЗрддрдирд╛ рдкреНрд░рддрд┐рд░реЛрдзреА рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ (рдЬрд┐рд╕рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ) рд▓реЗрдХрд┐рди, рдЧреЛ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдЙрддреНрд╕рд╛рд╣реА рд╡рдХреАрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВред

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ "рдЕрдиреБрдмрдВрдз" рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рди рдХрд░реЗрдВред рджреЛ рдХрд╛рд░рдг рд╣реИрдВ:

  • рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ "рдЕрдиреБрдмрдВрдз" рд╢рдмреНрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ: (https://scholar.google.com/scholar?hl=hi&as_sdt=0%2C33&q=contracts+languages&btnG=)
  • рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдирд╛рдо рд╣реИрдВред рдореИрдВ рдХрдо рд╕реЗ рдХрдо ~ рддреАрди ~ рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ: "рдЯрд╛рдЗрдкрд╕реЗрдЯ", "рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕", "рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ", рдФрд░ "рдмрд╛рдзрд╛рдПрдВ"ред рджреВрд╕рд░реЗ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдорд╛рдорд▓реЗ рдФрд░ рдЙрд▓рдЭреЗрдВрдЧреЗред

@griesemer "рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдПрдВ" рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдХреА рдЪреАрдЬ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдорд┐рдЯ рдЬрд╛рддреЗ рд╣реИрдВред рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЛ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдкреНрд░рдХрд╛рд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдореМрдЬреВрдж рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рдмрд╛рдзрд╛ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдХрд╛рд░-рд╕рдорд╛рдирддрд╛ рдпрд╛ рдкреНрд░рдХрд╛рд░-рдЕрд╕рдорд╛рдирддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз 'рдПрдХ рдЙрдк-рдкреНрд░рдХрд╛рд░' рдЬреИрд╕реА рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВред

рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХреГрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ, рдпрджрд┐ рдПрдХреНрд╕ <: рд╡рд╛рдИ рд╣рдо рдПрдХреНрд╕ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд╛рдИ рдХреА рдЙрдореНрдореАрдж рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд░рдирдЯрд╛рдЗрдо рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдпрд╣ Y рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, Y рд╣рдореЗрд╢рд╛ Y рд╣реЛрддрд╛ рд╣реИред рдЙрдкрдкреНрд░рдХрд╛рд░ рднреА 'рджрд┐рд╢рд╛рддреНрдордХ' рд╣реЛрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрдирдкреБрдЯ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рддрд░реНрдХ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдпрд╛ contravariant рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ 'pred(X)' рдХреЗ рд╕рд╛рде, рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╣реБрд░реВрдкреА X рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЕрдиреБрдордд рдорд╛рдиреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдХреЗрд╡рд▓ рдПрдХреНрд╕ рдХрд╣реЗрдВ рдЬреЛ 'рдкреНрд░рд┐рдВрдЯ' рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЧреИрд░-рджрд┐рд╢рд╛рддреНрдордХ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╕рд╣-рднрд┐рдиреНрдирддрд╛ рдпрд╛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдПрдХреНрд╕ рдХреЗ рдЬрдореАрдиреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЙрдиреНрд╡рд░реНрд╕рд┐рд╕ рдФрд░ рдХреЙрдиреНрдЯреНрд░рд╛рд╡реЗрд░рд┐рдПрдВрд╕ рдЬреИрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорддрднреЗрджреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣ рдмрд╛рдд рдпрд╛рдж рдЖрддреА рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдКрдкрд░ 'рдЧреЛ' рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рдВрджреБ рдЙрди рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдмрдЯрд╛рдЗрдк рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдЧреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдВрдмрдВрдз рд╣реИред рдЬрд╛рд╡рд╛ рдЬреИрд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ (рдПрдХ рд╡рд░реНрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ) рдЗрд╕рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ _are_ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рдмрд╛рдзрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╕рд╣реА рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ 'рдЧреЛ' рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣реИред

@Inuart рдпрд╣ рдмрддрд╛рдирд╛ рдЬрд▓реНрджрдмрд╛рдЬреА рд╣реЛрдЧреА рдХрд┐ рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрднреА рдХреЛрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд░реНрдл рдПрдХ рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 1.14 рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@andrewcmyers рдореБрдЭреЗ "рдЕрдиреБрдмрдВрдз" рд╢рдмреНрдж рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХреЗ рд▓реЗрдЦрдХ рдФрд░ рдЙрд╕рдХреЗ рдХреЙрд▓рд░ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

"рдЯрд╛рдЗрдкрд╕реЗрдЯ" рдФрд░ "рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕реЗрд╕" рдЬреИрд╕реЗ рд╢рдмреНрдж рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдореЗрдЯрд╛-рдЯрд╛рдЗрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмреЗрд╢рдХ рд╣рдо рдХреМрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреБрдмрдВрдз рднреА рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд╛рдо рд╡рд░реНрдгрд┐рдд рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рд╛рдм рдлрд┐рдЯ рд╣реИред

рдореБрдЭреЗ рдХрднреА рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ C++ рдЗрд╕реЗ "рдЕрд╡рдзрд╛рд░рдгрд╛" рдХреНрдпреЛрдВ рдХрд╣рддрд╛ рд╣реИред рдЙрд╕ рд╕рдорддрд▓ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдореЗрд░реЗ рд╕рд╛рде "рдмрд╛рдзрд╛" рдпрд╛ "рдмрд╛рдзрд╛рдПрдВ" рдареАрдХ рд╣реЛрдВрдЧреАред рдлрд┐рд▓рд╣рд╛рд▓ рдореИрдВ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЙрд╕ рд╕реЛрдЪ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рдереЗред

рдореИрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдПрдХ рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬрд┐рд╕реЗ "рдЕрдиреБрдмрдВрдз" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рдорд╛рди рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рд╣рдо рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЙрд╕рдХреЗ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЙрд╕ рд░рд┐рд╢реНрддреЗ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╛рдирддрд╛ рд╣реИред

рдореБрдЭреЗ рдХрднреА рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ C++ рдЗрд╕реЗ "рдЕрд╡рдзрд╛рд░рдгрд╛" рдХреНрдпреЛрдВ рдХрд╣рддрд╛ рд╣реИред рдЙрд╕ рд╕рдорддрд▓ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреБрдЫ рд╕рдорд╛рдирддрд╛ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХрд╛ рдПрдХ рдЕрдореВрд░реНрдд рд╣реИ, рдЬреИрд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ред

рдЕрд╡рдзрд╛рд░рдгрд╛ рд╢рдмреНрдж рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рд╕реАрдорд╛ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@ рд╕рд┐рдШреЛрдпрд╛ рдореИрдВ рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдХрд┐ 'рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ' рд╡реИрдЪрд╛рд░рд┐рдХ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ 'рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз' рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝ '+' рд╕рд╛рд╣рдЪрд░реНрдп рдФрд░ рдХреНрд░рдорд╡рд┐рдирд┐рдореЗрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрди рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдзреЛрдВ рдХреЛ C++ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЕрдореВрд░реНрдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП 'рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ'ред рддреЛ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ 'рдЕрдиреБрдмрдВрдз' рдкреНрд▓рд╕ рдЕрд░реНрдердкреВрд░реНрдг рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рд╣реИред

@ianlancetaylor "рдмрд╛рдзрд╛" рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЬреАрдирд╕ (http://www.cs.cornell.edu/~yizhou/papers/genus-pldi2015.pdf) рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рд╣реВрдВред рд╢рдмреНрдж "рдЕрдиреБрдмрдВрдз" рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдкреАрдПрд▓ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд╡рд┐рджрд╛рддреНрдордХ рд╕реНрд╡рд╛рдж рднреА рд╣реИред

@keean рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рджреНрд╡рдВрджреНрд╡ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рддрддреНрдХрд╛рд▓ рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рд╢реНрдпрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИред рдмрд┐рд▓реНрдХреБрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рддрд░рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдЗрд╕реА рддрд░рд╣, рдЧреЛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрдкрдХреА рдЙрдкрдкреНрд░рдХрд╛рд░-рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдиреАрдЪреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЯрд╛рдЗрдк-рдПрд╕реЗрд░реНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЧреЛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЯрд╛рдЗрдк-рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рди рддреЛ рд╕рд╣- рдФрд░ рди рд╣реА рдХреЙрдиреНрдЯреНрд░рд╛рд╡реЗрд░рд┐рдПрдВрд╕ рд╣реИред

рдЕрдВрдд рдореЗрдВ: рдЖрдк рдЬрд┐рд╕ рджреНрд╡рд┐рднрд╛рдЬрди рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдФрд░ рд╕рдЯреАрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ - рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд┐рднрд╛рдЬрди рдореЗрдВ, рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рд╕реВрдЪреА рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЗрд╕реЗ рд░рдирдЯрд╛рдЗрдо-рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рддрд╛рд▓рд┐рдХрд╛ рдпрд╛ рд╕рдВрдХрд▓рди - рд╕рдордп-рдХреЗрд╡рд▓ рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдЙрд╕ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ:

рдЯрд╛рдЗрдк рдмрд╛рдзрд╛ рд╕реА (рдЯреА) {
}

рдпрд╛

рдЯрд╛рдЗрдк рдЕрдиреБрдмрдВрдз рд╕реА (рдЯреА) {
}

рдпрд╣ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдХрд┐ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИред

рдирдП рдЕрдиреБрдмрдВрдз рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореЗрд░реЗ рдХреБрдЫ рдкреНрд░рд╢реНрди рд╣реИрдВред

1.

рдЬрдм рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ A рджреВрд╕рд░реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ B рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ,
рдпрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп A рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп B рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ,
рдХреНрдпрд╛ рд╣рдореЗрдВ рдП рдкрд░ рдмреА рдХреЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?

рдпрджрд┐ рдЙрддреНрддрд░ рд╕рддреНрдп рд╣реИ, рддреЛ рдпрджрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрдИ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ,
рдпрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХрдИ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ,
рддреЛ рд╣рдореЗрдВ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХреЙрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рд╕реЗ рдХреЙрдиреНрд╕реНрдЯ-рдкреЙрдЗрдЬрдирд┐рдВрдЧ рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

  1. рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рд╣рдореЗрдВ рдЕрдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
    рдЬреИрд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЖрдмрдВрдЯрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп,
    рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рддреБрд▓рдиреАрдп, рдПрдХ рднреЗрдЬрдиреЗ рдпреЛрдЧреНрдп рдЪреИрдирд▓ рд╣реИ, рдПрдХ рдкреНрд░рд╛рдкреНрдп рдЪреИрдирд▓ рд╣реИ,
    рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рд╣реИ, ...

3.

рдпрджрд┐ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рдХреА рддрд░рд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

v.Foo()

рд╣рдо рдПрдХ рдЕрдиреБрдмрдВрдз рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Foo рдХреЛ рдпрд╛ рддреЛ рдПрдХ рд╡рд┐рдзрд┐ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?

@merovius рдкреНрд░рдХрд╛рд░-рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдЕрд╕реНрд╡рд╕реНрде рд╣реЛ рд╕рдХрддреА рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд░рдирдЯрд╛рдЗрдо рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рддрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдПрдХ рдкреВрд░реНрдг рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ) рдпрд╛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗред рдЕрд╕реНрддрд┐рддреНрд╡ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд░рдг рдЕрдВрддрд░ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЬреНрдЮрд╛рдд рд╣реЛрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдИрдУ рд╕реЗ рдкрдврд╝рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░)ред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдкрдкреНрд░рдХрд╛рд░ рдЖрдорддреМрд░ рдкрд░ рд░рдирдЯрд╛рдЗрдо рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рднрд╛рд╖рд╛ (рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░) рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЕрднреА рднреА рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ рдЯрд╛рдЗрдк-рдмрд╛рдзрд╛рдУрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЧреЛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк-рдХреЙрдиреНрд╕реНрдЯреНрд░рд┐рдХреНрдЯрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ, рд╣рдо рдЗрди рдЕрдВрддрд░реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ-рдЗрдВрдЯрд░рдлреЗрд╕ _are_ рдкреНрд░рдХрд╛рд░ (рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ) рдкрд░ рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЧреЛ-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдХ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрдмрдВрдз рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ/рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд░рд┐рд╕реАрд╡рд░ рд╣реИред рддреЛ рдЧреЛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЕрдиреБрдмрдВрдз рджреЛрдиреЛрдВ рдХреНрдпреЛрдВ рд╣реИрдВ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ (рдЬреИрд╕реЗ '+') рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рди рд╣реА рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

рддреЛ рдРрд╕реЗ рджреЛ рдХрд╛рд░рдХ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдк-рдмрд╛рдзрд╛рдУрдВ рдФрд░ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрддрд░ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╣реИ рд╕рд╣/рдХреЙрдиреНрдЯреНрд░рд╛-рд╡рд┐рдЪрд░рдг, рдЬрд┐рд╕реЗ рд╣рдо рдЯрд╛рдЗрдк-рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЗрдирд╡реЗрд░рд┐рдПрдВрд╕ рдХреЗ рдХрд╛рд░рдг рдЧреЛ рдореЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрд░рд┐рдд-рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡-рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк-рдмрд╛рдзрд╛рдПрдВ рдзреНрд╡рдирд┐ рд╣реЛрддреА рд╣реИрдВ рдпрджрд┐ рдкреНрд░рдХрд╛рд░-рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдмрд╣реБрд░реВрдкрддрд╛ рд╣реИред

@ рдХреАрди рдХреВрд▓, рдЗрд╕рд▓рд┐рдП рдПрдЖрдИрдпреВрдЖрдИ рд╣рдо рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЧреЛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдмрд╛рдзрд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ :)

рд╢реЗрд╖ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдКрдкрд░ рдЖрдкрдиреЗ рджрд╛рд╡рд╛ рдХрд┐рдпрд╛:

"рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмрд╛рдзрд╛рдПрдВ" рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдХреА рдЪреАрдЬ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдорд┐рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЛ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рджрд╛рд╡рд╛ рдЖрдкрдХреЗ рдирд╡реАрдирддрдо рджрд╛рд╡реЗ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдХрд┐ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЙрд╕ рд╕рдВрдХрд▓реНрдк (рдФрд░ рд╕рднреА рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ) рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдзреНрд╡рдирд┐ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╕рдорд╛рди рд╣реИрдВред рд▓реЗрдХрд┐рди рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЕрднреА рднреА рдПрдХ рд░рди-рдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрдЧрд╛ред рдпрд╣ рдереЛрдбрд╝реЗ рдирд╛рдЗрдЯ-рдкрд┐рдХреНрдп рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд░рди-рдЯрд╛рдЗрдо рдмрдирд╛рдо рд╕рдВрдХрд▓рди-рд╕рдордп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░-рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЕрдореВрд░реНрдд рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдорд┐рд▓рд╛ рд░рд╣рд╛ рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ - рдФрд░ рдпрд╣ рднреА рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдореБрдЦреНрдп рд╕рдбрд╝рдХ рдмреНрд▓реЙрдХ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрд▓рдЧ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╡рдзрд╛рд░рдгрд╛ред

@keean рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдирд╣реАрдВ, рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдиреЗ рдореЗрд░реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рджрд┐рдпрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдореИрдВрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрдмрдВрдз/"рдмрд╛рдзрд╛" рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдХ _simple_ _concrete_ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдкрд░рд┐рджреГрд╢реНрдп "рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдмрд┐рдирд╛" рдХреНрдпреЛрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдмрддрд╛рдпрд╛ рдерд╛ред рдЖрдкрдиреЗ рдРрд╕рд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджрд┐рдпрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЙрдк-рдкреНрд░рдХрд╛рд░, рд╕рд╣- рдпрд╛ рдХреЙрдиреНрдЯреНрд░рд╛-рд╡реЗрд░рд┐рдПрдВрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ (рдЬрд┐рд╕реЗ рд╣рдо рд╡реИрд╕реЗ рднреА рдЧреЛ рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣рдореЗрд╢рд╛ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП), рдЖрджрд┐ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдкреНрд░рд╛рдердорд┐рдХ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдЧреЛ рд╢рдмреНрджрд╛рд╡рд▓реА (рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреНрд╕,) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░, рдЖрджрд┐) рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ "рдмрд╛рдзрд╛" рд╕реЗ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдпрд╣рд╛рдБ рд╣рд░ рдХреЛрдИ рд╕рдордЭрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд░ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╛рд╡рд╛ рдореЗрдВ рдЖрдкрдХреЗ рджрд╛рд╡реЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╛рд╡рд╛ рд╕реНрдкреЗрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ: "рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рдгрд╛ рдПрдХ рдирдпрд╛ рдирд╛рдорд┐рдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИред рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рддреЛ рдЬрд╛рд╡рд╛ рд╕реНрдкреЗрдХ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рдо рд╣реИред)

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреА рдирд╡реАрдирддрдо рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ @Merovius рдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ, рдЬрдм рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ: "рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЧреЛ-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрдмрдВрдз рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ/рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд░рд┐рд╕реАрд╡рд░ рд╣реИ ред"ред рдпрд╣ рд╡рд╣реА рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рдореИрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрдирд╛ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рд╛ рдЙрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@dotaheor

рдЬрдм рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ A рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ B рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди A рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди B рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ A рдкрд░ B рдХреЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдпрджрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдП рдПрдХ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдмреА рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмреА рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмреА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдЕрдиреБрдмрдВрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдП рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЕрдиреБрдмрдВрдз рдореЗрдВ рдмреА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЕрдиреБрдмрдВрдз рдХрд╛ рдЕрд░реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА, рд╕рднреА рдмрд╛рдзрд╛рдПрдВ рдмреА рдХреЛ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдП рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЕрдиреБрдмрдВрдз рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рддрдм рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЙрддреНрддрд░ рд╕рддреНрдп рд╣реИ, рддреЛ рдпрджрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрдИ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрдИ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХреЙрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд╕реЗ рдХреЙрдиреНрд╕реНрдЯ-рдкреЙрдЗрдЬрдирд┐рдВрдЧ рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ рд╡рд╣ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╣рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдХреЙрдиреНрд╕реНрдЯ-рдкреЙрдЗрдЬрд╝рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╣рд░ рдЬрдЧрд╣ const рдлреИрд▓рд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдПрдХ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдЬрдЧрд╣ рдорд┐рд▓рддреА рд╣реИ рдЬрд╣рд╛рдВ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рд╣рд░ рдЬрдЧрд╣ const рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ "рдпрджрд┐ рдЖрдк рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред"

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдореБрдЭреЗ рдмреЗрд╣рдж рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдХрдИ рдЕрдиреНрдп рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд╣реЛрдЧрд╛?

рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рд╣рдореЗрдВ рдЕрдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЬреИрд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдмрдВрдЯрд┐рдд, рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рддреБрд▓рдиреАрдп, рдПрдХ рднреЗрдЬрдиреЗ рдпреЛрдЧреНрдп рдЪреИрдирд▓ рд╣реИ, рдПрдХ рдкреНрд░рд╛рдкреНрдп рдЪреИрдирд▓ рд╣реИ, рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рд╣реИ, ...

рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдмрддрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдФрд░ рд╕рдордиреБрджреЗрд╢рди рдФрд░ рддреБрд▓рдиреАрдпрддрд╛ рдЬреИрд╕реА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рднреЗрдЬрдиреЗ рдпреЛрдЧреНрдп рдпрд╛ рдкреНрд░рд╛рдкреНрдп рдЪреИрдирд▓ рдЬреИрд╕реА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ chan T рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ T рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдмрддрд╛рддрд╛ рд╣реИред рдмрд╛рдзрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдмрд╛рд░ рдЖрдПрдЧрд╛ред рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдХрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рдХреА рддрд░рд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

рд╡реА.рдлреВ ()
рд╣рдо рдПрдХ рдЕрдиреБрдмрдВрдз рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдлреВ рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ?

рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдорд╕реМрджреЗ рдореЗрдВ, рдЖрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ? (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдбрд┐рдЬрд╛рдЗрди рдорд╕реМрджреЗ рдиреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдерд╛ред)

@griesemer рдЖрдк рдЙрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдП рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдорд╛рдиреНрдп рдерд╛ рдЬрдм рдЖрдк рдЖрд╢реНрд░рд┐рдд-рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡-рдкреНрд░рдХрд╛рд░ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдиреНрдпрдерд╛ рдпрджрд┐ рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж рддрдХ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

рдореИрдВрдиреЗ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рднреА рджреЗрдЦрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЛрдИ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЯрд╛рдЗрдк-рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдореЗрдВ рд╕рд╣/рдХреЙрдиреНрдЯреНрд░рд╛-рд╡рд┐рдЪрд░рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗред рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рди рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рдЗрд░рд╛рджреЗ, рдХрд┐ рдпреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реЛрдЧрд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ (рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реИ)ред

@ianlancetaylor

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдореБрдЭреЗ рдмреЗрд╣рдж рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдХрдИ рдЕрдиреНрдп рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд╣реЛрдЧрд╛?

рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛? рдЕрдЧрд░ рдореИрдВ 'рдЯреА' рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ 'рдЯреА' рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ 'рдЬреЛрдбрд╝рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░' рдкрд░ 'рдпреЛрдЧ' рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдЕрдм рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдпреЛрдЧ рдХрд╣рддрд╛ рд╣реИ? рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдХрдИ рдЪреАрдЬреЛрдВ рдореЗрдВ рдПрдХ рдпреЛрдЧ/рдЙрддреНрдкрд╛рдж рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ (рдХреБрдЫ рднреА рдЬреЛ 'рд╕рдореВрд╣' рд╣реИ)ред

рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рдХрд┐ рднрд╛рд╖рд╛ рдкрд░ рдЕрдиреБрдмрдВрдз рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рдЙрд╕реА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред

@keean рдЕрд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдХрдИ рдЕрдиреНрдп рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдкреНрд░рддрд┐-рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдореИрдВ рдХрдмреНрдЬ-рд╡рд┐рд╖рд╛рдХреНрддрддрд╛ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@mrkaspa рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рддрд░рд╣ рд╣реИрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реА ++ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддрд░рд╣ рд╣реИрдВред рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧ рдФрд░ рдЙрджреНрджреЗрд╢реНрдп рд╣реИред

@ianlancetaylor рдЕрдиреБрднрд╡ рд╕реЗ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдХреЙрдиреНрд╕ рдкреЙрдЗрдЬрд╝рдирд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИрдВред рджреЛрдиреЛрдВ рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреА рддрд░рд╣ рдкреЗрдбрд╝ рдХреА рд╡рдЬрд╣ рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдбреАрдк рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓реАрдл рд╕реЗ рд▓реЗрдХрд░ рд░реВрдЯ рддрдХ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рднреА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдерд░реНрдб рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЫреВрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд░реВрдЯ рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдиреБрдмрдВрдз рдЬрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЕрдХреНрд╕рд░ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдЗрди рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк-рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИред

@ianlancetaylor рдореБрдЭреЗ c ++ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ? рдореБрдЭреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@keean рдпрд╣ рд╕рдмрдереНрд░реЗрдб рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЧреЛ рдореЗрдВ рд╕рднреА рдорд╛рди рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреБрдмрдВрдз рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЬрдм рдореИрдВ рд╕рдмреВрдд рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ рдХрд┐ рдПрдХ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрдмрдВрдз рдЬрдорд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдЧрд╛ред рдбрд┐рдЬрд╝рд╛рдЗрди рдорд╕реМрджреЗ рдХрд╛ рдмрд┐рдВрджреБ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреНрдпреЛрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЧреЛ рдЬреИрд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рд╛рдм рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд┐рд╕реЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@mrkaspa рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ []io.Reader рд╣реИ рддреЛ рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдиреБрдмрдВрдз рдирд╣реАрдВред рдПрдХ рдЕрдиреБрдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рд╕рднреА рддрддреНрд╡ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдВред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ io.Reader рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

@ianlancetaylor рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд┐рд▓рд╛ рд╣реИ, рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ рдЗрд╕ рдмреАрдЪ рдЕрдиреБрдмрдВрдз рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рдирдпрд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдБ?

@ianlancetaylor :

рдХреНрдпрд╛ рдЖрдк рдирд┐рдореНрди рдЬреИрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ?

contract Reader(T) {
  T Read([]byte) (int, error)
}

func ReadAll(type T Reader)(readers []T) ([]byte, error) {
  // Use the readers...
}

рдЕрдм ReadAll() рдХреЛ []io.Reader рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣ []*os.File рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛, рд╣реИ рдирд╛? io.Reader рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдорд╕реМрджреЗ рдореЗрдВ рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рдиреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред рдореИрдВрдиреЗ рдЧрд▓рдд рд╕рдордЭрд╛ред рдпрд╣ рдЕрднреА рднреА рдПрдХ рдРрд╕реА рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ @mrkaspa рдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рд╣реИред рдЖрдк рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ; рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@mrkaspa рд╣рд╛рдБ, рдпрд╣ рд╕рдЪ рд╣реИред

@ianlancetaylor рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ []io.Reader рдФрд░ рдЗрд╕ рдЕрдиреБрдмрдВрдз рдХреА рд╕реВрдЪреА рдереА:

contract Reader(T) {
  T Read([]byte) (int, error)
}

func ReadAll(type T Reader)(readers []T) ([]byte, error) {
  // Use the readers...
}

рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд░реАрдбрдСрд▓ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдиреБрдмрдВрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ?

@ianlancetaylor рдпрдХреАрди рд╣реИ рдХрд┐ рдЪреАрдЬреЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХрд░рдирд╛, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЙрдЧрд┐рдВрдЧ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рддрд╛рдХрд┐ рд╣рдо рдирд▓, рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓, рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛ рдЖрджрд┐ рдХреЗ рдмреАрдЪ рд▓реЙрдЧ рд▓рдХреНрд╖реНрдп рдХреЛ рдмрджрд▓ рд╕рдХреЗрдВред рдЬреЛрдбрд╝рдирд╛ рд▓реАрдл рдлрдВрдХреНрд╢рди рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╕рд╣рд┐рдд, рдХреБрд▓ рд░реВрдЯ рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреЛрдб рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб 'рд░рдЦрд░рдЦрд╛рд╡' рдореЗрдВ рд╢реБрд░реВ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд░рдЦрд░рдЦрд╛рд╡, рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ, рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдЖрджрд┐ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрдбрд╝реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╣реА рдкреНрд░рдХрдЯ рд╣реЛрдВрдЧреА, рдЬрд┐рд╕реЗ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдБ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рднреА рдореМрдЬреВрдж рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрджрд╛ред рдЖрдк рдХреБрдЫ рдмрдбрд╝реЗ рдПрдбрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдбрд╛ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдореМрдЬреВрдж рд╣реИ рддреЛ рдореБрдЭреЗ рдЧреЛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред

@mrkaspa рд╣рд╛рдБред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рд╕реВрддреНрд░ рдХреЛ рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдПрдХ рдЦрд░рд╛рдм рдЬрдЧрд╣ рд╣реИред

@keean рд╢рд╛рдпрдж рдЖрдк рд╕рд╣реА рд╣реИрдВред рд╕рдордп рд╣реА рдмрддрд╛рдПрдЧрд╛ред рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдорд╕реМрджреЗ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдореВрд▓реНрдп рд╣реИред

@keean рдореИрдВ рдЖрдкрдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреБрдЫ рдРрд╕реА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рдеред

@bserdar рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬрд╣рд╛рдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреА рдЪреАрдЬ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред

@keean IMO рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдк рд╡рд╣реА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЖрдк рдЖрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ: рд▓реЙрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд▓реЙрдЧ рдХреЗ рдорд╛рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП context.Context рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд╡рд┐рдЪрд╛рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ-рдЙрддреНрд╕рд╛рд╣реА рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреВрд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рдлреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рд╛рдмрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░-рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдореВрд▓реНрдп рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдпрд╣ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдорд▓реЗ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ , рдХреНрдпрд╛ рд╡реЗ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдЦреНрдд рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЬреЛ рдЗрдпрд╛рдиреНрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ - рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИред

@merovius рдЕрдЧрд░ рдпрд╣ рдореЗрд░реЗ рдКрдкрд░ рдерд╛ рддреЛ рд╕рднреА рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдмрд┐рдВрдм рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рднреЗрдЬрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХреЗред рдпрд╣ рдЕрдзрд┐рдХ рдЖрдХреНрд░рд╛рдордХ рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╕реНрдерд┐рд░ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рд░рдирдЯрд╛рдЗрдо рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмрдбрд╝реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕рдЦреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЯреАрдо рдЙрддрдиреА рд╣реА рдмрдбрд╝реА рд╣реЛрдЧреАред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдмрдбрд╝реА рдЯреАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рджрдХреНрд╖рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕/рдЕрдиреБрдмрдВрдз рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреИрдорд╛рдиреЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрднреА рдореИрдВ рдПрдХ рдПрдкреАрдЖрдИ-рдкреНрд░рдердо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдУрдкрдирдПрдкреАрдЖрдИ/рд╕реНрд╡реИрдЧрд░ рдЬреЗрдПрд╕рдУрдПрди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕рд░реНрд╡рд░ рд╕реНрдЯрдмреНрд╕ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрд╕рдбреАрдХреЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб-рдЬреЗрдирд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рдУрдкрдирдПрдкреАрдЖрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реВрдХреНрд╖реНрдо рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣рд╛ рд╣реИред

@ianlancetaylor

рдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдФрд░ рд╕рдордиреБрджреЗрд╢рди рдФрд░ рддреБрд▓рдиреАрдпрддрд╛ рдЬреИрд╕реА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЧреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдирд┐рдпрдореЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд▓рд╛рдЗрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдЕрдиреБрдмрдВрдз C рд▓рд┐рдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рд╣реИ:

func ConvertSlice(type In, Out C(In, Out)) (x []In) []Out {
    o := make([]Out, len(x))
    for i := range x {
        o[i] = Out(x[i])
    }
    return o
}

рдПрдХ рдЖрджрд░реНрд╢ C рдХреЛ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП:

  • рдХрд┐рд╕реА рднреА рдкреВрд░реНрдгрд╛рдВрдХ, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ
  • рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ
  • рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЬрд┐рдирдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВ
  • рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ Out рдЬреЛ In рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ
  • рдПрдХ рдЪреИрдирд▓ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рджреНрд╡рд┐-рджрд┐рд╢рд╛рддреНрдордХ рдЪреИрдирд▓ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдФрд░ рджреЛ рдЪреИрдирд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ
  • рд╕рдВрд░рдЪрдирд╛ рдЯреИрдЧ рд╕рдВрдмрдВрдзрд┐рдд, ...
  • ...

рдореЗрд░реА рд╕рдордЭ рд╕реЗ, рдореИрдВ рдРрд╕рд╛ рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ред рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд convertible рдЕрдиреБрдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдмрд╛рдзрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдмрд╛рд░ рдЖрдПрдЧрд╛

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЕрдХреНрд╕рд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд░реВрд░рддреЗрдВ рджреБрд░реНрд▓рдн рдирд╣реАрдВ рд╣реЛрдВрдЧреАред

@keean рдпрд╣ рдПрдХ рд╡реИрдз рд░рд╛рдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧреЛ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдФрд░ рд╣рдо рдЬрд╣рд╛рдВ рд╣реИрдВ рд╡рд╣реАрдВ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рдХрд┐ рднрд╛рд╖рд╛ рдХрд╛ рдХреЛрдИ рднреА рд╡рд┐рдХрд╛рд╕ рдпрдерд╛рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреНрд░рдорд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕реА рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ - рдпрджрд┐ рдЖрдк рд╡рд╣рд╛рдВ рдЕрдкрдиреА рдКрд░реНрдЬрд╛ рдХрд╛ рдпреЛрдЧрджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЦреБрд╢реА рд╣реЛрдЧреАред

@merovius рдореИрдВ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ рдХрд┐ рдЧреЛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреНрд░рдорд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдмрд╛рддрдЪреАрдд рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣рд╛ рдерд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ рдПрдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ-рдЙрддреНрд╕рд╛рд╣реА рд╣реВрдВред рдореИрдВрдиреЗ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд░рд╛рдп рдмрддрд╛рдИ, рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдЧреЛ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рджреВрд╕рд░реА рднрд╛рд╖рд╛рдУрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЕрдкрдиреА рднрд╛рд╖рд╛ (рдзреАрд░реЗ-рдзреАрд░реЗ) рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

@dotaheor рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╣рдо рдЖрдЬ рдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред

@ianlancetaylor . рдХрд╛ рдЬрд╡рд╛рдм

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдорд╛рдкрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдорд╛рдорд▓рд╛ рд╕рд░рдгреА рдЖрдпрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ - рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░рди-рдЯрд╛рдЗрдо рддрд░реНрдХ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХреЙрдиреНрд╕реНрдЯ рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ?

рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ (рд╕рдВрдкреВрд░реНрдг) рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрддреНрдпрдВрдд рд╕реАрдорд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрдмрдВрдз рдпрд╛ рддреЛ рд╕рд░рдгреА рдЖрдпрд╛рдо рдпрд╛ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрди рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ "рд╕рдВрдкреВрд░реНрдг рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░" рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдмрдВрдз рдХреЛ рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ?

рд▓реЗрдХрд┐рди рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ, рдЗрд╕рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рдХреЙрд▓ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдХреБрдЫ рджрд┐рди рд╣реЛ рдЧрдП рд╣реИрдВ, рдлрд┐рд░ рд╕реЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдпрд╣рд╛рдБ рд╣реИ:

рдХреНрдпрд╛ рдЧреЛ 2 рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ?

рдирдП рдЦрдВрдб рдХрд╛ рд╢реАрд░реНрд╖рдХ рд╣реИ "рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдУрд╡рд░ рдиреЙрди-рдЯрд╛рдЗрдкреНрд╕ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ"ред

рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рд╡реЗрдХреНрдЯрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз рдЖрдпрд╛рдореАрддрд╛ рдФрд░ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рджреЛрдиреЛрдВ рдкрд░ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрдордПрдХреНрд╕рдкреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдирдПрдХреНрд╕рдПрдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди, рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреВрд╕рд░реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдХреЙрд▓рдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдЖрдо рддреМрд░ рдкрд░, рдЬреЗрдирд░рд┐рдХ рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдХрд▓рди-рд╕рдордп рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдХреЛрдб рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧрдгрд┐рдд/big.Int рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рдФрд░/рдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, 128-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рдЕрдиреНрдп рдЧреИрд░-рджреЗрд╢реА рдирд┐рд╢реНрдЪрд┐рдд-рдЪреМрдбрд╝рд╛рдИ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрддреЛрд╖рдЬрдирдХ рдорд╛рдВрдЧреЛрдВ рдХреЛ рдЙрдЪрд┐рдд рджрдХреНрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдореМрдЬреВрджрд╛ big.Int рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЧрддрд┐рд╢реАрд▓ рд╣реИред рдмрдбрд╝реЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдгред рдлреНрд▓реЛрдЯ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдФрд░/рдпрд╛ рдЕрдиреНрдп рд╕рдВрдХрд▓рди-рд╕рдордп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╡рд┐рд╢реЗрд╖ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП , рдЖрдИрдИрдИрдИ 754-2008 рд╕реЗ рдмрд╛рдЗрдирд░реА 16, рдмрд╛рдЗрдирд░реА 128, рдФрд░ рдмрд╛рдЗрдирд░реА 256 рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдЙрдЪрд┐рдд-рдХреБрд╢рд▓ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдХрд┐ рдЧреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЬрд░реВрд░рддреЛрдВ рдпрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдкрд╣рд▓реБрдУрдВ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдирдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдл рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрдиреБрдХреВрд▓рди рдЬреЛ рдХреЗрд╡рд▓ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдХрд┐рдирд╛рд░реЗ рднрд╛рд░ рдкрд░ рдпрд╛ рдХреЗрд╡рд▓ рдбреАрдПрдЬреА рдпрд╛ рдкреЗрдбрд╝реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрдХреВрд▓рди рдЬреЛ рдХрд┐ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓реЗ-рддреНрд░рд┐рдХреЛрдгреАрдп, рдпрд╛ рдмрдбрд╝реЗ-рдкреВрд░реНрдгрд╛рдВрдХ рдЕрдВрдХрдЧрдгрд┐рдд рд╣реЛрдиреЗ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдХрднреА-рдХрднреА рдирд┐рд░рдВрддрд░-рд╕рдордп рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдирд╣реАрдВ - рд╡реИрдХрд▓реНрдкрд┐рдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЦреБрдж рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЗрди рд╕рдВрдХрд▓рди-рд╕рдордп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдЖрдо рддреМрд░ рдкрд░ рдирд┐рд░рдВрддрд░ рдкреНрд░рд╕рд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

@bford рдиреЗ рд▓рд┐рдЦрд╛:

рдЕрд░реНрдерд╛рддреН рдЬреЗрдирд░рд┐рдХ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИрдВред

рдпрд╣реА рд╡рд╣ рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред
рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╢рд░реАрд░ рдореЗрдВ рдЪрд░/рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред
рд╕рд╣рдЬрддрд╛ рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП COMP рдпрд╛ рдХреЙрдореНрдкрдЯрд╛рдЗрдо рдЬреИрд╕рд╛ рдХреАрд╡рд░реНрдб рдмреЗрд╣рддрд░ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЧреЛрд▓рдВрдЧ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдЯреБрдкрд▓реНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдХреАрд╡рд░реНрдб рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рди (рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдЯреБрдкрд▓реНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╣рдореЗрд╢рд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ред

рдПрдХ рдФрд░ рдмрд┐рдВрджреБ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд░рдирдЯрд╛рдЗрдо рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (рд╕рдЪреНрдЪреЗ рд╕рд┐рдВрдЧрд▓ рд╕рд╛рдЗрди рдСрди) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдП?

рд╕реВрдЪрдХ рдмрдирд╛рдо рдореВрд▓реНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░:

рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ рдЕрдиреБрдмрдВрдз рдореЗрдВ $#$ *T $#$ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рджреЗ T рдХреЗ рд╕рд╛рде рд╕реВрдЪреАрдмрджреНрдз рд╣реИ, рддреЛ рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рд╕реВрдЪрдХ рд╡рд┐рдзрд┐ рдпрд╛ T рдХреА рдПрдХ рдорд╛рди рд╡рд┐рдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рднреЗрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдирд┐рдХрд╛рдп рдореЗрдВ рд╕рднреА рд╡рд┐рдзрд┐ рдХреЙрд▓ рдкреЙрдЗрдВрдЯрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╣реЛрдВрдЧреАред ...

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдпрд╣ рд╡рд░реНрдЧ рдХреИрд╕рд╛ рд╣реИ? рдпрджрд┐ T рдореЗрдВ рдХреБрдЫ рд╕реВрдЪрдХ рд╡рд┐рдзрд┐ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ MyInt рдХреА рддрд░рд╣), рддреЛ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ T рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( Stringer рдореЗрдВ рдЙрджрд╛рд╣рд░рдг)?

рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдХ рдФрд░ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрддрд╛ рд╕рдВрдЪрд╛рд▓рди & , рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рди рддреЛ рд╕рдорд╛рдзрд╛рди рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред

(рдиреЛрдЯ: рдпрджрд┐ рдпрд╣ рднреНрд░рдо рдпрд╛ рдЧрд▓рдд рдХреЛрдб рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдирд┐рд░реНрдгрдп рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред)

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдкреЙрдЗрдВрдЯрд░ рд╡рд┐рдзрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЗрд╕ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯреАрдо рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЖрд░рдХреНрд╖рдг рд╣реИрдВред рдореИрдВ рдмрд╕ рдпрд╣ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ (рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдЖрд░рдХреНрд╖рдг рдХреЛ рднреА рдЬреЛрдбрд╝ рд░рд╣реА рд╣реИ)ред

@fJavierZunzunegui рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рд╡рд░реНрддрдорд╛рди рдкрд╛рда рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдирд┐рд╣рд┐рдд рдкрддрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рддрд░реАрдХреЛрдВ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╕рдордп рдирд┐рд╣рд┐рдд рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдкреИрд░рд╛рдореАрдЯрд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:

рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛

type Lockable(type T) struct {
    T
    sync.Locker
}

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ T рдореЗрдВ Lock рдпрд╛ Unlock рдирд╛рдо рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВ? рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ рдПрдХреНрд╕ рд╢рд░реНрдд рдЕрдиреБрдмрдВрдзреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдорд╛рдиреНрдп рдХреЛрдб рд╣реИ рдЬреЛ рдЕрдиреБрдмрдВрдз рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИ (рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдкреВрд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛рдХрд░)ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдПрдореНрдмреЗрдбреЗрдб рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ (рдЬреИрд╕реЗ T1 рдФрд░ T2 ) рддреЛ рдпрд╣ рдФрд░ рднреА рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП (рдлрд┐рд░ рд╕реЗ, рдЕрдиреБрдмрдВрдзреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ)ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдордирдорд╛рдиреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдЙрди structs рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдкрд░ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╕рдВрдХрд▓рди рд╕рдордп рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИ (рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рд╕реНрд╡рд┐рдЪ )ред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ 2 рдЕрдЪреНрдЫреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  • рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдирд╛: рд╕рд░рд▓, рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯреА рд╕реА рд▓рд╛рдЧрдд рдкрд░ (рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛)ред
  • рдЕрдиреБрдмрдВрдз рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрдВ: рдЗрд╕реА рддрд░рд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ (рдПрдХ рдЧреИрд░-рд▓рдХреНрд╖реНрдп) рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреАрдордд рдХреЗ (рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред

рд╕рдВрд░рдЪрдирд╛ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреАред

рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред рдХреЛрд╢рд┐рд╢ рдХрд░реЛред рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рд╡рд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреА рдмрд╛рдд рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИред

рдЖрдкрдХрд╛ рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди, рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛, рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛: рднрд▓реЗ рд╣реА T рдкрд░ рдЕрдиреБрдмрдВрдз Lock рдФрд░ Unlock $ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛ, рдлрд┐рд░ рднреА рдЖрдк ' рдЙрдиреНрд╣реЗрдВ Lockable рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред

@jba рд╕рдВрдХрд▓рди рдкрд░ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рджреВрд╕рд░реЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдирд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЕрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдпрджрд┐ рд╡рд┐рдзрд┐ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдирд╣реАрдВ рд╣реИ рддреЛ рдпрд╣ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рддреБрд░рдВрдд рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдЪреВрдВрдХрд┐ T рдХрд╛ рдХреЛрдИ рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ interface{} рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ sync.Locker рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА T рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдЙрди рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ред рдпрд╣ рдореЗрд░реА рдмрд╛рдд рдХреЛ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореИрдВ рдореБрдЯреНрдареА рд╕рдорд╛рдзрд╛рди (рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдирд╛) рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рдЖрдкрдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ рддреЛ рджреВрд╕рд░реЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ рд╣реИ! :рд╕реНрдорд╛рдЗрд▓реА:

@JavierZunzunegui рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЕрдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ T рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ noCopy noCopy рдлрд╝реАрд▓реНрдб рд╣реИ? рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рднреА рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдЬрдЧрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдареЛрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ "рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреИрд╕реЗ рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдкреИрд░рд╛рдореАрдЯрд░рдХрд░рдг" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд░рдгреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ . рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реИред

рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдореЗрд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореИрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

import "math/bits"

// SigEl is the element type used in variable length bit vectors, 
// can be any unsigned integer type
type SigEl = uint

// SigElBits is the number of bits storable in each SigEl
const SigElBits = 8 << uint((^SigEl(0)>>32&1)+(^SigEl(0)>>16&1)+(^SigEl(0)>>8&1))

// HammingDist counts the number bitwise differences between two
// bit vectors b1 and b2. I want this to be generic
// Function will panic at runtime if b1 and b2 aren't of equal length.
func HammingDist(b1, b2 []SigEl) (sum int) {
    // Give the compiler a hint so it won't need to bounds check the slices in loops
    _ = b1[len(b2)-1]  
        // This switch is optimized away because SigElBits is const
    switch SigElBits {   // Yay no golang generics!
    case 64:
        _ = b2[len(b1)-1]
        for x := range b1 {
            sum += bits.OnesCount64(uint64(b1[x] ^ b2[x]))
        }
    case 32:
        _ = b2[len(b1)-1]
        for x := range b1 {
            sum += bits.OnesCount32(uint32(b1[x] ^ b2[x]))
        }
    case 16:
        _ = b2[len(b1)-1]
        for x := range b1 {
            sum += bits.OnesCount16(uint16(b1[x] ^ b2[x]))
        }
    case 8:
        _ = b2[len(b1)-1]
        for x := range b1 {
            sum += bits.OnesCount8(uint8(b1[x] ^ b2[x]))
        }
    }
    return sum
}

рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╢рд┐рдХрди рдХреЗ рд╕рд╛рдеред рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рд╕реИрдХрдбрд╝реЛрдВ рдорд┐рд▓рд┐рдпрди []SigEl s рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдирдХреА рд▓рдВрдмрд╛рдИ рдЕрдХреНрд╕рд░ 128-384 рдХреБрд▓ рдмрд┐рдЯреНрд╕ рд╣реЛрддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд░рдгреА рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдКрдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд 192-рдмрд┐рдЯ рдУрд╡рд░рд╣реЗрдб рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдЬрдм рд╕рд░рдгреА рд╕реНрд╡рдпрдВ 384 рдмрд┐рдЯреНрд╕ рдпрд╛ рдЙрд╕рд╕реЗ рдХрдо рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ 50-150% рдореЗрдореЛрд░реА рдУрд╡рд░рд╣реЗрдб рд▓рдЧрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рднрдпрд╛рдирдХ рд╣реИред

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди Sig _arrays_ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдКрдкрд░ HammingDist рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдлреНрд▓рд╛рдИ рдкрд░ рдЯреБрдХрдбрд╝рд╛ рдХрд░рдирд╛ рд╣реИ:

const SigBits = 256  // Any multiple of SigElBits is valid

// Sig is the bit vector array type
type Sig [SigBits/SigElBits]SigEl

bitVects := make([]Sig, 100000000)
// stuff happens ... 

// Note slicing below, just to make the arrays "generic" for the call 
dist := HammingDist(bitVects[x][:], bitVects[y][:])

рдореИрдВ _like_ рдЗрди рд╕рдм рдХреЗ рдмрдЬрд╛рдп рдХреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ (рдХреБрдЫ рдЗрд╕ рддрд░рд╣):

contract UnsignedInteger(T) {
    T uint, uint8, uint16, uint32, uint64
}

type Signature (type Element UnsignedInteger, n int) [n]Element

// HammingDist counts the number bitwise differences between two bit vectors
func HammingDist(b1, b2 *Signature) (sum int) {
    for x := range *b1 {
        // Assuming the std lib bits.OnesCount becomes generic over 
        // all UnsignedInteger types
        sum += bits.OnesCount(*b1[x] ^ *b2[x])
    }
    return sum
}

рддреЛ рдлрд┐рд░ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

type sigEl = uint   // Any unsigned int type
const sigElBits = 8 << uint((^SigEl(0)>>32&1)+(^SigEl(0)>>16&1)+(^SigEl(0)>>8&1))
const sigBits = 256  // Any multiple of SigElBits is valid
type sig Signature(sigEl, sigBits/sigElBits)

bitVects := make([]sig, 100000000)
// stuff happens ... 

dist := HammingDist(&bitVects[x], &bitVects[y])

рдПрдХ рдЗрдВрдЬреАрдирд┐рдпрд░ рд╕рдкрдирд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ...

рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрддрдо рдмрд┐рдЯ рд▓рдВрдмрд╛рдИ рдХрд┐рддрдиреА рдмрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИ рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рддрд░рд╣ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

contract uintArrayOfFixedLength(ElemType,ArrayType)
{
    ArrayType [1]ElemType,[2]ElemType,...,[maxBit]ElemType
    ElemType uint8,uint16,uint32,uint64
}

func HammingDist(type ElemType,ArrayType uintArrayOfFixedLength)(t1,t2 ArrayType) (sum int)
{

}

@vsivsi рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ - рдХреНрдпрд╛ рдЖрдк рд╢рд╛рдпрдж рдпрд╣ рдорд╛рди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рддрддреНрдХрд╛рд▓ рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛? рдХреНрдпреЛрдВрдХрд┐ ISTM рдХрд┐ a) рдЗрд╕рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП b) рдЖрдк рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХреЗ рдкреНрд░рджрд░реНрд╢рди-рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдВрдЧреЗ рдЬреИрд╕реЗ рдЖрдк рдЕрднреА рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЖрдИрдПрдордУ, рдЕрднреА рднреА рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рд▓рдВрдмрд╛рдИ рдФрд░ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЖрдк рдХреНрд╖рдорддрд╛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рдмреНрдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ)ред

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЖрдИрдПрдордУ рдЬреЛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдЕрддрд┐ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - "рдЕрдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреА рдПрдХ рд╕рд░рдгреА" рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╣реИ рдЬреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рд╣реИред

@Merovius рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЪрд░реНрдЪрд╛ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИред

"рдЕрдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреА рдПрдХ рд╕рд░рдгреА" рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╣реИ рдЬреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рд╣реИред

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреА рдХреЛрдИ рд╕рд░рдгреА рдирд╣реАрдВ рд╣реИред рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ _compile time_ рдкрд░ рдПрдХ рдЬреНрдЮрд╛рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЛрд▓рд╛рдВрдЧ рдЖрдИрдПрдордУ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рд▓рдЪреАрд▓реЗ рд╣реЛрддреЗ рд╣реИрдВред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдБ

type Signature (type Element UnsignedInteger, n int) [n]Element

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ n рдПрдХ рд░рдирдЯрд╛рдЗрдо рд╡реИрд░рд┐рдПрдмрд▓ рд╣реИред рдпрд╣ рдЖрдЬ рднреА рдЙрд╕реА рдЕрд░реНрде рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

const n = 10
type nArray [n]uint               // works
type nSigInt Signature(uint, n)   // works 

var m = int(n)
type mArray [m]uint               // error
type mSigInt Signature(uint, m)   // error 

рддреЛ рдЖрдЗрдП рд╕реНрд▓рд╛рдЗрд╕ рдЖрдзрд╛рд░рд┐рдд HammingDist рдлрд╝рдВрдХреНрд╢рди рдХреА "рд▓рд╛рдЧрдд" рджреЗрдЦреЗрдВред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рд░рдгреА рдХреЛ bitVects[x][:] рдмрдирд╛рдо &bitVects[x] рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЫреЛрдЯрд╛ рд╣реИ (-ish, 3 рдЕрдзрд┐рдХрддрдо рдХрд╛ рдПрдХ рдХрд╛рд░рдХ)ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрддрд░ рдХреЛрдб рдФрд░ рд░рдирдЯрд╛рдЗрдо рдЬрд╛рдБрдЪ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╕реНрд▓рд╛рдЗрд╕ рдЖрдзрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдХреЛ рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд▓рд╛рдЗрд╕ рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдб рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдШрдмрд░рд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдФрд░ рд╡рд╛рдкрд╕реА рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред рдПрдирдУрдкреА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ ( _ = b1[len(b2)-1] ) рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд рджреЗрдХрд░ рдПрдХ рд╕рд╛рд░реНрдердХ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рд▓реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд▓рд╛рдЗрд╕ рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЗрди рдиреНрдпреВрдирддрдо рд╕реАрдорд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдЕрднреА рднреА рдЬрд░реВрд░реА рд╣реИ, рднрд▓реЗ рд╣реА рдкрд╛рд░рд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд░рдгреА рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд▓рдВрдмрд╛рдИ рд╣реЛред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдлреЙрд░/рд░реЗрдВрдЬ рд▓реВрдк ( рдЕрдиреЛрд▓рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣реЗрдВ) рдХреЛ рд▓рд╛рднрдХрд╛рд░реА рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгреА рдЖрдзрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд░рдирдЯрд╛рдЗрдо рдкрд░ рдШрдмрд░рд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ (рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдХрд┐рд╕реА рднреА рд╕рд╢рд░реНрдд рд╕реАрдорд╛ рдЬрд╛рдБрдЪ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЛ "рдкрд╛рд╕" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЪрдореБрдЪ рдПрдХ рд╕реНрдерд┐рд░ рдорд╛рди рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рддрддреНрдХрд╛рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЫреЛрдЯреЗ рд╕рд░рдгреА рдЖрдпрд╛рдореЛрдВ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг) рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд▓рд╛рднрдкреНрд░рдж рд░реВрдк рд╕реЗ рдЕрдирд▓реЙрдХ рдХрд░рдирд╛ рдпрд╛ рдПрдХ рд╕рднреНрдп рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдлреЙрд░/рд░реЗрдВрдЬ рд▓реВрдк рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рд╡реЗ рдЖрдпрд╛рдо рдХреНрдпрд╛ рд╣реИрдВ .

рдХреЛрдб рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рджреВрд╕рд░рд╛ рдмрдбрд╝рд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ HammingDist рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ SigEl рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ "рдкрд╛рд╕" рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдЕрдВрддрд░ рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм {8,16,32,64}-рдмрд┐рдЯ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрд▓рд╛рдЗрд╕ рдЖрдзрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреА рд▓рд╛рдЧрдд рдФрд░ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЙрдк-рдЗрд╖реНрдЯрддрдо рд░рд┐рдпрд╛рдпрддреЗрдВ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ "рдПрдирдПрдХреНрд╕рдПрдо" рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред (рдирд┐рд░рдВрддрд░) рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд░реНрдерди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛:

// With generics + parameterized constant array lengths:
type Signature (type Element UnsignedInteger, n int) [n]Element
func HammingDist(b1, b2 *Signature) (sum int) { ... }

// Without generics
func HammingDistL1Uint(b1, b2 [1]uint) (sum int) { ... }
func HammingDistL1Uint8(b1, b2 [1]uint8) (sum int) { ... }
func HammingDistL1Uint16(b1, b2 [1]uint16) (sum int) { ... }
func HammingDistL1Uint32(b1, b2 [1]uint32) (sum int) { ... }
func HammingDistL1Uint64(b1, b2 [1]uint64) (sum int) { ... }

func HammingDistL2Uint(b1, b2 [2]uint) (sum int) { ... }
func HammingDistL2Uint8(b1, b2 [2]uint8) (sum int) { ... }
func HammingDistL2Uint16(b1, b2 [2]uint16) (sum int) { ... }
func HammingDistL2Uint32(b1, b2 [2]uint32) (sum int) { ... }
func HammingDistL2Uint64(b1, b2 [2]uint64) (sum int) { ... }

func HammingDistL3Uint(b1, b2 [3]uint) (sum int) { ... }
func HammingDistL3Uint8(b1, b2 [3]uint8) (sum int) { ... }
func HammingDistL3Uint16(b1, b2 [3]uint16) (sum int) { ... }
func HammingDistL3Uint32(b1, b2 [3]uint32) (sum int) { ... }
func HammingDistL3Uint64(b1, b2 [3]uint64) (sum int) { ... }

// and L4, L5, L6 ... ad nauseum

рдЙрдкрд░реЛрдХреНрдд рджреБрдГрд╕реНрд╡рдкреНрди рд╕реЗ рдмрдЪрдирд╛, рдпрд╛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдЧрдд рдореБрдЭреЗ "рдЬреЗрдиреЗрд░рд┐рдХ рдЕрддрд┐ рдкреНрд░рдпреЛрдЧ" рдХреЗ _рд╡рд┐рдкрд░реАрдд_ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ @ рд╕рд┐рдШреЛрдпрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЕрдиреБрдмрдВрдз рдореЗрдВ рд╕рднреА рдЕрдиреБрдореЗрдп рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реАрдорд┐рдд рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИ, рднрд▓реЗ рд╣реА рдореИрдВ рд╕рдорд░реНрдерди рдХреЗ рдКрдкрд░реА рдХрдЯрдСрдл рдХреЛ рдПрдХ рдкрд░ рд░рдЦрддрд╛ рд╣реВрдВ рдХрдо 384 рдХреБрд▓ рдмрд┐рдЯреНрд╕, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП uint8 рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз рдХреЗ ArrayType [1]ElemType,[2]ElemType,...,[maxBit]ElemType рдЦрдВрдб рдореЗрдВ рд▓рдЧрднрдЧ 50 рд╢рд░реНрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреА рдХреЛрдИ рд╕рд░рдгреА рдирд╣реАрдВ рд╣реИред рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдПрдХ рдЬреНрдЮрд╛рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ "рд░рдирдЯрд╛рдЗрдо рдкрд░" рднреА рдирд╣реАрдВ рдХрд╣рд╛ рдерд╛ред рдЖрдк рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдмреЗрдЦрдмрд░ рд╣реИред рд╕реНрд▓рд╛рдЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЛ "рдкрд╛рд╕" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЪрдореБрдЪ рдПрдХ рд╕реНрдерд┐рд░ рдорд╛рди рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рддрддреНрдХрд╛рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛ - рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣ рдЖрднрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдорд╛рди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЙрддреНрдкрдиреНрди рдХреЛрдб рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред рдпрд╛рдиреА рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ [1]Element , [2]Element , рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрдИ рддрддреНрдХрд╛рд▓рддрд╛рдПрдВ рд╣реЛрдВрдЧреАред рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕реНрд▓рд╛рдЗрд╕-рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рдмреЗрд╢рдХ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ ред рддреЛ, рд╣рд╛рдБ, рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рджреГрдврд╝рддрд╛ рд╕реЗ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрджрд┐рдЧреНрдз рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред (рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВ рдпрд╣ рднреА рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдирд┐рдХрд╛рдп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рднреА рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рд╣реИ)ред

рдХреЛрдб рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рджреВрд╕рд░рд╛ рдмрдбрд╝рд╛ рд▓рд╛рдн

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: "рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг" рд╕реЗ, рдХреНрдпрд╛ рдЖрдк рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдмрдВрдз рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рдЖрдк рдЧреИрд░-рдкреНрд░рдХрд╛рд░-рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рдлрд╛рдпрджреЗ рдореМрдЬреВрджрд╛ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред

рдореИрдВ рдпрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рдорд╛рдорд▓рд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рд╕рдордЭрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░-рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

// With generics + parameterized constant array lengths:
// Without generics

рдпрд╣ рдПрдХ рдЭреВрдард╛ рджреНрд╡рдВрджреНрд╡ рд╣реИ (рдФрд░ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрд╕реЗ рдереЛрдбрд╝рд╛ рдирд┐рд░рд╛рд╢ рд╣реВрдВ)ред "рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдкреВрд░реНрдгрд╛рдВрдХ-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛" рднреА рд╣реИ:

contract Unsigned(T) {
    T uint, uint8, uint16, uint32, uint64
}
func HammingDist(type T Unsigned) (b1, b2 []T) (sum int) {
    if len(b1) != len(b2) {
        panic("slices of different lengths passed to HammingDist")
    }
    for i := range b1 {
        sum += bits.OnesCount(b1[i]^b2[i]) // Same assumption about OnesCount being generic you made above
    }
    return sum
}

рдЬреЛ рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ рддреЛ рд░рдирдЯрд╛рдЗрдо-рдкреИрдирд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдо рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рд▓реЗрдХрд┐рди, рдФрд░ рдпрд╣ рдореЗрд░реА рдмрд╛рдд рд╣реИ, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рд▓рд╛рдн рд╣реИ (рдФрд░ рдпрд╣ рдПрдХ рдРрд╕рд╛ рд▓рд╛рдн рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рдерд╛, рдЖрдИрдПрдордУ)ред рдЖрдк рдЬрд┐рд╕ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдордЬрдмреВрдд рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреИрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдЧреЛ рдЯреАрдо рд╕реЗ рдЕрдм рддрдХ рдореИрдВрдиреЗ рдЬреЛ рд╕реБрдирд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ред

рдореБрдЭреЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЛ "рдкрд╛рд╕" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЪрдореБрдЪ рдПрдХ рд╕реНрдерд┐рд░ рдорд╛рди рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рддрддреНрдХрд╛рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдЖрдк рдмрд╕ рдпрд╣ рдорд╛рди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рд╕реА ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЫрд┐рдкреЗ рд╣реБрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдмреЛрдЭ рдирд╣реАрдВ рд╣реИред рдЬреЗрдирд░рд┐рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдФрд╕рдд рджрд░реНрдЬреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдереЛрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЛрдб рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛрд▓рдВрдЧ рдЕрдиреБрд░рдХреНрд╖рдХ рдЕрдВрддрддрдГ рдХреБрдЫ рднреА рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдЧреЗ рдХреА рдЕрдЯрдХрд▓реЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдВрджрд░реВрдиреА рдЬреНрдЮрд╛рди рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЦреБрд╢реА рд╕реЗ рдЯрд╛рд▓ рджреВрдВрдЧрд╛ред

рдореБрдЭреЗ рдХреНрдпрд╛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдореИрдВрдиреЗ рдКрдкрд░ рд╕рд╛рдЭрд╛ рдХреА рд╣реИ, рд╡рд░реНрддрдорд╛рди рд╕реНрд▓рд╛рдЗрд╕-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдЬреЗрдиреЗрд░рд┐рдХ рд╕рд░рдгреА-рдЖрдзрд╛рд░рд┐рдд рдХреЗ рдмреАрдЪ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

BenchmarkHD/256-bit_unrolled_array_HD-20            2000000000           1.05 ns/op        0 B/op          0 allocs/op
BenchmarkHD/256-bit_slice_HD-20                     300000000            5.10 ns/op        0 B/op          0 allocs/op

рдХреЛрдб: https://github.com/vsivsi/hdtest

рдпрд╣ 4x64-рдмрд┐рдЯ рдХреЗрд╕ (рдореЗрд░реЗ рдХрд╛рдо рдореЗрдВ рдПрдХ рдореАрдард╛ рд╕реНрдерд╛рди) рдХреЗ рд▓рд┐рдП 5 рдЧреБрдирд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рд░рдгреА рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд▓реВрдк-рдЕрдиреЛрд▓рд┐рдВрдЧ (рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХреЛрдб рдирд╣реАрдВ) рд╣реИред рдпреЗ рдЧрдгрдирд╛рдПрдВ рдореЗрд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рдореЗрдВ рд╣реИрдВ, рдЬреЛ рд╕рдЪрдореБрдЪ рдХрдИ рдЦрд░рдмреЛрдВ рдмрд╛рд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП 5x рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдЬ рдЗрди рджрдХреНрд╖рддрд╛ рд▓рд╛рднреЛрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рд╛рдВ, рдЕрдЧрд░ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдХрднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреВрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╡реНрдпрд░реНрде рд╣реЛрдЧрд╛, рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдмрд╣рд░рд╣рд╛рд▓ рджрд┐рд▓рдЪрд╕реНрдк рдЪрд░реНрдЪрд╛. рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдореБрджреНрджреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рднреНрдп рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@vsivsi FWIW, рдЬреЛ рдЬреАрдд рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд▓реВрдк рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдпрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рд▓реВрдк рдХреЛ рднреА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ) - рддреЛ рдпрд╣ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рддрд░реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХ-рдкреИрд░рд╛рдореАрдЯрд░ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдиреЛрд▓рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмреБрд░рд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд▓рдЧрддрд╛ рд╣реИ, рдПрдХреНрд╕ рдкрд░ рд╡рд╛рдИ рдкрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЪрд╛рд▓рд╛рдХ рдмрдирдиреЗ рдФрд░ рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЧреВрдВрдЧрд╛ рд░рд╣рдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдПрдХ рд╕рд░рдгреА рдкрд░ рд▓реВрдкрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реНрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ рдЯреНрд░рд┐рдЧрд░ рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ , рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЬреНрдЮрд╛рдд рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рд▓реВрдкрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдЙрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрдиреБрдорд╛рдиреА рдХреЗ рд▓рд╛рдн рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рддрд░реНрдХ рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕реА рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдмрд╕ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЯреНрд░реЗрдбрдСрдлрд╝ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@Merovius рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдорд╛рдорд▓рд╛ рд╕рдВрдХрд▓рди рд╕рдордп рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реИ (рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░-рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдирд╛) рдЬрд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╣реИред рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореЗрд░рд╛ рдХреЛрдб рдХреЗрд╡рд▓ рд▓рдВрдмрд╛рдИ 64 рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд▓рдВрдмрд╛рдИ 64 рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЗ рдЖрд╡реГрддреНрддрд┐ рд╡рд┐рддрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рд╕реНрддреГрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рд╕реНрдореГрддрд┐ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдЙрдирдореЗрдВ рд╕реЗ рд╣рдЬрд╛рд░реЛрдВ рд╣реИрдВ, рдФрд░ рдкреЗрдЬ-рдХреИрд╢ рдЯреНрд░реИрд╢рд┐рдВрдЧ рдЬреЛ рдЪреАрдЬреЛрдВ рдХреЛ рдзреАрдорд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рдЖрдо рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрдбрд╝реЗ рд╕рдВрднрд╡ рд╣реИрдВ (рдЖрдХрд╛рд░ рдореЗрдВ рдПрдХ рд▓рдВрдмреА-рдкреВрдВрдЫ рд╡рд┐рддрд░рдг) рддреЛ рд╣рдо рдЫреЛрдЯреЗ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд▓реВрдк (1 рд╕реЗ 64 рдХрд╣рддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ред

рдореБрдЭреЗ "рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЪрддреБрд░ рд╕рдВрдХрд▓рдХ" рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рддрд░реНрдХ рд╣реИред рдЗрд╕ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЪрддреБрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛? рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рдХ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдРрд░реЗ рдореЗрдВ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдЫрд┐рдкреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛, рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рдЖрдк рдЙрд╕ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреБрдЫ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

"рд╕рд╛рдорд╛рдиреНрдп рджреБрд╡рд┐рдзрд╛" рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ "рд╕рдВрдХрд▓рдХ рдХреЛ рдзреАрдорд╛/рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ" рдХреЗ рд╕рд╛рде рдЬрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЕрд▓рдЧ рд╕рдВрдХрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдмрдирд╛рдПрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд░ рд░рд╣реА рд╣реИ, рдФрд░ рдЗрдВрдЯреЗрд▓ рдХреА рд╣рд╛рд▓рд┐рдпрд╛ рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрддрддрдГ 'рд╕реА' рдХреЛ рдореБрдЦреНрдп рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрдВрдЯреЗрд▓ рдХреЗ рдирд┐рд░реНрдгрдп рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рднреА рдПрдХ рдХрд╛рд░рдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдореЛрд░реА рдФрд░ 'рд╕реА' рдЬреИрд╕реА рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╡рд░реНрддреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рдореБрдЦ рдХрд╛рд░рдХ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рдереЗред рдЬрдВрдЧ рдХреЗ "рд▓рдХреНрд╖рдг" рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░-рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдкрд░реЗрд╢рд╛рди рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реЗ рдЖрддрд╛ рд╣реИред

рд╣рдорд╛рд░реА рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдХрд┐ рд╡реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреЛ рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рднрд╛рд╖рд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ 'рд╕реА' рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдмрдиреА рд╣реБрдИ рд╣реИред

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИред

рдореИрдВ рдХрдм рддрдХ рдЬреЗрдирд░рд┐рдХ рдЖрдЬрд╝рдорд╛ рд╕рдХрддрд╛ рд╣реВрдБ. рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

@Nsgj рдЖрдк рдЗрд╕ CL рдХреЛ рдЪреЗрдХрдЖрдЙрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://go-review.googlesource.com/c/go/+/187317/

рд╡рд░реНрддрдорд╛рди рдХрд▓реНрдкрдирд╛ рдореЗрдВ, рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ?

contract Point(T) {
  T struct { X, Y float64 }
}

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рджреЛ рдлрд╝реАрд▓реНрдб, X рдФрд░ Y, рдкреНрд░рдХрд╛рд░ рдХрд╛ float64 рд╣реЛред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде

func generate(type T Point)() T {
  return T{X: randomFloat64(), Y: randomFloat64()}
}

@ abuchanan-nr рд╣рд╛рдВ, рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджреЗрдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдпрд╣ рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдиреБрдмрдВрдз рдХреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХрд╕реНрдЯрдо рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрджрд╛рд╣рд░рдг рдмрд┐рд▓реНрдЯрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВ рдПрдХ 2рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдкрд░ рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рд╣реЛрдВ, рдЬреИрд╕реЗ рд░рдВрдЧ, рдмрд▓, рдЖрджрд┐ред рд▓реЗрдХрд┐рди рдЖрдк рдХреЗрд╡рд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ X, Y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рд╡рд░реНрдЯреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

type MyVertex struct {
  X, Y float64
  Color color.Color
  OtherAttr int
}
p := geo.RandomPolygon(MyVertex)()

for _, vert := range p.Vertices() {
  p.Color = randColor()
}

рджреЛрдмрд╛рд░рд╛, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдбрд┐рдЬрд╛рдЗрди рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореЗрд░реА рдХрд▓реНрдкрдирд╛ рдЙрд╕ рд╕рдордп рдереА :)

рдЖрдЬ рдорд╛рдирдХ рдЧреЛ рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП https://godoc.org/image#Image рджреЗрдЦреЗрдВред

рдСрдкрд░реЗрдЯрд░реЛрдВ/рд╕рдВрд╡рд┐рджрд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:

рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рджреЛрд╣рд░рд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдСрдкрд░реЗрдЯрд░ рдкреНрд░рд╛рд░реВрдк ( + , == , < , ...) рдФрд░ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рд░реВрдк ( Plus(T) T ) рдореЗрдВ рд╣реЛрдЧреАред Equal(T) bool , LessThan(T) bool , ...).

рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рдЗрди рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рдПрдХ, рд╡рд┐рдзрд┐ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░реЗрдВред рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ ( int , int64 , string , ...) рдХреЛ рдордирдорд╛рдиреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред (рддреБрдЪреНрдЫ) рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ ( type MyInt int; func (i MyInt) LessThan(o MyInt) bool {return int(i) < int(o)} ), рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд╕рдордЧреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ ( []int -> []MyInt , map[int]struct{} -> map[MyInt]struct{} , рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЪреИрдирд▓, рдкреЙрдЗрдВрдЯрд░, ...) рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ ( рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рджреЗрдЦреЗрдВ)ред рдЗрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЖрд░рд╛рдо рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рддрдХрдиреАрдХреА рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ рдФрд░ рдЕрднреА рднреА рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рд▓реЛрдЧреЛрдВ рд╕рд╣рд┐рдд рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЧреИрд░-рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд, type X struct{S string} рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреЛ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ), рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ []X рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ []T рдХреА рдЕрдкреЗрдХреНрд╖рд╛, T рдХреЗ рд▓рд┐рдП Stringer рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП type X2 X; func(x X2) String() string {return x.S} , рдФрд░ []X рдХреА рдПрдХ рдЧрд╣рд░реА рдкреНрд░рддрд┐ []X2 рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рддрд╣рдд, рдЖрдк рдбреАрдк рдХреЙрдкреА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЗрд╡ рдХрд░ рд▓реЗрдВред

рдиреЛрдЯ: рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЖрд░рд╛рдо рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЪреБрдиреМрддреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@JavierZunzunegui рдореВрд▓ рдпреВрдирд░реА /рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП "рд╡рд┐рдзрд┐ рдкреНрд░рд╛рд░реВрдк" (рдпрд╛ рдСрдкрд░реЗрдЯрд░ рдкреНрд░рд╛рд░реВрдк) рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдСрдкрд░реЗрдЯрд░ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╡рд┐рдзрд┐ рдирд╛рдореЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдХрд░, рдФрд░ рдЗрд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП +(x int) int рдЬреИрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕реАрдзрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рднреА рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджрд╛рдПрдВ рд╣рд╛рде рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдПрдХ рдордирдорд╛рдирд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдордп рдЗрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ)ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЕрдиреБрдмрдВрдз рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ x рдХреЛ X T(x) рддрд░рд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ T рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ T(x) (рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд)ред рдЕрд░реНрдерд╛рддреН, рдЕрдиреБрдореЗрдп рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ "рд╡рд┐рдзрд┐ рдкреНрд░рд╛рд░реВрдк" рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕реНрдерд┐рд░ c рдХреЛ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЛ рд╕реМрдВрдкрд╛ (рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд) рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ T : рдХреНрдпрд╛ рдпрд╣ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛, рдХрд╣рдирд╛ рдХрд╛рдиреВрдиреА рд╣реИ, 256 рд╕реЗ t рдкреНрд░рдХрд╛рд░ рдХрд╛ T ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ T byte рд╣реИ? рдРрд╕реА рд╣реА рдХреБрдЫ рдФрд░ рдмрд╛рддреЗрдВ рд╣реИрдВред рдХреЛрдИ рдЗрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП "рд╡рд┐рдзрд┐ рдкреНрд░рд╛рд░реВрдк" рд╕рдВрдХреЗрддрди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдпрд╛ рдкрдардиреАрдп рд╣реИред

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рд╕рдВрддреЛрд╖рдЬрдирдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдЬреЛ рджреВрд╕рд░реА рдУрд░ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИред

@griesemer рдпрд╣ рдЕрдиреНрдп рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдЧреЛ рдореЗрдВ рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рдЦрд░рд╛рдм рдорд╛рдирддрд╛ рд╣реВрдВред рдЬрд╛рджреВ рд╣реЛрдиреЗ рдЬреИрд╕реЗ рдЕрдиреНрдп рдХрд╛рд░рдг рднреА рд╣реИрдВ рдЬреЛ рдХреЛрдб рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВред

рдпрджрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рд╕реНрд╡реАрдХреГрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реАрдорд╛ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП '+' рдЬреИрд╕реЗ рд╕рдВрдЪрд╛рд▓рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдзрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рддрд░реНрдХ рдФрд░ рдЬреЛрдбрд╝ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рддреЛ рдпрд╣рд╛рдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрдЯрд░ рдХреЛ рдиреНрдпреВрдореЗрд░рд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 'рдкреВрд░реНрдгрд╛рдВрдХ' рдФрд░ 'рдЬреЛрдбрд╝' рдПрдХ "рд╕рдореВрд╣" рдмрдирд╛рддреЗ рд╣реИрдВред

рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЦрддреНрдо рдХрд░реЗрдВрдЧреЗ:

+(T Addable)(x T, y T) T

рдпрджрд┐ рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЪрдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ '+' рдСрдкрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЧреЛ рдореЗрдВ рд╡рд┐рдзрд┐ рдЪрдпрди рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА?

@griesemer рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдмрд╛рдд рдкрд░:

рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯрд╛рдЗрдк рдПрдХреНрд╕ рдХреЗ рдорд╛рди рдПрдХреНрд╕ рдХреЛ рдЯреА (рдПрдХреНрд╕) (рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдЯреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдЕрдиреБрдореЗрдп рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ "рд╡рд┐рдзрд┐ рдкреНрд░рд╛рд░реВрдк" рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдПрдХ рдЬрдЯрд┐рд▓рддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реЗ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЗ рдмрд╛рд╣рд░ рдРрд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдВрдЧреЗред рдПрдХ рдЙрджрд╛рд╣рд░рдг (рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ Stringify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):

Stringify(int)([]int{1,2}) // does not compile
type MyInt int
func (i MyInt) String() string {...}
Stringify(MyInt)([]MyInt([]int{1,2})) // OK. Generic type MyInt could be inferred

рдКрдкрд░, рдЬрд╣рд╛рдВ рддрдХ Stringify рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рддрд░реНрдХ []MyInt рдЯрд╛рдЗрдк рд╣реИ рдФрд░ рдЕрдиреБрдмрдВрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЕрдиреБрдмрдВрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛), рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЕрдиреБрдмрдВрдз рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИред

@JavierZunzunegui рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреЙрд▓рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕/рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдРрд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдкреВрд░реНрдгрд╛рдВрдХ рдпрд╛ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо (рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди) рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ T рдХреЗ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдорд╛рди c1 , c2 рдЖрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреЛрдб рдпрд╣ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ T рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдареАрдХ рд╣реИред (рдХреЛрдИ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред)

func NumericAlgorithm(type T SomeContract)(vector []T) T {
   ...
   vector[i] = 3.1415  // <<< how do we know this is valid without the contract telling us?
   ...
}

рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ T рдХреЗ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдорд╛рди c1 , c2 , рдЖрджрд┐ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

@griesemer рдореИрдВ (рдЬреЗрдиреЗрд░рд┐рдХ рдХреИрд╕реЗ рд╣реИрдВ/рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЧрд▓рдд рд╕рдорд╕реНрдпрд╛ рдХрдерди рд╣реИред рдЖрдкрдХреЛ T рдХреЛ float32 рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ T рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рд╡рд┐рдзрд┐рдпрд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рди рдХрд┐ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдпрд╛ рддреЛ vector рдХреЛ []T $ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ func(float32) T рддрд░реНрдХ ( vector[i] = f(c1) ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ vector рд░рдЦреЗрдВ []float32 рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ DoSomething(float32) рдпрд╛ DoSomething([]float32) рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ T рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ T рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдлреНрд▓реЛрдЯреНрд╕ рдХреЛ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдмрд╛рддрдЪреАрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ T рдХреЛ type T float32 рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред

@JavierZunzunegui рдореИрдВ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ T рдХреЛ float32 рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП - рдпрд╣ float32 , float64 , рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ред рдЕрдзрд┐рдХ рдЖрдо рддреМрд░ рдкрд░, рдпрджрд┐ рд╕реНрдерд┐рд░рд╛рдВрдХ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛрддрд╛, рддреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реЛрдВрдЧреЗ, рдФрд░ рдХреБрдЫ рдЬреЛ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ "рдЧрд▓рдд рд╕рдорд╕реНрдпрд╛ рдХрдерди" рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ - рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ - рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЗрд╕реЗ "рдЧрд▓рдд" рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рджреВрд░ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

@griesemer рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдк рдЕрдХреЗрд▓реЗ рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рдЪрд┐рдВрддрд┐рдд рдереЗ, рдореИрдВрдиреЗ рдореБрдЦреНрдп рддрддреНрд╡ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣рд╛ рд╣реИред

рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдореЗрд░реЗ рдЙрддреНрддрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, T рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ DoSomething(X) рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ func(float64) X рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдХреЛ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( T,X )ред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ X рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ float32 рдпрд╛ float64 рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ func(f float64) float32 {return float32(f)} рдпрд╛ func(f float64) float64 {return f} рд╣реИред

рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕рдЯреАрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рд╛рд░реВрдк рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рджреЛ-рдЯрд╛рдЗрдк ( T,X ) рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдЬреА рд░рдЦрдирд╛ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ MyFunc32 / MyFunc64 /etc рдХреЛ рд░рдЦрдирд╛ рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ MyFunc32(int32) / MyFunc64(int64) /etc. рдПрдХ MyFunc(type T Numeric) рд╕реЗ рдХрдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИ (рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЕрдХреНрд╖рдореНрдп рд╣реИ!) рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд╣реИ, рдФрд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рд╣реИрдВ? рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ T рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдорд┐рд▓рддреА рд╣реИред

рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдорд╣рдВрдЧрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк int64 / float64 рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ T рдкрд░ рд╕рд░рд▓ рдФрд░ рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд░рдЦрддреЗ рд╣реБрдП рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реЛрдЧреЛрдВ рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ "рдЖрдк рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдЯреА рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред" рдЧреЛ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рд░рд▓ рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдЪрд┐рддреНрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдПрдВ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИрдВред

рдХрд┐рд╕реА рднреА рд╕рдордп рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рддреНрдпрд╛рдЧ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрд╛рд╖рд╛ рдХреЛ рд╕рд░рд▓ рд░рдЦрдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

@JavierZunzunegui рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд (рдЬреЗрдиреЗрд░рд┐рдХ) рдХреЛрдб рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдЙрд╕ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░реЛрдВ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдЗрдЧрде $#$ int $#$ рдХреЗ рдмрдЬрд╛рдп byte рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд╛рди рдмрдЪрдд рд╣реЛрддреА рд╣реИ (рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рд╕реНрд▓рд╛рдЗрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рддреЛ рдмрд╕ рдХреЛрдб рдХреЛ "рдХрд╛рдлреА рдмрдбрд╝реЗ" рдкреНрд░рдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрд╕рдВрддреЛрд╖рдЬрдирдХ рдЙрддреНрддрд░ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЧреЛ рдЬреИрд╕реА "рд░рд╛рдп" рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рднреАред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХреЗрд╡рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬреЛ "рдмрдбрд╝реЗ" рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЗрддрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдПрдХ рдкреНрд░рд╢реНрди рдХреЗ рд╕рд╛рде рдЦрд╛рд░рд┐рдЬ рдХрд░рдирд╛ "рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рд╡реИрд╕реЗ рднреА рд╣реИрдВ" рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рде рд╕реЗ рд▓рд╣рд░рд╛рддреЗ рд╣реИрдВ рдЬреЛ рдореМрдЬреВрдж рд╣реИред рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП: рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреИрд╕реЗ -1, 0, 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдиреБрдЪрд┐рдд рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ -1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде, рдмрд╕ рдЖрдкрдХреЛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдо рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@ianlancetaylor @griesemer рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж - рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдШрд░реНрд╖ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреАрдЫреЗ рд░рдЦреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди https://github.com/golang/go/issues/15292#issuecomment -546313279 рдореЗрдВ рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдкрд░ рд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВ:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЧреИрд░-рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд, рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ X struct{S string} (рдЬреЛ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ), рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ []X рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ [ ] рдЯреА, рд╕реНрдЯреНрд░рд┐рдВрдЧрд░ рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯреА рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ X2 X рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА; func(x X2) String() рд╕реНрдЯреНрд░рд┐рдВрдЧ {рд░рд┐рдЯрд░реНрди xS}, рдФрд░ []X рдХреА рдПрдХ рдЧрд╣рд░реА рдкреНрд░рддрд┐ []X2. рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рддрд╣рдд, рдЖрдк рдбреАрдк рдХреЙрдкреА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЗрд╡ рдХрд░ рд▓реЗрдВред

рд░реВрдкрд╛рдВрддрд░рдг рдирд┐рдпрдореЛрдВ рдореЗрдВ рдвреАрд▓ (рдпрджрд┐ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реЛ) рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред

@JavierZunzunegui рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ []B([]A) рдпрджрд┐ B(a) ( a рдкреНрд░рдХрд╛рд░ A рдХреЗ рд╕рд╛рде) рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрд░ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

@ianlancetaylor рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЧреЛ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рдорд╢реАрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмреЗрд╣рддрд░ рд╢рдмреНрдж рдЕрдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░рдВрддрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ 27 рдЬреИрд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ int16|int32|float16|float32 рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдШ рд╣реЛрдЧрд╛ред рдлрд┐рд░ T рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдпрд╣ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╕рдВрдШ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдмрд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдорд╛рдорд▓рд╛ print(27) рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрднреА рднреА рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрдШ рдореЗрдВ рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рдХрд░реЗрдЧрд╛, рдФрд░ рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖/рдЧрддрд┐ рдЖрджрд┐ рдЬреИрд╕реЗ рдЕрдиреБрдХреВрд▓рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред .

@keean рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ "рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ" рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдЯреАрдХ рдирд╛рдо рдФрд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдСрдл-рд╡рд┐рд╖рдп рд╣реИред рдЖрдЗрдП рдХреГрдкрдпрд╛ рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рд▓реЗ рдЬрд╛рдПрдВред рдзрдиреНрдпрд╡рд╛рджред

@ianlancetaylor рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдПрдХ рд╕реНрд╡рдЪреНрдЫ/рд╕рд░рд▓ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпреЗ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ, рдФрд░ рдЧреЛ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдореВрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдПрдХ рдФрд░ рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЧреЛ рдХреЗ рд▓рд┐рдП, рдЬреЗрдирд░рд┐рдХ рд╣рдореЗрд╢рд╛ рдмрд╛рдж рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рднрд╛рд╖рд╛ рдХреЛ рд╕рд╛рдл рдФрд░ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рди рд╣реЛред

рдЕрдЧрд░ рдореИрдВ рдЖрдЬ рддреЗрдЬреА рд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдФрд░ рддреБрд▓рдиреАрдп рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЧреЛрд▓рд╛рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХреЛрдИ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдзрд┐ рдЕрдзрд┐рднрд╛рд░ рдФрд░ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдмрд╣реБрд░реВрдкрддрд╛ (рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ) рдХрд╛ рдЪрдпрди рдХрд░реВрдВрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдЕрдЬреНрдЮрд╛рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЬреЗрдирд░рд┐рдХ рдЪреБрдирдиреЗ рд╕реЗ рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХрд╛ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╢реЛрд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдХрднреА-рдХрднреА рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд┐рд░, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЗрдирд░рд┐рдХ рд╣реИрдВ, рддреЛ рдЙрдиреНрдирдд рдмрд╛рдзрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХреНрд▓реЙрдЬ, рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╢рд╛рдпрдж рдЙрдЪреНрдЪ рд░реИрдВрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЖрд╢реНрд░рд┐рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рднреА?
рдпреЗ рд╕рднреА рдкреНрд░рд╢реНрди рдЕрдВрддрддрдГ рдЙрдареЗрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдЬреЗрдирд░рд┐рдХ рдХреЛ рдЕрдкрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рджреЗрд░-рд╕рдмреЗрд░ред

рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддреЗ рд╣реБрдП, рдореИрдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЧреЛ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрджрд┐ рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреА рд╢реБрд░реВрдЖрдд рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ, рддреЛ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореЛрдиреЛрдореЛрд░реНрдлрд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ред
рдмреЙрдХреНрд╕ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╛рдиреА рд╕рднреА рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛, рдФрд░ рдХреЗрд╡рд▓ рддрднреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрдЧрд╛ рдЬрдм рдкрд░рд┐рднрд╛рд╖рд╛-рдпрд╛ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░ рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ?

рд░рдирдЯрд╛рдЗрдо рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣ рдмреЙрдХреНрд╕рд┐рдВрдЧ/рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛, рдЕрдиреНрдпрдерд╛, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╕реНрддрд░ рдХреЗ рд╕реА ++ рдЗрдВрдЬреАрдирд┐рдпрд░ рд╣реИрдВ рдЬреЛ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдЬреЗрдирд░рд┐рдХ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛ рдХреИрд╢ рдорд┐рд╕ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред

@ianlancetaylor @griesemer рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдХрд┐рдП рд╣реБрдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ 'рдЧреИрд░-рдСрдкрд░реЗрдЯрд░' рдЬреЗрдирд░рд┐рдХ рдХреЗ рдореБрджреНрджреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ (https://github.com/golang/go/issues/15292#issuecomment-547166519) рдФрд░ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ рдЗрд╕рдХреЗ рд╕рд╛рдеред

рд╕рд╛рдВрдЦреНрдпрд┐рдХ рдкреНрд░рдХрд╛рд░ ( type MyInt32 int32 , type MyInt64 int64 , ...) рджреЗрдВ, рдЗрдирдореЗрдВ рд╕рдорд╛рди рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ ( Add(T) T , ...) рд▓реЗрдХрд┐рди рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдирд╣реАрдВ рдЬреЛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реЛрдЧрд╛ func(MyInt64) FromI64(int64) MyInt64 рд▓реЗрдХрд┐рди рдирд╣реАрдВ ~ func(MyInt32) FromI64(int64) MyInt32 ~ред рдпрд╣ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд╕рдЯреАрдХ рдорд╛рди рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ) рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ (1) рдХреНрдпреЛрдВрдХрд┐ рдХрдо-рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдмрдВрдз рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рднреА рдЙрдЪреНрдЪ рд╡рд╛рд▓реЗ рдХрд░реЗрдВрдЧреЗред рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рджреЗрдЦреЗрдВред

рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкрд░реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдЖрд░рд╛рдо рджреЗрдиреЗ рдХрд╛ рдПрдХ рд▓рд╛рдн (рдЗрд╕ рдирд╡реАрдирддрдо рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛) рдХреНрдпрд╛ рдпрд╣ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣-рдЬрд╛рдВрдЪ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рджреЗрдЦреЗрдВред рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣-рдЬрд╛рдВрдЪ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрдиреБрд░реЛрдз/рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ (https://github.com/golang/go/issues/31500 рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ)ред


(1) : рдЯрд╛рдЗрдк рди рдХрд┐рдП рдЧрдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕рдВрдХрд▓рди-рд╕рдордп рдЧрд╛рд░рдВрдЯреА рдПрдХ рд╣реА 'рд╢рд╛рдЦрд╛' ( int[8/16/32/64] рдФрд░ uint[8/16/32/64] ) рдХреЗ рднреАрддрд░ рдордЬрдмреВрдд рд╣реИред рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ uint[X] рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗрд╡рд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ int[2X+] рдкрд░ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ int[X] рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдХрд┐рд╕реА рднреА uint[X] рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рддрддреНрдХрд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЗрдиреНрд╣реЗрдВ рдЖрд░рд╛рдо рджреЗрдирд╛ ( int[X]<->uint[X] рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛) рдХреБрдЫ рдиреНрдпреВрдирддрдо рдорд╛рдирдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╕рд░рд▓ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛, рдФрд░ рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдХреЛрдИ рднреА рдЬрдЯрд┐рд▓рддрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ рдкрд░ рдкрдбрд╝рддреА рд╣реИ, рди рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ (рдЬреЛ рдХреЗрд╡рд▓ рдЕрдиреБрдмрдВрдз рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ) , рдФрд░ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдорд╛рдиреНрдп рд╣реИ)ред

рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ - рдЬрд╛рд╡рд╛ рдХрд╛ рдкрддрди рдерд╛!

@ianlancetaylor рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдПрдХ рд╕реНрд╡рдЪреНрдЫ/рд╕рд░рд▓ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпреЗ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ, рдФрд░ рдЧреЛ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдореВрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдПрдХ рдФрд░ рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЧреЛ рдХреЗ рд▓рд┐рдП, рдЬреЗрдирд░рд┐рдХ рд╣рдореЗрд╢рд╛ рдмрд╛рдж рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рднрд╛рд╖рд╛ рдХреЛ рд╕рд╛рдл рдФрд░ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рди рд╣реЛред

рдореИрдВ 100% рд╕рд╣рдордд рд╣реВрдБред рдЬрд┐рддрдирд╛ рдореБрдЭреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬреЗрдирд░рд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд▓реЛрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЛ рдкрдХрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЧреЛ рднрд╛рд╖рд╛ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ред

рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

type I1(type P1) interface {
        m1(x P1)
}

type I2(type P1, P2) interface {
        m2(x P1) P2
        type int, float64
}

func f(type P1 I1(P1), P2 I2(P1, P2)) (x P1, y P2) P2

рд╕рднреА рдХреЛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдРрд╕рд╛ рди рдХрд░реЗрдВ! рдпрд╣ рдЧреЛ рдмрд┐рдЧ рдЯрд╛рдЗрдо рдХреА рд╕реБрдВрджрд░рддрд╛ рдХреЛ рдХреБрд░реВрдк рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдЧреЛ рдХреЛрдб рдХреА рд▓рдЧрднрдЧ 100K рд▓рд╛рдЗрдиреЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдЬреИрд╕реА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ

// Allow mulitple types in Slices and Maps declarations
func Reverse(s []<int,string>) {
    first := 0
    last := len(s) - 1
    for first < last {
        s[first], s[last] = s[last], s[first]
        first++
        last--
    }
}

//  Allow multiple types in variable declarations
func Index (s <string, []byte>, b byte) int {
    for i := 0; i < len(s); i++ {
        if s[i] == b {
            return i
        }
    }
    return -1
}

// Allow slices and maps declarations with interface values
func ToStrings (s []Stringer) []string {
    r := make([]string, len(s))
    for i, v := range s {
        r[i] = v.String()
    }
    return r
}

рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВрдЧреЗред

рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдорд┐рдд рдЧреЛ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡

package graph

// Example how you would define generics completely separat from Go 1 code
contract (Node, Edge)G {
    Node Edges() []Edge
    Edge Nodes() (from, to Node)
}

type (type Node, Edge G) ( Graph )
func (type Node, Edge G) ( New )
const _ = (Node, Edge) Graph

// Unmodified Go 1 code
type Graph struct { ... }
func New(nodes []Node) *Graph { ... }
func (g *Graph) ShortestPath(from, to Node) []Edge { ... }

@martinrode рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдЬреИрд╕реА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ
... рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

рдпрд╣ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рддреНрдордХ-рдИрд╢ рдЬреЗрдиреЗрд░рд┐рдХ рд╕реНрд▓рд╛рдЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ head() , tail() , map(slice, func) , filter(slice, func)

рдЖрдк рдмрд╕ рдпрд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рд╕рдордп рдХреЙрдкреА рдкреЗрд╕реНрдЯ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдмрд╛рд╕реА рд╣реЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред

(рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрддрд░ рдкрд░ рдпрд╣ рдЬрд╛рдирдирд╛ рднреА рдердХрд╛рдК рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рднрд╛рд╖рд╛ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдл рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ)

рд╡рд░реНрддрдорд╛рди, рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдореЗрд░реЗ рдкрд╛рд╕ x рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЪрд░ рд╣реИ $ externallib.Foo , рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдкреНрд░рд╛рдкреНрдд externallib рдореИрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ред
рдореИрдВ рдЗрд╕реЗ SomeFunc(fmt.Stringer) рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди externallib.Foo рдореЗрдВ рдХреЛрдИ String() string рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдмрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ:

type MyFoo externallib.Foo
func (mf MyFoo) String() string {...}
// ...
SomeFunc(MyFoo(x))

рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВред

рдореЗрд░реЗ рдкрд╛рд╕ x рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЪрд░ рд╣реИ $ []externallib.Foo ред рдореИрдВ рдЗрд╕реЗ AnotherFunc(type T Stringer)(s []T) рдкрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рд╕реНрд▓рд╛рдЗрд╕ рдХреА рдПрдХ рдирдИ []MyFoo рдореЗрдВ рдорд╣рдВрдЧреА рдЧрд╣рд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ, рдПрдХ рдЪрд╛рди рдпрд╛ рдирдХреНрд╢рд╛) рдерд╛, рдпрд╛ рд╡рд┐рдзрд┐ рдиреЗ рд░рд┐рд╕реАрд╡рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рдФрд░ рднреА рдЕрдХреНрд╖рдо рдФрд░ рдердХрд╛рдК рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛред

рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рднреАрддрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдХреЛрдИ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рд╡рд┐рд▓рд╛рд╕рд┐рддрд╛ рд╣реИ рд╡рд╕реНрддреБрддрдГ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ []Foo([]Bar{}) рдХреЛ Foo рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рд╕реА рднреА $ type Foo Bar , рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдФрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирдХреНрд╢реЗ, рд╕рд░рдгрд┐рдпреЛрдВ, рдЪреИрдирд▓реЛрдВ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдЖрд░рд╛рдо рджреЗрдирд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЗ рд╕рднреА рд╕рд╕реНрддреА рдЙрдерд▓реА рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВред рд░рд┐рд▓реИрдХреНрд╕реНрдб рдЯрд╛рдЗрдк рдХрдиреНрд╡рд░реНрдЬрди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдзрд┐рдХ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдгред


рдЗрд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ https://github.com/golang/go/issues/15292#issuecomment -546313279 рдореЗрдВ рд╕реЗрдХреЗрдВрдбрд░реА рдлреАрдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

@JavierZunzunegui рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╣рд╛рдВ, рдЖрдк рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрд▓рдЧ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╣рд╛рдВ рдирд╣реАрдВред https://golang.org/doc/faq#convert_slice_with_same_underlying_type рднреА рджреЗрдЦреЗрдВред рдзрдиреНрдпрд╡рд╛рджред

рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ []Foo рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдкрд╡рд╛рдж рд╡реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЯрд░реНрди рд╣реИ, рдЬреИрд╕реЗ sort.Interface , рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг ( func AnotherFunc(type T Stringer)(s []T) ) рд╣реИ

type SliceOfStringers interface {
  Len() int
  Get(int) fmt.Stringer
}
func AnotherFunc(s SliceOfStringers) {...}

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЙрдкреА рдХрд┐рдП рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ fmt.Stringer рд╣реЛред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЦрдбрд╝рд╛ рд╣реИ, рдЬреЗрдиреЗрд░рд┐рдХ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдЙрдкрдХрд░рдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрджрд┐ рд╣рдо рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдПрдкреАрдЖрдИ рдореЗрдВ рд╕реНрд▓рд╛рдЗрд╕, рдорд╛рдирдЪрд┐рддреНрд░ рдЖрджрд┐ рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдирд╛ рдФрд░ рдХрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдареАрдХ рд╣реИред рдлрд┐рд░ рднреА рд╡реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдХреЗрд╡рд▓ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирдИ рд╕рдорд╕реНрдпрд╛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ _may_ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рднреА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдк рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдЕрдХреНрд╕рд░ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди рд╣реИред рдЖрдЗрдП рдХреГрдкрдпрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рд╣рд╛рд▓ рд╣реИ? рдХреЛрдИ рдЕрджреНрдпрддрди рдбреНрд░рд╛рдлреНрдЯ? рдореИрдВ рддрдм рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рд▓рдЧрднрдЧ 2 рд╕рд╛рд▓ рдкрд╣рд▓реЗред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЗрдирд░рд┐рдХ рдХрдм рд╣реЛрдЧрд╛?

рдПрд▓ рдорд╛рд░реНрдЪред, 4 рдбреЗ рдлрд░рд╡рд░реАред рдбреЗ 2020 рдП рд▓рд╛ (рдПрд╕) 13:28, рдЗрдпрд╛рди рд▓рд╛рдВрд╕ рдЯреЗрд▓рд░ (
рд╕реВрдЪрдирд╛рдПрдВ@github.com) рд╡рд┐рд╡рд░рдг:

рдЖрдк рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдЕрдХреНрд╕рд░ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
рдХрд┐ рдпрд╣ рдПрдХ рдПрдлрдПрдХреНрдпреВ рд╣реИред рдЖрдЗрдП рдХреГрдкрдпрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдзрдиреНрдпрд╡рд╛рджред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292?email_source=notifications&email_token=AJMFNBN3MFHDMENAFXIKBLDRBGXUTA5CNFSM4CA35RX2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVX82HJ9477рдЗрд╢реНрдпреВ
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AJMFNBO5UTKNPL3MSA3NESLRBGXUTANCNFSM4CA35RXQ
.

--
рдЯреНрд░рд┐рдкрд▓рдорд┐рдВрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЗрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ

рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреБрдЫ рдЪреАрдЬреЗрдВ рдореЗ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХрд╛рдо рдСрдлрд▓рд╛рдЗрди рд╣реЛ рдЧрдпрд╛ рд╣реИ? рдореИрдВ рдЗрд╕реЗ рд╕рдордп рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреЗ рд╣реБрдП рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐ рдореЗрд░реЗ рдЬреИрд╕реЗ "рдЖрдо рдЬрдирддрд╛" рд╢реЛрд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, #36177 рджреЗрдЦреЗрдВ рдЬрд╣рд╛рдВ @Griesemer рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рдХрд╣рдиреЗ рдореЗрдВ рд╕рд╣реА рд╣реВрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдорд╕реМрджрд╛ 'рдЕрдиреБрдмрдВрдз' рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдкрд╣рд▓реБрдУрдВ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред

@ianlancetaylor рдХрд┐рд╕реА рднреА рд╕рдордп рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рддреНрдпрд╛рдЧ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрд╛рд╖рд╛ рдХреЛ рд╕рд░рд▓ рд░рдЦрдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдпрд╣ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЖрджрд░реНрд╢ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ _рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред

рдЬрдм рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ _рдиреЙрдЯ рд╕рд┐рдВрдкрд▓ рдЯреВ рдПрдХреНрд╕рдкреНрд░реЗрд╕_ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рд╕реЗ рд╕реАрдорд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░ рдЙрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╢рд╛рдкрд┐рдд _рдХрдард┐рди рд╕реЗ рд╡реНрдпрдХреНрдд_ рд╡рд┐рдЪрд╛рд░ рдХрднреА-рдХрднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдЬрд┐рдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╕реНрддрд┐рдпреЛ, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕, рдСрдкрд░реЗрдЯрд░-рдПрд╕рдбреАрдХреЗ, рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЯреЗрд░рд╛рдлреЙрд░реНрдо, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдкреНрд░реЛрдЯреЛрдмрдл рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рджреЗрдЦреЗрдВред рд╡реЗ рд╕рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдпрд╛ рдЗрдирдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

@omeid

рдЗрд╕реНрддрд┐рдпреЛ, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЛ рджреЗрдЦреЗрдВ

рдХреНрдпрд╛ рдЖрдкрдХреЗ рд╕рд╛рде рдХрднреА рдРрд╕рд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рд╡реЗ рдпрд╣ рдмреЗрддреБрдХрд╛ рд╕рд╛рдорд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдореВрд▓ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП reflect рдЦреЗрд▓реЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдирд╛ рдкрдбрд╝рд╛ рд╣реИред ?

рдореИрдВ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЧреЛрд▓рд╛рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдбрд┐рдЬрд╛рдЗрди (рдбрд┐рдЬрд╛рдЗрди рдЪрд░рдг рдФрд░ рдПрдкреАрдЖрдИ рджреЛрдиреЛрдВ рдореЗрдВ) _require_ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВ рд╣реИрдВред

рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рди рдЬреЛрдбрд╝реЗрдВред

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрдард┐рди рд╣реИред рдХреНрдпреВрдмрд▓реЗрдЯ рдПрдХ рдЕрдВрдзреЗрд░реА рдЬрдЧрд╣ рд╣реИред рдЕрдореЗрд░рд┐рдХреА рд░рд╛рдЬрдиреАрддрд┐ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд╛рдВрдЯрддреЗ рд╣реИрдВред рдореИрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

рдЬрдм рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рд╕реЗ рд╕реАрдорд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░ рдЙрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рдмрд╣реБрдд рдХрдард┐рди рд╣реИрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХрднреА-рдХрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╕реНрддрд┐рдпреЛ, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕, рдСрдкрд░реЗрдЯрд░-рдПрд╕рдбреАрдХреЗ, рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЯреЗрд░рд╛рдлреЙрд░реНрдо, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдкреНрд░реЛрдЯреЛрдмрдл рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рджреЗрдЦреЗрдВред рд╡реЗ рд╕рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдпрд╛ рдЗрдирдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░реЗрд░рдХ рддрд░реНрдХ рд╣реИред рдЧреЛ рднрд╛рд╖рд╛ рдХреЛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ, рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ: рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдЯреВрд▓ рдХреЛ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЧреЛ рдЙрдиреНрд╣реЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред

рдЧреЛ рднрд╛рд╖рд╛ рдХреЛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ, рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрдИ рд▓рдХреНрд╖реНрдп рд╣реИрдВ, рд╡реЗ рдХрднреА-рдХрднреА рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рддрдирд╛рд╡ рдореЗрдВ рд╣реЛрдВрдЧреЗред рдХреЛрдб рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢реИрд▓реА рдореЗрдВ "рдЪрд╛рд╣рддрд╛ рд╣реИ" рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЕрдХреНрд╕рд░ рдЙрд╕рд╕реЗ рдХрдо рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдиреНрдпрдерд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЙрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЬреИрд╕реА рддрдХрдиреАрдХреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдкрдбрд╝реЗред

рдХреЛрдб рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢реИрд▓реА рдореЗрдВ "рдЪрд╛рд╣рддрд╛ рд╣реИ" рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЕрдХреНрд╕рд░ рдЙрд╕рд╕реЗ рдХрдо рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдиреНрдпрдерд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЙрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЬреИрд╕реА рддрдХрдиреАрдХреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдкрдбрд╝реЗред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдХреНрдпреЛрдВ рд╣реИ (https://blog.golang.org/why-generics)ред

рджреЗрдЦреЛ ... рдкреНрд░реЛрдЯреЛрдмрдл рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреАред рд╡реЗ рд╕рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдпрд╛ рдЗрдирдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░реЛрдЯреЛрдмрдл рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдРрд╕реЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЬреЗрдиреЗрд░рд┐рдХ рдПрдкреАрдЖрдИ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░/рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрд░реНрдХ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреЛ рдЬреЗрдиреЗрд░рд┐рдХ рд╕реЗ рд▓рд╛рдн рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред рдЬреЗрдирд░рд┐рдХ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЬреНрдЮрд╛рдд рд╣реЛрддреА рд╣реИред рдкреНрд░реЛрдЯреЛрдмрдл рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╣реА рдЬрд╛рдиреА рдЬрд╛рддреА рд╣реИ ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИред

@dsnet рджрд┐рд▓рдЪрд╕реНрдк рдзрдиреНрдпрд╡рд╛рдж, рдкреНрд░реЛрдЯреЛрдмрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрднреА рднреА рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкрд╛рд▓рди рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред рд╣рдореЗрд╢рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЧреЛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдХрд░рдг, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХ, рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд░реНрддрдорд╛рди рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд┐рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдпрд╛ рдПрдХ рдирдП рдЧреЛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ?

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЯреВрд▓ рдХреЛ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЧреЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред

рдЧреЛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдпрдж рд╣реА рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдПрдб-рд╣реЙрдХ рдмреИрдВрдб-рд╕рд╣рд╛рдпрддрд╛ рд╣реИ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдХрдо рд╕реЗ рдХрдо рдорд╛рдирдХ рдПрд╕реНрдЯ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдордирдорд╛рдирд╛ рдЧреЛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреЗрддрд╛ рд╣реИ рд╢рд╛рдпрдж рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕рдХреА рд╕реАрдорд╛рдПрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░рдирд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрдм рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреА JSON рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЖрджрд┐рдо рд╣реИ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд░реВрдк рдореЗрдВред

рдпрд╣ рддрд░реНрдХ рджреЗрдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ _рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдЯрд┐рд▓_ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдпрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдЖрджрд░реНрд╢ рдкрд░ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ:

рдХрд┐рд╕реА рднреА рд╕рдордп ~ рдЬреЗрдирд░рд┐рдХ ~ рдХреБрдЫ-рдЬрдЯрд┐рд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рддреНрдпрд╛рдЧ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗ рдЙрдирдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдП рд╣реИрдВ, рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рддреЛ рдЙрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЧреЛ рдореЗрдВ рдЙрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдФрд░ рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреЛрдмрдл рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирдпрд╛ рдПрдкреАрдЖрдИ _рдЬреЗрдиреЗрд░рд┐рдХ_, рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ _sum рдЯрд╛рдЗрдк_ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрд╕ рдирдП рдкреНрд░реЛрдЯреЛрдмрдл рдПрдкреАрдЖрдИ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдЕрднреА рдХрд╣рд╛ "рддрд░реНрдХ рдХрд╛ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдЬреЗрдирд░рд┐рдХ рд╕реЗ рд▓рд╛рдн рдирд╣реАрдВ рдЙрдард╛рдПрдЧрд╛", рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ "рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирдпрд╛ рдПрдкреАрдЖрдИ рдЫрд▓рд╛рдВрдЧ рдФрд░ рд╕реАрдорд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╕рд░рд▓"ред рдпрд╣ рдХрд┐рд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рд╕рдмреВрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛?

рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реБрдП рдЬрд┐рд╕рдиреЗ рдХреБрдЫ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдмрдл рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ (рдЬрд╛рд╡рд╛, рд╕реА ++) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЧреЛ рдПрдкреАрдЖрдИ рдФрд░ рдЙрдирдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЕрдВрддрд░ рджреЗрдЦрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рджрд╛рд╡рд╛ рд╕рддреНрдп рдерд╛, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рдЕрдВрддрд░ рд╣реЛрдЧрд╛ред

@dsnet рдиреЗ рдпрд╣ рднреА рдХрд╣рд╛ "рдРрд╕реЗ рдХреБрдЫ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЬреЗрдиреЗрд░рд┐рдХ рдПрдкреАрдЖрдИ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдФрд░/рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ"ред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рддреЛ Value рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдПрдХ рдПрдб-рд╣реЙрдХ рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рд╣реИред

@omeid рдпрд╣ рдореБрджреНрджрд╛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВред рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рд╣реИ: рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░реЛрдЯреЛрдмрдл рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╛ рдПрдкреАрдЖрдИ рдореЗрдВ рдХреИрд╕реЗ рд╣реЛрдЧрд╛ рдЬреЛ рдирдП (рдпрд╛ рдкреБрд░рд╛рдиреЗ, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП) рдПрдкреАрдЖрдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдЫрд▓рд╛рдВрдЧ рдФрд░ рд╕реАрдорд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд░рд▓" рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ @dsnet рдиреЗ рдЬреЛ рдХрд╣рд╛ рд╣реИ, рдЙрд╕рдХреЗ рдкрдврд╝рдиреЗ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рди рд╣реА рдЬрд╛рд╡рд╛ рдФрд░ рд╕реА ++ рдкреНрд░реЛрдЯреЛрдмрдл рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рдеред

рд╕рд╛рде рд╣реА, рдЧреЛ рдореЗрдВ рдЖрджрд┐рдо JSON рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рднреА рдореБрдЭреЗ рдЙрддрдиреА рд╣реА рдЕрдЬреАрдм рд▓рдЧрддреА рд╣реИред рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ encoding/json рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рдЬреЗрдирд░рд┐рдХ рджреНрд╡рд╛рд░рд╛ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛?

AFAIK, рдЬрд╛рд╡рд╛ рдореЗрдВ JSON рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рддрд┐рдмрд┐рдВрдм (рдЬреЗрдиреЗрд░рд┐рдХ рдирд╣реАрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ JSON рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп API рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ (рдЬреИрд╕реЗ Gson ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдПрдХ рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ T рд▓реЗрддреА рд╣реИ рдФрд░ T рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддреА рд╣реИ json.Unmarshal рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХрдорд╛рддреНрд░ рддреНрд░реБрдЯрд┐ рдЬреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ json.Unmarshal рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдкрдХрдбрд╝реА рдЧрдИ рдПрдХрдорд╛рддреНрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддреНрд░реБрдЯрд┐ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рдЧреИрд░-рд╕реВрдЪрдХ рдорд╛рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЗрдиреЗрд░рд┐рдХ рдмрдирд╛рдо рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд╕рди рдХреЗ рдПрдкреАрдЖрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдиреЛрдЯ рдХрд░реЗрдВред рдлрд┐рд░, рдпрд╣ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдиреЗ рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ; рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдХреНрд░рдордмрджреНрдз/deserializing рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реИ рдкреНрд░рдХрд╛рд░)ред

(рд╕реА ++ рдореЗрдВ рдЬреЗрдПрд╕рдУрдПрди рд╕рдорд░реНрдерди AFAICT рдмрджрддрд░ рд╣реИ; рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╛ рддреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕/рдХреНрд░рдордмрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рдпрд╣ рдирд╣реАрдВ рд╣реИ)

рдпрджрд┐ рдЖрдк рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЬреЗрдПрд╕рдУрдПрди рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдмрд╣реБрдд рдХреБрдЫ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рддреЛ рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдЖрдк рдирд┐рд░рд╛рд╢ рд╣реЛрдВрдЧреЗред


@gertcuykens рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЯреЛрдмрдл рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд┐рд╕реЗ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рдХреЛрдб-рдЬрдирд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрдирдХреЗ рдкрд╛рд╕ рдЬреЗрдиреЗрд░рд┐рдХ рд╣реЛрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдореЗрдВ рдЬрд╛рд╡рд╛, рд╕реА ++, рд╕реНрд╡рд┐рдлреНрдЯ, рд░рд╕реНрдЯ, рдЬреЗрдПрд╕ (рдФрд░ рдЯреАрдПрд╕) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рд╣реЛрдиреЗ рд╕реЗ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдХреЛрдб-рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рд╡рд╛ рдХреЛрдб рдФрд░ рд╕реА ++ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ); рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЕрддрд╛рд░реНрдХрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдЙрд╕ рдмрд╛рд░ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред


рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП: рдореИрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдЧреЛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирдЬрд░ рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░реЛрдЯреЛрдмрдл рдпрд╛ рдЬреЗрдПрд╕рдУрдПрди рдПрдкреАрдЖрдИ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкреНрд░реЛрдЯреЛрдмрдл рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реИред рдЖрдкрдХреЛ рд▓рдХреНрд╖рд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реАрдзреЗ рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдиреНрдп рд╕рдорд╛рди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдЬреИрд╕реЗ рд╕реНрд╡реИрдЧрд░/рдУрдкрдирдПрдкреАрдЖрдИ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред

рдЬрд╣рд╛рдВ рдЬреЗрдирд░рд┐рдХ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рд░рд▓реАрдХрд░рдг рдФрд░ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд╛ рджреЛрдиреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░реЛрдЯреЛрдмрдл рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╣реА рд╣реЛрдЧрд╛ред

рдЖрдкрдХреЛ рдЬрд┐рд╕ рдЪреАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд╡рд╣ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрдбрд╝ рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдореЗрд░реЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЬреЗрдирд░рд┐рдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдлрд┐рд░ рдЖрдк рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░реЛрдЯреЛрдмрдл рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрд╣рд╛рдВ рдЬреЗрдирд░рд┐рдХ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рд░рд▓реАрдХрд░рдг рдФрд░ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд╛ рджреЛрдиреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░реЛрдЯреЛрдмрдл рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╣реА рд╣реЛрдЧрд╛ред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗред go/ast рдкреИрдХреЗрдЬ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ рдХреЗ рдПрдПрд╕рдЯреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЧреЛ рдкреНрд░реЛрдЯреЛрдмрдл рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдзрд┐рдХ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛред

рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдмрдл рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ?

@neild рдореИрдВрдиреЗ рдпрд╣ рдХрд╣рдХрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкреНрд░реЛрдЯреЛрдмрдл рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдерд╛ред рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдмрд╣реБрдд рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рдВрддреБрд▓рд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рддрдирд╛ рджрдЦрд▓рдВрджрд╛рдЬреА рд╣реИред рдПрдХ рдЖрджрд░реНрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдкрдХреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рд╣рдЯ рдЬрд╛рдПрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рдн рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред

рдЧреЛ/рдПрд╕реНрдЯ рдкреИрдХреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЗрд╕рдореЗрдВ рдПрдПрд╕рдЯреА рдХрд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░рд┐рдХ рдФрд░ рдЬреАрдПрдбреАрдЯреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ 'рдРрдб' рдиреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЧреИрд░-рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрд╛рдВрдЪ рддрд░реНрдХ рдХреЛ рд╣рд╛рде рд╕реЗ рдХреЛрдбрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕реЗ рдмреЛрдЭрд┐рд▓ рдмрдирд╛ рджреЗрдЧрд╛ред

рдПрдХ рдЕрдЪреНрдЫреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдЯрд╛рдЗрдк рд╕реЗрдл рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЖрдк рдЗрд╕реЗ рдПрдорд┐рдЯрд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд┐рдд рдЯрд╛рдЗрдк рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ (рдпрд╣ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкрдХреНрд╖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ): https://stackoverflow.com/questions/11104536/how-to-parse-strings-to-syntax-tree-using-gadts

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдо рдЯреАрдПрд╕рдПрдХреНрд╕ рдореЗрдВ рдПрдЪрдЯреАрдПрдордПрд▓ рдбреЛрдо рдХреЗ рд▓рд┐рдП рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдбреЛрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВред

рд╣рдо рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЬреЗрдиреЗрд░рд┐рдХ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд┐рдо рдХреЛрдб рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрддреЗ рд╣реИрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЪреЗрдХ рдЯрд╛рдЗрдк рдХрд░реЗрдВ (рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ)ред

рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдореБрдЦ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рдБрдЪ рдХреЗрд╡рд▓ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХреЛрдб рдкрд░ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЖрдк рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЪреЗрдХрд┐рдВрдЧ рд╕реАрдзреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рди рдХрд┐ рдПрдорд┐рдЯреЗрдб рдХреЛрдб рдкрд░, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рд╕рд╣реА рдХрд░рдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЧрд╛рдпрдм рд╣реИрдВ, рдЬреЛ рдЬреЗрдирд░рд┐рдХ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рднрд╛рд░реА рдХрдореА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдПрдХ рдРрдб-рдСрди рдбрд┐рдЬрд╝рд╛рдЗрди (рд╢рд╛рдпрдж) рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдмрдВрдз рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ:

contract Comparables(Ts...) {
    if  len(Ts) > 0 {
        Comparables(Ts[1:]...)
    } else {
        Comparable(Ts[0])
    }
}

contract Comparable(T) {
    T int, int8, int16, int32, int64,
        uint, uint8, uint16, uint32, uint64, uintptr,
        float32, float64,
        string
}

type Keys(type Ts ...Comparables) struct {
    fs ...Ts
}

type Metric(type Ts ...Comparables) struct {
    mu sync.Mutex
    m  map[Keys(Ts...)]int
}

func (m *Metric(Ts...)) Add(vs ...Ts) {
    m.mu.Lock()
    defer m.mu.Unlock()
    if m.m == nil {
        m.m = make(map[Keys(Ts...))]int)
    }
    m[Keys(Ts...){vs...}]++
}


// To use the metric

m := Metric(int, float64, string){m: make(map[Keys(int, float64, string)]int}
m.Add(1, 2.0, "variadic")

рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ interface{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдХрд┐рд╕реА рднреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЧреИрд░-рддреБрд▓рдиреАрдпреЛрдВ рдХреЛ рдореАрдЯреНрд░рд┐рдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ interface{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдХрд┐рд╕реА рднреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЧреИрд░-рддреБрд▓рдиреАрдпреЛрдВ рдХреЛ рдореАрдЯреНрд░рд┐рдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ Comparables рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Keys рдореЗрдВ рддреБрд▓рдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрд░реНрдеред

рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЯрдХрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЪреБрди рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЯрд╛рдЗрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди" рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╣реАрдЦрд╛рддрд╛ рдкрджреНрдзрддрд┐ рдХреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рдзрдХреЗрд▓рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЪрд▓рддреЗ рд╕рдордп рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЧреЛ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЦрд░рд╛рдм рдкреНрд░рдХрд╛рд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╛рде рд╣реА, рдореИрдВ рдереЛрдбрд╝рд╛ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЦреБрд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рджреВрд╕рд░реЗ рдХреНрд░рдо рддрд░реНрдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк C рдХреЛ рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ C рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ?

рд╕рд╛рде рд╣реА, рдореИрдВ рдереЛрдбрд╝рд╛ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЦреБрд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рджреВрд╕рд░реЗ рдХреНрд░рдо рддрд░реНрдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк C рдХреЛ рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ C рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдУрдкрди рдПрдВрдбреЗрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреЗ рд░рд╣рд╛ рд╣реИ рдФрд░ рд░рд╕реЗрд▓ рдХреЗ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, Comparables рдХреЛ Comparable рдХреА рд╕реВрдЪреА рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореБрдЭреЗ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЗ рдЕрдВрджрд░ рдЧреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдореИрдВ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдХреНрдпрд╛ рдореИрдВ for рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореИрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореИрдВ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ? рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рднреА рд▓рдЧрддрд╛ рд╣реИред func F(a ...int) рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ a []int рд╣реИред рд╕рд╛рджреГрд╢реНрдп рд╕реЗ, func F(type Ts ...comparable) рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ рдХрд┐ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ comparable рд╣реИред

рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ

type Keys(type Ts ...Comparables) struct {
    fs ...Ts
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк fs рдирд╛рдордХ рдПрдХрд╛рдзрд┐рдХ рдлрд╝реАрд▓реНрдб рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рддреЛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдХреЛрдИ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ?

рдпрд╣рд╛рдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд╝реАрд▓реНрдб рдХреА рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреЛрдИ рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛?

рдореБрдЭреЗ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЗ рдЕрдВрджрд░ рдЧреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдореИрдВ if рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдХреНрдпрд╛ рдореИрдВ for рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореИрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореИрдВ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ? рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рднреА рд▓рдЧрддрд╛ рд╣реИред func F(a ...int) рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ a []int рд╣реИред рд╕рд╛рджреГрд╢реНрдп рд╕реЗ, func F(type Ts ...comparable) рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ рдХрд┐ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ comparable рд╣реИред

рдПрдХ рджрд┐рди рдмрд╛рдж рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИрдВред Comparables рдПрдХ рдЧреВрдВрдЧрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП len(args) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдВрджреЗрд╢ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛, func F(type Ts ...Comparable) рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред

рдЫрдВрдЯрдиреА рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

contract Comparable(T) {
    T int, int8, int16, int32, int64,
        uint, uint8, uint16, uint32, uint64, uintptr,
        float32, float64,
        string
}

type Keys(type Ts ...Comparable) struct {
    fs ...Ts
}

type Metric(type Ts ...Comparable) struct {
    mu sync.Mutex
    m  map[Keys(Ts...)]int
}

func (m *Metric(Ts...)) Add(vs ...Ts) {
    m.mu.Lock()
    defer m.mu.Unlock()
    if m.m == nil {
        m.m = make(map[Keys(Ts...))]int)
    }
    m[Keys(Ts...){vs...}]++
}


// To use the metric

m := Metric(int, float64, string){m: make(map[Keys(int, float64, string)]int}
m.Add(1, 2.0, "variadic")

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк fs рдирд╛рдордХ рдПрдХрд╛рдзрд┐рдХ рдлрд╝реАрд▓реНрдб рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рддреЛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдХреЛрдИ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ?

рдпрд╣рд╛рдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд╝реАрд▓реНрдб рдХреА рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреЛрдИ рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛?

рдпрджрд┐ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП ... рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреБрдкрд▓реНрд╕ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдХреЗрд╡рд▓ рджреЛ рд╕реНрдерд╛рди рд╣реИрдВ рдЬреЛ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ: рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдХрд╛рд░реНрдп, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ:

func F(type Ts ...Comparable) (args ...Ts) {
    if len(args) > 1 {
        F(args[1:])
        return
    }
    // ... do stuff with args[0]
}

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, variadic Min рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди variadic рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИ:

func Min(type T ...Comparable)(p1 T, pn ...T) T {
    switch l := len(pn); {
    case l > 1:
        return Min(pn[0], pn[1:]...)
    case l == 1:
        if p1 >= pn[0] { return pn[0] }
        return p1
    case l < 1:
        return p1
    }
}

рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде Tuple рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

type Tuple(type Ts ...Comparable) struct {
    fs ...Ts
}

рдЬрдм рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ 'Ts' рджреНрд╡рд╛рд░рд╛ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

type Tuple(type T1, T2, T3 Comparable) struct {
    fs_1 T1
    fs_2 T2
    fs_3 T3
}

рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВред fs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:

  1. рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдирдкреИрдХ
k := Tuple(int, float64, string){1, 2.0, "variadic"}
fs1, fs2, fs3 := k.fs // translated to fs1, fs2, fs3 := k.fs_1, k.fs_2, k.fs_3
println(fs1) // 1
println(fs2) // 2.0
println(fs3) // variadic
  1. for рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
for idx, f := range k.fs {
    println(idx, ": ", f)
}
// Output:
// 0: 1
// 1: 2.0
// 2: variadic
  1. рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЛрдЧ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рд░рдгреА/рдЯреБрдХрдбрд╝рд╛ рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИ)
k.fs[0] = ... // translated to k.fs_1 = ...
f2 := k.fs[1] // translated to f2 := k.fs_2
  1. reflect рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд░рдгреА рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
t := Tuple(int, float64, string){1, 2.0, "variadic"}

fs := reflect.ValueOf(t).Elem().FieldByName("fs")
val := reflect.ValueOf(fs)
if val.Kind() == reflect.VariadicTypes {
    for i := 0; i < val.Len(); i++ {
        e := val.Index(i)
        switch e.Kind() {
        case reflect.Int:
            fmt.Printf("%v, ", e.Int())
        case reflect.Float64:
            fmt.Printf("%v, ", e.Float())
        case reflect.String:
            fmt.Printf("%v, ", e.String())
        }
    }
}

рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реИрд░рд┐рдПрдбрд┐рдХ рдорд┐рди рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд░рд┐рдПрдбрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИ:

func Min(type T ...Comparable)(p1 T, pn ...T) T {
    switch l := len(pn); {
    case l > 1:
        return Min(pn[0], pn[1:]...)
    case l == 1:
        if p1 >= pn[0] { return pn[0] }
        return p1
    case l < 1:
        return p1
    }
}

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╡реИрд░рд┐рдПрдбрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рддрднреА рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдЬрдм рдкреНрд░рдХрд╛рд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдореЗрдВ Min рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЧреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ >= рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рднрд▓реЗ рд╣реА рд╣рдордиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реЛ, рд╣рдорд╕реЗ Min(int, string)(1, "a") рдорд╛рдВрдЧрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛ рдХреЗ Min рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдХреА рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛ рдкрд░ Min рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ Min рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИред

func Min(type T comparable)(s ...T) T {
    if len(s) == 0 {
        panic("Min of no elements")
    }
    r := s[0]
    for _, v := range s[1:] {
        if v < r {
            r = v
        }
    }
    return r
}

https://github.com/golang/go/issues/15292#issuecomment -599040081 рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЧреЛ рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдРрд╕реЗ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рддрддреНрд╡ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдпрд╛ рд╕рд░рдгреА рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛ рдХреЗ Min рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдХреА рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛ рдкрд░ Min рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ Min рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рд╣реИред

func Min(type T comparable)(s ...T) T {
    if len(s) == 0 {
        panic("Min of no elements")
    }
    r := s[0]
    for _, v := range s[1:] {
        if v < r {
            r = v
        }
    }
    return r
}

рд╕рддреНрдпред Min рдПрдХ рдмреБрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдерд╛ред рдЗрд╕реЗ рджреЗрд░ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЯрд┐рдкреНрдкрдгреА рд╕рдВрдкрд╛рджрд┐рдд рдЗрддрд┐рд╣рд╛рд╕ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг Metric рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЧреЛ рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдРрд╕реЗ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рддрддреНрд╡ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдпрд╛ рд╕рд░рдгреА рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред

рджреЗрдЦреЛ? рдЖрдк рд╡реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рд░рдгреА/рдЯреБрдХрдбрд╝рд╛ рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ https://github.com/golang/go/issues/15292#issuecomment -599040081 рдореЗрдВ рдХрд╣рд╛ рдерд╛, рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд░рдгреА/рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдореИрдк рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ? рдпрд╛ рдХреЛрдИ рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИ? рдЧреЛ 1 рдореЗрдВ рдХреНрдпрд╛ рд╕рдВрднрд╡ рд╣реИ:

m := map[interface{}]int{1: 2, "2": 3, 3.0: 4}
for i, e := range m {
    println(i, e)
}

рдХреНрдпрд╛ i рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ i interface{} рд╣реИ, рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИ? рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВред for , [] рдФрд░ рдЕрдирдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреНрдпрд╛ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреНрдпрд╛ рддрд░реНрдХ рд╣реИрдВ? fs рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди:

for idx, f := range k.fs {
    switch f.(type) { // compare to interface{}, here is zero overhead.
    case int:
        // ...
    case float64:
        // ...
    case string:
        // ...
    }
}

рдпрджрд┐ рдЖрдкрдХреЛ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдХрд▓рди рддрдХрдиреАрдХ рдХреЗ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрднрд╡рддрдГ interface{} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ред рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рдореИрдВ Metric рдЙрджрд╛рд╣рд░рдг рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореИрдВ рдЕрднреА рддрдХ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд┐рдз рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ Metric рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Metric2 рдФрд░ Metric3 рд▓рд┐рдЦреВрдВрдЧрд╛ред

"рднрд╛рд╖рд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рдирд╛" рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреНрдпрд╛ рд╣реИ? рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдПрдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬ рд╣реИ, рдФрд░ рдпрд╣ рдЧреЛ 1 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрд╛рд╖рд╛ рдХреЛ рдХрднреА рднреА рд╕рд░рд▓ рдирд╣реАрдВ рдмрдирд╛рдПрдЧреАред рдЖрдкрдиреЗ рдЗрд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ: "рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ" рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреНрдпрд╛ рд╣реИ рд▓рд┐рдЦрдирд╛...рдЬрд╛рдУ"? рдХреНрдпрд╛ рдЗрд╕реЗ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рддреНрд░рд╛рддреНрдордХ рдореАрдЯреНрд░рд┐рдХ рд╣реИ? рдПрдХ рднрд╛рд╖рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреИрд╕реЗ рддрд░реНрдХ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ? рдЧреЛ 2 рднрд╛рд╖рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ, рд▓рдХреНрд╖реНрдп рдЕрдкрдиреА рдкрд╣рд▓реА рдЫрд╛рдк рдореЗрдВ рдХрд╛рдлреА рд╕реАрдзреЗ рд╣реИрдВ:

  1. рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдВ,
  2. рд╣рд░ рдХрд┐рд╕реА рдкрд░ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░
  3. рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдУред

рд▓реЗрдХрд┐рди, рдкреНрд░рд╢реНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: "рдХрд┐рддрдиреЗ" рдХрд┐рддрдиреЗ рд╣реИрдВ? "рдорд╣рддреНрд╡рдкреВрд░реНрдг" рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЦрдбрд╝рд╛ рд╣реИ? рдЕрдЬреНрдЮрд╛рдд рдЖрдмрд╛рджреА рдкрд░ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХреИрд╕реЗ рдорд╛рдкреЗрдВ? рдЬрдм рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕рдордЭреА рдЬрд╛рддреА рд╣реИ? рдЧреЛ рдХреНрд▓рд╛рдЙрдб рдкрд░ рд╣рд╛рд╡реА рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдиреНрдпреВрдореЗрд░рд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ (рдЬреИрд╕реЗ, рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ), рдЧреНрд░рд╛рдлрд┐рдХрд▓ рд░реЗрдВрдбрд░рд┐рдВрдЧ (рдЬреИрд╕реЗ, рд╡рд┐рд╢рд╛рд▓ 3D рдорд╛рд░реНрдХреЗрдЯ) рдЬреИрд╕реЗ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рд╣рд╛рд╡реА рд╣реЛрдирд╛, рдЧреЛ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрди рдЬрд╛рдПрдЧрд╛? рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдЕрдзрд┐рдХ рдлрд┐рдЯ рдмреИрдарддреА рд╣реИ "рдореИрдВ рдЧреЛ рдореЗрдВ рдмреА рдХреЗ рдмрдЬрд╛рдп рдП рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдХреЛрдИ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдпрд╛ "рдмреА рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧреЛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпрд╛ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рднрд╛рд╖рд╛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА"? ... рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╡реЗ рдкреНрд░рд╢реНрди рджрд░реНрджрдирд╛рдХ рдФрд░ рдЕрдВрддрд╣реАрди рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рд▓рд╛рдпрдХ рднреА рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рд╡рд╛рдкрд╕ Metric рдЙрджрд╛рд╣рд░рдг рдкрд░, рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХреЛ рдЦреЛрд▓рдирд╛ рдпрд╣рд╛рдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдорд╛рдзрд╛рди рдЬреЛ рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде "рд╕рдВрдпреЛрдЧ" рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ [ ] рдЕрдиреБрдХреНрд░рдордг рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрдЯреМрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

f2 := k.fs[1] // f2 is a float64

@changkun рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╡рд╕реНрддреБрдирд┐рд╖реНрда рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЕрдЪреНрдЫреА рдФрд░ рдмреБрд░реА рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА - рд╣рдо рд╕рд┐рд░реНрдл рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЗрд╖реНрдЯрддрдо рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЬреЛ рднреА рд╣реИ, BTW, рдЗрд╕ рдмрд╛рдд рдкрд░ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рднрд╛рд╖рд╛ "рдЕрдЪреНрдЫреА" рд╣реИ рдпрд╛ рдирд╣реАрдВ - рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдЧреЛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рддрдп рдХрд░рддреА рд╣реИрдВ, рд╡реЗ рдЧреЛ рдЯреАрдо рдХреЗ рд▓реЛрдЧ рд╣реИрдВ рдФрд░ рдЬрд┐рди рдЪреАрдЬреЛрдВ рдХреЛ рдЖрдк рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдЖрдкрдХреЛ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рджреЛ рдкрд░ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдлрд╛рдпрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдИрдПрдордУ рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИред рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭреЗ рдЧрдП рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рд╕реЗ рдЕрдирдЬрд╛рди рд╣реВрдВред рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдореИрдВ рдЧрд▓рдд рд╣реВрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ - рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдХрд▓реНрдкрдирд╛ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

@Merovius Haskell рдореЗрдВ рдмрд╣реБрд╡рд┐рд╡рд┐рдз рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ HList рдкреЗрдкрд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ: http://okmij.org/ftp/Haskell/polyvariadic.html#polyvar -fn
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдкреНрд░реЗрд░рдХ рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдк рд╕реЗрдл рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рд╣реИ рдЬрд╣рд╛рдВ рдЯрд╛рдЗрдк рд╕реЗрдл рдЬреЙрдЗрди рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдХреЙрд▓рдо рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рд░рд┐рд▓реЗрд╢рдирд▓ рдЬреЙрдЗрди рдСрдкрд░реЗрд╢рди рджреЛ рдордирдорд╛рдиреА рд░рд┐рдХреЙрд░реНрдб рд▓реЗрддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд░рд┐рдХреЙрд░реНрдб рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╣рд╛рде рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИ, рдмрд╣реБрдд рдХрдард┐рди рд╣реИ, рд╕рднреА рд╣рд╛рде рд╕реЗ рдШреЛрд╖рд┐рдд рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдЕрд░реНрде рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдб-рд╣реЙрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдХреНрд╡реЗрд░реАрдЬрд╝, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░реА-рдмрд┐рд▓реНрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рддрдХ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЖрдк рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЖрдк рдХреМрди рд╕реА рдХреНрд╡реЗрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рддреЛ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдФрд░ рдЯреБрдкрд▓реНрд╕ рдкрд░ рдПрдХ рдЯрд╛рдЗрдк-рд╕реЗрдл рд░рд┐рд▓реЗрд╢рдирд▓ рдЬреЙрдЗрди рдСрдкрд░реЗрдЯрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ - рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рдореЗрдореЛрд░реА рдореЗрдВ рдЯреБрдкрд▓реНрд╕ рдХреЗ рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ, рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдмрд╛рд╣рд░реА DB рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП SQL рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдорд╛рд░реНрд╢рд▓ рдХрд░рддрд╛ рд╣реИ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рдкрд╕ред

LINQ рдХреЗ рд╕рд╛рде рд╕реА # рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ LINQ рдХреЛ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдореЛрдиреИрдб рдХреЛ рд╕реА # рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреЙрд▓реАрд╡реЗрд░реИрдбрд┐рдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЬреЙрдЗрди рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рд▓реЗрд╢рдирд▓ рдСрдкрд░реЗрдЯрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдмреВрд▓рд┐рдпрди, рдмрд╛рдЗрдирд░реА, рдЗрдВрдЯ, рдлреНрд▓реЛрдЯ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмреБрдирд┐рдпрд╛рджреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рдж, рд╕реЗрдЯ рд╢рд╛рдпрдж рдЖрдЧреЗ рдЖрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рдВрдмрдВрдзред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рд╕реА ++ рднреА рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдпрд╣ рддрд░реНрдХ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЧреЛ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ XXX рдореЗрдВ рдпрд╣ рд╣реИ :)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдпрджрд┐ k.fs[0] рдФрд░ k.fs[1] рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдВред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЕрдиреНрдп рдЗрдВрдбреЗрдХреНрд╕реЗрдмрд▓ рд╡реИрд▓реНрдпреВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред

рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг https://medium.com/@sameer_74231/go -experience-report-for-generics-google-metrics-api-b019d597aaa4 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЧреЛ рдореЗрдВ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдпрджрд┐ k.fs[0] рдФрд░ k.fs[1] рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдВред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЕрдиреНрдп рдЗрдВрдбреЗрдХреНрд╕реЗрдмрд▓ рд╡реИрд▓реНрдпреВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред

рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг https://medium.com/@sameer_74231/go -experience-report-for-generics-google-metrics-api-b019d597aaa4 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЧреЛ рдореЗрдВ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ред

рдХреБрдВрдЖред рдЖрдк рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк [``] рдирд╛рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рджреЛ рд╡рд┐рдХрд▓реНрдк рдмрдЪреЗ рд╣реИрдВ: ( ) рдпрд╛ {``} , рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрд╖реНрдардХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рд╡реИрд░рд┐рдПрдмрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдХреЛ рднреА args.0 args.1 рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреЛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рддреБрдЪреНрдЫ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ "рд╕реА ++ рдХрд╛ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд╡рд┐рдХрд╛рд╕" рдкреБрд╕реНрддрдХ рдкрдврд╝рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдХрд╛ рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реВрдВ, рдирд┐рд░реНрдгрдпреЛрдВ рдФрд░ рдкрд╛рдареЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ 1994 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛:

_"[...] рдкреВрд░реНрд╡-рдирд┐рд░реАрдХреНрд╖рдг рдореЗрдВ, рдореИрдВрдиреЗ рдкрдардиреАрдпрддрд╛ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХрд╛ред"_ ==> рдорд╣рд╛рди рдЕрдиреБрдмрдВрдз рдбрд┐рдЬрд╛рдЗрди

"_ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреАрд╡рд░реНрдб рдХреЗ рдмрд┐рдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ:_

T& index<class T>(vector<T>& v, int i) { /*...*/ }
int i = index(v1, 10);

_рдЗрд╕ рд╕рд░рд▓ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЪрд╛рд▓рд╛рдХ рд╣реИред рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ [...] <...> рдХреЛрд╖реНрдардХреЛрдВ рдХреЛ рдХреЛрд╖реНрдардХреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╡рд░реАрдпрддрд╛ рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рдерд╛ред [...] рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрддрд╛ рд╣реИ, рдЯреЙрдо рдкреЗрдиреЗрд▓реЛ рдиреЗ рд╕рд╛рдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдХреЛрд╖реНрдардХ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рд▓реЛрдХрди рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ (рдорд╛рдирд╡) рдкрд╛рдардХ <...> _ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред
"==> рдХреНрдпрд╛ рдпрд╣ func F(type T C)(v T) T рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ?

_ "рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдмрд╣реБрдд рд╕рддрд░реНрдХ рдФрд░ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдерд╛ред рдореИрдВ [...] рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреЛрдЭ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдорджрдж рдХреА рдЬрд╛рддреАред"_

рдпрд╣ рдЗрддрдирд╛ рдкрд░рд┐рдЪрд┐рдд рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ?

рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ (рдпрд╛ рдЯрдкрд▓) рдХреЛ рд░рдирдЯрд╛рдЗрдо рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдФрд░ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд┐рд░реНрдл рдпрд╣ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдХрдореА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди-рд╕рдордп рдЕрдиреБрдХреНрд░рдордг рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рдВрдХрд▓рди-рд╕рдордп рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдПрдХ рдЧреИрд░-рдкреНрд░рдХрд╛рд░ "рдЯреЗрдореНрдкрд▓реЗрдЯ" рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдЧрд╛рдпрдм рд╣реИред

рд╕рдмреВрдд рдХреЗ рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рд╕реНрддрд╛рд╡ (рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдЧреЛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд┐рдз рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ C++ рдХрд╛ Design and Evolution рдПрдХ рдЕрдЪреНрдЫреА рдХрд┐рддрд╛рдм рд╣реИ, рд▓реЗрдХрд┐рди C++ рдФрд░ Go рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдХреНрд╖реНрдп рд╣реИрдВред рдЕрдВрддрд┐рдо рдЙрджреНрдзрд░рдг рд╡рд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реИ; рд╕реНрдЯреНрд░рд╛рдЙрд╕реНрдЯреНрд░рдк рднрд╛рд╖рд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рд▓рд╛рдЧрдд рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рд╣рдо рд╣рдореЗрд╢рд╛ рдЙрд╕ рдХреАрдордд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЧреЛ рдХреЛ рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВ, рддреЛ рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рд╕реА ++ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред

рд╕рдмреВрдд рдХреЗ рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рд╕реНрддрд╛рд╡ (рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдЧреЛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд┐рдз рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рд╡рд┐рд╡рд┐рдз рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрднреА рднреА рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рд╕реА ++ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рд╕реВрдХреНрд╖реНрдо рд╣реИред рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдкрд╣рд▓реЗ рдЧреИрд░-рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рдж рдореЗрдВ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╡рд┐рд╡рд┐рдз рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдЬрдм рдореИрдВ рдкрд╣рд▓реЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗред рдореИрдВ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВред

рд╕реНрдЯреНрд░рд╛рдЙрд╕реНрдЯреНрд░рдк рднрд╛рд╖рд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рд▓рд╛рдЧрдд рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рд╣рдо рд╣рдореЗрд╢рд╛ рдЙрд╕ рдХреАрдордд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЧреЛ рдХреЛ рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣рд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВ, рддреЛ рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рд╕реА ++ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред

рд╕рдЪ рдирд╣реАрдВ рдЖрдИрдПрдордУред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ C++ рдкрд╣рд▓рд╛ рдкреНрд░реИрдХреНрдЯрд┐рд╢рдирд░ рд╣реИ рдЬреЛ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ (рд╡реЗрд▓ рдПрдордПрд▓ рдкрд╣рд▓реА рднрд╛рд╖рд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдкреБрд╕реНрддрдХ рд╕реЗ рдЬреЛ рдкрдврд╝рд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдореБрдЭреЗ рдпрд╣ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд╕реА ++ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рд╕рд╛рдзрд╛рд░рдг рднрд╛рд╖рд╛ рд╣реЛрдирд╛ рдерд╛ (рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ, рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ-рд╕рд░рд▓реАрдХреГрдд-рд╢рд┐рдк рд▓реВрдк, рд╡рд╣реА рдЗрддрд┐рд╣рд╛рд╕)ред рд╕реА ++ рдореЗрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рддрдХ рдлреАрдЪрд░ рдлреНрд░реАрдЬ рдЪрд░рдг рднреА рдерд╛ рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рдж рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдкреНрд░реЙрдорд┐рд╕" рдЧреЛ рдореЗрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХрдИ рдЙрдЪрд┐рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕рдордп рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬреЗрдирд┐рдХреНрд╕ рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реА ++ рдХреЗ рдкреБрд░рд╛рдиреЗ рдкрде рдХреЛ рдкрдХрдбрд╝рдиреЗ рдкрд░ рдЧреЛ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рдж рдореЗрдВ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╡рд┐рд╡рд┐рдз рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдореБрдЭреЗ рд╡рд╣реА рдЕрд╣рд╕рд╛рд╕ред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдкрд╣рд▓реЗ рдорд╛рдирдХреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЬреЗрдирд░рд┐рдХ рднреА рдЧрд╛рдпрдм рд╣реИрдВред

рдореИрдВ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВред

рдореИрдВ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдЧреЛ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА "рдЕрдиреБрд╡рд╛рдж" рд╢рдмреНрдж рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдЬреЗрдирд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЬреЛ рдкрдврд╝рд╛ рд╣реИ, рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реА ++ рдХреЗ рд╢реБрд░реБрдЖрддреА рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреНрд░реЙрд╕реНрдЯреНрд░рдк рдХреЗ рд▓рд┐рдП рдЦреЗрдж рдХреЗ рд╕рд╛рде рд╕рдордЭреМрддрд╛ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░рддрд┐рд╡рд╛рджреЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред

рд╣рдореЗрдВ C++ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╕рд╣рдордд рд╣реЛрдирд╛ рдкрдбрд╝реЗрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рд▓рдХреНрд╖реНрдп рдЕрдзрд┐рдХ рд╕рдорд╛рди рдереЗ, рд▓реЗрдХрд┐рди рдЖрдЬ C++ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рд▓рдХреНрд╖реНрдп Go рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо 25 рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдРрд╕рд╛ рд╣реА рд╣реИред

рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдХрд┐ рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП (рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕реА ++ рдиреЗ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛)ред рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рд╕реНрдЯреНрд░реЙрд╕реНрдЯреНрд░реБрдк рдХреЛ рдХреНрдпрд╛ рдкрдЫрддрд╛рд╡рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЖрдП, рддреЛ, рдмрдврд╝рд┐рдпрд╛ред рдореЗрд░реА рд╕реЛрдЪ рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдПрдбрд╛ рдпрд╛ рдбреА рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╣реИрдВ, рдЬреИрд╕реЗ рд╡реЗ рд╕реА ++ рдХреА рддрд░рд╣ рд╣реИрдВред рдЖрдЬ рднреА, C++ рдореЗрдВ рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╡реЗ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рд╣реИред рд╕рд╛рде рд╣реА, рд╕реА ++ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬрдЯрд┐рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рд╕реНрд╡рдпрдВ рдЯреНрдпреВрд░рд┐рдВрдЧ рдкреВрд░реНрдг рднрд╛рд╖рд╛ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рдерд╛)ред рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдорд╛рдирд╛ рд╣реИ рдХрд┐ рдЧреЛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЬрдЯрд┐рд▓рддрд╛ рдЪрд░рдо рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реА ++ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рдХрд╛рд░рдг рдЧреЛ рдореЗрдВ рд╣реЛрдЧрд╛, рдЬреЛ рдЧреЛ рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ)ред

рд▓рдЧрднрдЧ рдПрдХ рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рдЕрдиреБрдмрдВрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдереЛрдбрд╝рд╛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореМрдЬреВрджрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрддрд┐ рдХреНрдпрд╛ рд╣реИред рдЙрди рд╕рднреА рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func Append(type T)(slice []T, elems ...T) []T {...}
func Copy(type T)(dst, src []T) int {...}
func Delete(type K, V)(m map[K]V, k K) {...}
func Make(type T, I Integer(I))(siz ...I) T {...}
func New(type T)() *T {...}
func Close(type T)(c chan<- T) {...}
func Panic(type T)(v T) {...}
func Recover(type T)() T {...}
func Print(type ...T)(args ...T) {...}
func Println(type ...T)(args ...T) {...}

рдХреНрдпрд╛ рд╡реЗ Go2 рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рдПрдВрдЧреЗ? рдЧреЛ 2 рдореМрдЬреВрджрд╛ рдЧреЛ 1 рдХреЛрдбрдмреЗрд╕ рдкрд░ рдЗрддрдиреЗ рдмрдбрд╝реЗ рдкреНрд░рднрд╛рд╡ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реИ? рдпреЗ рдЦреБрд▓реЗ рдкреНрд░рд╢реНрди рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреЗ рджреЛрдиреЛрдВ рдереЛрдбрд╝реЗ рдЦрд╛рд╕ рд╣реИрдВ:

func Len(type T C)(t T) int {...}
func Cap(type T C)(t T) int {...}

рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдмрдВрдз C рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдЯреБрдХрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ []Ts , рдирдХреНрд╢рд╛ map[Tk]Tv , рдФрд░ рдЪреИрдирд▓ chan Tc рдЬрд╣рд╛рдВ T Ts Tk Tv Tc рдЕрд▓рдЧ рд╣реИрдВ?

@changkun рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рдЙрдиреНрд╣реЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ" рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдПрдХ рдареЛрд╕ рдХрд╛рд░рдг рд╣реИред рдФрд░ рдЖрдк рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдордЬрдмреВрдд рдХрд╛рд░рдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рд╣реЛрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдмрд╛рдХреА рдкреНрд░рд╢реНрди рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

@changkun рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рдЙрдиреНрд╣реЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ" рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдПрдХ рдареЛрд╕ рдХрд╛рд░рдг рд╣реИред рдФрд░ рдЖрдк рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдордЬрдмреВрдд рдХрд╛рд░рдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рдВ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рдпрд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рд░рдЦрдиреЗ рд╕реЗ рдЧреЛ рдХреЗ рдореМрдЬреВрджрд╛ рджрд░реНрд╢рди рдХрд╛ "рдЙрд▓реНрд▓рдВрдШрди" рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИрдВред рд╕рдВрдЧрддрддрд╛ рд╢реАрд░реНрд╖ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрдмрдВрдз рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╡рд┐рд╢рд╛рд▓ рд╡рд░реНрддрдорд╛рди "рдЖрдЙрдЯ рдбреЗрдЯреЗрдб" рдХреЛрдб рдХреЛ рдорд╛рд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рд╣реЛрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдмрд╛рдХреА рдкреНрд░рд╢реНрди рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЖрдЗрдП рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рдЕрдирджреЗрдЦрд╛ рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╡рд┐рд╢реНрд╡ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВред рдпрджрд┐ рдХреЛрдИ рд╕рдорд╛рди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдо рдореМрдЬреВрджрд╛ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд╣реАрдВ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ delete , close , panic , recover , print , рдФрд░ println рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИред

https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-contracts.md#append рдкрд░ Append рдФрд░ Copy рдХреЗ рдЖрдВрд╢рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред рдпрд╣ рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ append рдФрд░ copy рдореЗрдВ string рдкреНрд░рдХрд╛рд░ рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП Make рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред New рдмрд┐рд▓реНрдХреБрд▓ new #$ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рдХрд╛рдлреА рдХрд░реАрдм рд╣реИред

рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдорд╕реМрджреЗ рдХреЗ рд╕рд╛рде Len рдФрд░ Cap рдХреЛ interface{} рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рди-рд╕рдордп-рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

https://go-review.googlesource.com/c/go/+/187317

рдХреГрдкрдпрд╛ .go2 рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд╕реНрдХрд░рдг рдЪреАрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ? рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЕрдВрдд рдореЗрдВ go.mod go рдмрд┐рдирд╛ рдХрд┐рд╕реА .go2 рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЭрдЯрдХрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдЬрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХреЗ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдВред .go2 рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╣рдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдирд╣реАрдВ, рдореБрдЭреЗ рдЖрдкрдХреА рдореЙрдбреНрдпреВрд▓ рд╕рд╛рдордЧреНрд░реА рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдореЗрд░рд╛ 10 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рдкреНрд░реА рдореЙрдбреНрдпреВрд▓ рдбрд╛рдпрдирд╛рд╕реЛрд░ go рдХрдВрдкрд╛рдЗрд▓рд░ рдЯреВрдЯ рдЬрд╛рдП .

@gertcuykens .go2 рдлрд╝рд╛рдЗрд▓реЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИрдВ; рдЬрдм рдЬреЗрдирд░рд┐рдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдЙрддрд░реЗрдЧрд╛ рддреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

(рдореИрдВ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИред)

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВрдиреЗ K рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЦреЛрдЬрд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ K рдиреЗ рдЧреЛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдХрд░рдг рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдЧреЛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

identifier<T> рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдмрд┐рдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред

рд╕реНрдХрд╛рд▓рд╛ рдХреЗ identifier[T] рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд▓реБрдХ рдФрд░ рдлреАрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рд╕рдВрдШрд░реНрд╖ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди identifier[index] рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╡рд┐рд░реЛрдз рд╣реИред
рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, Scala рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ identifier(index) рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЙрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ [] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред

рдЧреЛ рдХреЗ рдорд╕реМрджреЗ рдореЗрдВ, рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ (type T) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрдШрд░реНрд╖ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдиреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ type рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдХреЛ рдЕрднреА рднреА рдЕрдзрд┐рдХ рдирд┐рд░реНрдгрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ identifier(type)(params) рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

рд╕рдВрдпреЛрдЧ рд╕реЗ, рдореБрдЭреЗ рдУрд╕реА рдореЗрдВ рд╡рд┐рдзрд┐ рдЖрд╣реНрд╡рд╛рди рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдЬрд╛рдЗрди рдпрд╛рдж рдЖрдпрд╛, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рдирдП рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рджреАред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреЛ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ [] рдореЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрддреЗ рд╣реИрдВ?
рд╣рдо [identifier T] рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рддрддреНрд╡ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдВред
рдЬрдм рдХрдИ рдЬреЗрдирд░рд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рддрд░рд╣ [identifier T V] рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдореМрдЬреВрджрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдЧреЛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

type [Item T] struct {
┬а┬а┬а┬аValue T
}

func (it [Item T]) Print() {
┬а┬а┬а┬аprintln(it.Value)
}

func [TestGenerics T V]() {
┬а┬а┬а┬аvar a = [Item T]{}
┬а┬а┬а┬аa.Print()
┬а┬а┬а┬аvar b = [Item V]{}
┬а┬а┬а┬аb.Print()
}

func main() {
┬а┬а┬а┬а[TestGenerics int string]()
}

рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрддрд╛ рд╣реИред

[] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдЧреЛ рдХреЗ рдореВрд▓ рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдореИрдк рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реЗ рдХреБрдЫ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рд╡рд┐рдЦрдВрдбрди рдХреА рднрд╛рд╡рдирд╛ рдкреИрджрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

[]int  ->  [slice int]

map[string]int  ->  [map string int]

рд╣рдо рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

var a map[int][]map[string]map[string][]string

var b [map int [slice [map string [map string [slice string]]]]]

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рдкреНрд░рднрд╛рд╡ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рд╕рдВрдХрд▓рди рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ K рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рд╣реИ рдФрд░ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВрдиреЗ K рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЦреЛрдЬрд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ K рдиреЗ рдЧреЛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдХрд░рдг рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдЧреЛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

identifier<T> рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдмрд┐рдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред

рд╕реНрдХрд╛рд▓рд╛ рдХреЗ identifier[T] рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд▓реБрдХ рдФрд░ рдлреАрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рд╕рдВрдШрд░реНрд╖ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди identifier[index] рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╡рд┐рд░реЛрдз рд╣реИред
рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, Scala рдХреЗ рдЗрдВрдбреЗрдХреНрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ identifier(index) рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЙрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ [] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред

рдЧреЛ рдХреЗ рдорд╕реМрджреЗ рдореЗрдВ, рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ (type T) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрдШрд░реНрд╖ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдиреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ type рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдХреЛ рдЕрднреА рднреА рдЕрдзрд┐рдХ рдирд┐рд░реНрдгрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ identifier(type)(params) рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

рд╕рдВрдпреЛрдЧ рд╕реЗ, рдореБрдЭреЗ рдУрд╕реА рдореЗрдВ рд╡рд┐рдзрд┐ рдЖрд╣реНрд╡рд╛рди рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдЬрд╛рдЗрди рдпрд╛рдж рдЖрдпрд╛, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рдирдП рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рджреАред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреЛ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ [] рдореЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрддреЗ рд╣реИрдВ?
рд╣рдо [identifier T] рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рддрддреНрд╡ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдВред
рдЬрдм рдХрдИ рдЬреЗрдирд░рд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рддрд░рд╣ [identifier T V] рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдореМрдЬреВрджрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдЧреЛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

type [Item T] struct {
┬а┬а┬а┬аValue T
}

func (it [Item T]) Print() {
┬а┬а┬а┬аprintln(it.Value)
}

func [TestGenerics T V]() {
┬а┬а┬а┬аvar a = [Item T]{}
┬а┬а┬а┬аa.Print()
┬а┬а┬а┬аvar b = [Item V]{}
┬а┬а┬а┬аb.Print()
}

func main() {
┬а┬а┬а┬а[TestGenerics int string]()
}

рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрддрд╛ рд╣реИред

[] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдЧреЛ рдХреЗ рдореВрд▓ рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдореИрдк рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реЗ рдХреБрдЫ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рд╡рд┐рдЦрдВрдбрди рдХреА рднрд╛рд╡рдирд╛ рдкреИрджрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

[]int  ->  [slice int]

map[string]int  ->  [map string int]

рд╣рдо рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

var a map[int][]map[string]map[string][]string

var b [map int [slice [map string [map string [slice string]]]]]

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рдкреНрд░рднрд╛рд╡ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рд╕рдВрдХрд▓рди рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ K рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рд╣реИ рдФрд░ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдорд╣рд╛рди

рдХреБрдЫ рдЖрдЧреЗ-рдкреАрдЫреЗ рдФрд░ рдХрдИ рд░реА-рд░реАрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЧреЛ рдореЗрдВ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдХрд╛ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕рдореЗрдВ рдЧрдП рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЬрдмрдХрд┐ рджрд╛рдпрд░рд╛, рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреНрд░реЗрдбрдСрдлрд╝ рдзреНрд╡рдирд┐ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдУрд╡рд░рд╣рд╛рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд┐рдЦреА:

рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ рд╣реИрдВ:

  • рдЕрдиреБрдмрдВрдз рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдореЗрдердб рдХреЙрд▓/рдЯрд╛рдЗрдк-рдПрд╕реНрд╕рд░реНрдЯ рд╕рд┐рдВрдЯреЗрдХреНрд╕
  • "рдЦрд╛рд▓реА рдЕрдиреБрдмрдВрдз"
  • рдЧреИрд░-рдкреИрд░реЗрдВрдереЗрдЯрд┐рдХрд▓ рдбрд┐рд▓реАрдореАрдЯрд░

рдирд┐рдмрдВрдз рдХреЛ рдкреВрд░реНрд╡-рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдкрд░, рдореИрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдХреБрдЫ рдЯреБрдХрдбрд╝реЗ рджреВрдВрдЧрд╛, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдмрдВрдз рдбрд┐рдЬрд╛рдЗрди рдорд╕реМрджреЗ рдореЗрдВ рдирдореВрдиреЛрдВ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдП рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реАрдорд╛рдВрдХрдХ рдХрд╛ F┬лT┬╗ рд░реВрдк рдирд┐рджрд░реНрд╢реА рд╣реИ, рдирд┐рд░реНрджреЗрд╢рд╛рддреНрдордХ рдирд╣реАрдВ; рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд░рд╛рдЗрдЯрдЕрдк рджреЗрдЦреЗрдВред

type List┬лtype Element contract{}┬╗ struct {
    next *List┬лElement┬╗
    val  Element
}

рддрдерд╛

contract viaStrings┬лTo, From┬╗ {
    To.Set(string)
    From.String() string
}

func SetViaStrings┬лtype To, From viaStrings┬╗(s []From) []To {
    r := make([]To, len(s))
    for i, v := range s {
        r[i].Set(v.String())
    }
    return r
}

рддрдерд╛

func Keys┬лtype K comparable, V contract{}┬╗(m map[K]V) []K {
    r := make([]K, 0, len(m))
    for k := range m {
        r = append(r, k)
    }
    return r
}

k := maps.Keys(map[int]int{1:2, 2:4})

рддрдерд╛

contract Numeric┬лT┬╗ {
    T.(int, int8, int16, int32, int64,
        uint, uint8, uint16, uint32, uint64, uintptr,
        float32, float64,
        complex64, complex128)
}

func DotProduct┬лtype T Numeric┬╗(s1, s2 []T) T {
    if len(s1) != len(s2) {
        panic("DotProduct: slices of unequal length")
    }
    var r T
    for i := range s1 {
        r += s1[i] * s2[i]
    }
    return r
}

рд╣реБрдб рдХреЗ рддрд╣рдд рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрд▓реЗ рдмрд┐рдирд╛, рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред рдореИрдВ рдЗрд╕ рдлреЙрд░реНрдо рдХреЛ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрдврд╝рд╛рдиреЗ рдореЗрдВ рднреА рдЕрдзрд┐рдХ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЧреЛ рд╕реАрдЦ рд░рд╣рд╛ рд╣реИ (рдпрджреНрдпрдкрд┐ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рджреЗрд░ рд╕реЗ)ред

@ianlancetaylor https://github.com/golang/go/issues/36533#issuecomment -579484523 рдкрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрдВ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдЬреЗрдирд░рд┐рдХ рдлреАрдбрдмреИрдХ рдкреЗрдЬ рдкрд░ рднреА рд╕реВрдЪреАрдмрджреНрдз рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ (рдпрд╛рдиреА рдЧреЛ 2 рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдореАрдХреНрд╖рд╛ рд╕рдореВрд╣ ?) рдпрд╛ рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдПрдХрддреНрд░ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред

рдЕрдиреБрдмрдВрдз рдбрд┐рдЬрд╛рдЗрди рдорд╕реМрджреЗ рд╕реЗ:

рд╕рд┐рдВрдЯреИрдХреНрд╕ F<T> рдЬреИрд╕реЗ C++ рдФрд░ Java рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ?
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп, рдЬреИрд╕реЗ v := F<T> , < рджреЗрдЦрдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо < рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдпрд╛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рд╕рдорд╛рдзрд╛рди рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЕрд╕реАрдорд┐рдд рд▓реБрдХрд╣реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рдо рдЧреЛ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рд╡рд┐рд░реЛрдз рдореЗрдВ рдирд╣реАрдВ: рдЧреЛ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдВрдЧрд▓ рдмреНрд░реЗрд╕ рдбрд┐рд▓реАрдореАрдЯрд░реНрд╕

рдкрд╛рд░реНрд╕рд░ рдХреЗ рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ред рдпреБрдЧрд▓ рдирдореВрдиреЗ:

// Lifted from the design draft
func New<type K, V>(compare func(K, K) int) *Map<K, V> {
    return &Map{<K, V> compare: compare}
}

// ...

func (m *Map<K, V>) InOrder() *Iterator<K, V> {
    sender, receiver := chans.Ranger(<keyValue<K, V>>)
    var f func(*node<K, V>) bool
    f = func(n *node<K, V>) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue{<K, V> n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рддрд┐ рдЬрд╣рд╛рдВ < рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИред

@tooolbox рдЖрдкрдХреЗ рдХреЛрдг рдмреНрд░реИрдХреЗрдЯ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрдврд╝рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рдХрд┐ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЯрд╛рдЗрдк рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдг рдмреНрд░реИрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╣рдереМрдбрд╝рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдЧреЛ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рд▓рдХреНрд╖реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд╛рдл рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд┐рдЯ рд╣реЛред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд░реНрд▓реА рдмреНрд░реИрдХреЗрдЯреНрд╕ рдХреЗ рдЕрдВрджрд░ рдореВрд╡рд┐рдВрдЧ рдПрдВрдЧрд▓ рдмреНрд░реИрдХреЗрдЯреНрд╕ рдЙрд╕ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рд╣рд╛рдВ, рдпрд╣ рдПрдХ рдорд╛рдореВрд▓реА рд╡рд┐рд╡рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рдорд╛рдореВрд▓реА рд╡рд┐рд╡рд░рдг рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рд░рд▓ рдФрд░ рд╕рд╣рдЬ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдорд╕реМрджреЗ рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рд▓реЛрдЧреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рдЯрд╛рдЗрдк рддрд░реНрдХ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдорд╛рдорд▓реЗ рдХрд┐рддрдиреЗ рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП [] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдпрд╣ рд╡рд░реНрддрдорд╛рди рдХреЛрд░ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рд╕рдореБрджрд╛рдп рдЗрд╕ рдкрд░ рд╡реЛрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЕрдзрд┐рдХ рдХреЛрд╖реНрдардХ рдЬреЛрдбрд╝рдиреЗ рдкрд░ _anything_ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рдмрдВрдж рдХрд░рдиреЗ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпреЛрдЧреНрдп рдорддрджрд╛рддрд╛рдУрдВ рдХреЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рд╕рдореВрд╣ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдард┐рди (рд╢рд╛рдпрдж рдЕрд╕рдВрднрд╡) рдХреЗ рд╕рд╛рдеред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЧреЛ рдбрд┐рдЬрд╝рд╛рдЗрдирд░ рдФрд░ рд╕рдореБрджрд╛рдп рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдорд╛рдзрд╛рди рдкрд░ рдПрдХ рд╕рд╛рде рдЖрдПрдВрдЧреЗ рдФрд░
рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрд╛рддрдЪреАрдд рдореЗрдВ рдХреБрдЫ рднреА рддреМрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реБрдИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рдирд╛ рдерд╛ рдХрд┐ рдореИрдВ рдХрд┐рддрдиреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╕рдиреНрди рдерд╛
рдПрдл ┬лрдЯреА┬╗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рд╕реБрдЭрд╛рд╡ред

(рдЕрдиреНрдп рдпреВрдирд┐рдХреЛрдб рдХреЛрд╖реНрдардХ:
https://unicode-search.net/unicode-namesearch.pl?term=BRACKETред)

рдЪреАрдпрд░реНрд╕,

  • рдмреАрдУрдмреА

рд╢реБрдХреНрд░, 1 рдордИ, 2020 рдХреЛ рд╢рд╛рдо 7:43 рдмрдЬреЗ рдореИрдЯ рдореИрдХ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдХреБрдЫ рдЖрдЧреЗ-рдкреАрдЫреЗ рдФрд░ рдХрдИ рд░реА-рд░реАрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ
рдЧреЛ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдорд╕реМрджрд╛ред рдореИрдВ рд╕рдордп рдХреА рдорд╛рддреНрд░рд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ
рдФрд░ рдкреНрд░рдпрд╛рд╕ рдЬреЛ рдЗрд╕рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдЬрдмрдХрд┐ рджрд╛рдпрд░реЗ, рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ,
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреНрд░реЗрдбрдСрдлрд╝ рдзреНрд╡рдирд┐ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐
рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдУрд╡рд░рд╣рд╛рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд┐рдЦреА:

  • рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рдУрд░: Go . рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░рд┐рд╡рд░реНрддрди
    https://gist.github.com/tooolbox/6bde6925a1a8c78cb593b2c11e977b07

рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ рд╣реИрдВ:

  • рдЕрдиреБрдмрдВрдз рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдореЗрдердб рдХреЙрд▓/рдЯрд╛рдЗрдк-рдПрд╕реНрд╕рд░реНрдЯ рд╕рд┐рдВрдЯреЗрдХреНрд╕
  • "рдЦрд╛рд▓реА рдЕрдиреБрдмрдВрдз"
  • рдЧреИрд░-рдкреИрд░реЗрдВрдереЗрдЯрд┐рдХрд▓ рдбрд┐рд▓реАрдореАрдЯрд░

рдирд┐рдмрдВрдз рдХреЛ рдкреВрд░реНрд╡-рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдкрд░, рдореИрдВ рдЕрд╕рдорд░реНрдерд┐рдд рдХреЗ рдХреБрдЫ рдЕрдВрд╢ рджреВрдВрдЧрд╛
рд╡рд╛рдХреНрдп рд░рдЪрдирд╛, рдореМрдЬреВрджрд╛ рдЕрдиреБрдмрдВрдз рдбрд┐рдЬрд╛рдЗрди рдорд╕реМрджреЗ рдореЗрдВ рдирдореВрдиреЛрдВ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рддред рдзреНрдпрд╛рди рджреЗрдВ
рдХрд┐ рд╕реАрдорд╛рдВрдХрдХ рдХрд╛ F┬лT┬╗ рд░реВрдк рдирд┐рджрд░реНрд╢реА рд╣реИ, рдирд┐рд░реНрджреЗрд╢рд╛рддреНрдордХ рдирд╣реАрдВ; рджреЗрдЦреЛ
рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрдиред

рдЯрд╛рдЗрдк рд▓рд┐рд╕реНрдЯ┬л рдЯрд╛рдЗрдк рдПрд▓рд┐рдореЗрдВрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ{}┬╗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ {
рдЕрдЧрд▓рд╛ *рд╕реВрдЪреА┬лрддрддреНрд╡┬╗
рд╡реИрд▓ рдПрд▓рд┐рдореЗрдВрдЯ
}

рддрдерд╛

рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдмрдВрдз┬лрд╕реЗ, рд╕реЗ┬╗ {
To.рд╕реЗрдЯ (рд╕реНрдЯреНрд░рд┐рдВрдЧ)
From.String () рд╕реНрдЯреНрд░рд┐рдВрдЧ
}
func SetViaStrings┬лрдЯрд╛рдЗрдк рдЯреВ, рдлреНрд░реЙрдо рд╡рд╛рдпрд╛рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕┬╗(s [] From) []To {
r := make([]To, len(s))
i рдХреЗ рд▓рд┐рдП, v := рд╢реНрд░реЗрдгреА s {
рдЖрд░ [i]ред рд╕реЗрдЯ (v.String ())
}
рд╡рд╛рдкрд╕реА r
}

рддрдерд╛

func Keys┬л рдЯрд╛рдЗрдк K рддреБрд▓рдиреАрдп, V рдЕрдиреБрдмрдВрдз{}┬╗(m map[K]V) []K {
рдЖрд░: = рдмрдирд╛рдирд╛ ([] рдХреЗ, 0, рд▓реЗрди (рдПрдо))
рдХрд╢реНрдореАрд░ рдХреЗ рд▓рд┐рдП: = рд░реЗрдВрдЬ рдПрдо {
рдЖрд░ = рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ (рдЖрд░, рдХреЗ)
}
рд╡рд╛рдкрд╕реА r
}
k := map.Keys(map[int]int{1:2, 2:4})

рддрдерд╛

рдЕрдиреБрдмрдВрдз рд╕рдВрдЦреНрдпрд╛рддреНрдордХ┬лрдЯреА┬╗ {
рдЯреАред (int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64, uintptr,
рдлреНрд▓реЛрдЯ 32, рдлреНрд▓реЛрдЯ 64,
рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕64, рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕128)
}
func рдбреЙрдЯ рдЙрддреНрдкрд╛рдж┬лрдЯрд╛рдЗрдк рдЯреА рдиреНрдпреВрдореЗрд░рд┐рдХ┬╗(рдПрд╕1, рдПрд╕2 []рдЯреА) рдЯреА {
рдЕрдЧрд░ рд▓реЗрди (рдПрд╕ 1)! = рд▓реЗрди (рдПрд╕ 2) {
рдкреИрдирд┐рдХ ("рдбреЙрдЯрдкреНрд░реЛрдбрдХреНрдЯ: рдЕрд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рдХреЗ рд╕реНрд▓рд╛рдЗрд╕")
}
рд╡рд░ рдЖрд░ рдЯреА
рдореИрдВ рдХреЗ рд▓рд┐рдП: = рд╢реНрд░реЗрдгреА s1 {
r += s1[i] * s2[i]
}
рд╡рд╛рдкрд╕реА r
}

рд╣реБрдб рдХреЗ рддрд╣рдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛, рдпрд╣ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИ
рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдкрдардиреАрдпред рдореБрдЭреЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИ
рдЗрд╕ рдлреЙрд░реНрдо рдХреЛ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрдврд╝рд╛рдирд╛ рдЬреЛ рд╕реАрдЦ рд░рд╣рд╛ рд╣реИ рдЧреЛ (рдпрджреНрдпрдкрд┐ рджреЗрд░ рд╕реЗ
рдкрд╛рдареНрдпрдХреНрд░рдо)ред

@ianlancetaylor https://github.com/ianlancetaylor рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░
#36533 рдкрд░ (рдЯрд┐рдкреНрдкрдгреА)
https://github.com/golang/go/issues/36533#issuecomment-579484523 рдореИрдВ рд╣реВрдВ
рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ред рдпрд╣ рднреА рд╕реВрдЪреАрдмрджреНрдз рд╣реИ
рдЬреЗрдирд░рд┐рдХ рдлреАрдбрдмреИрдХ рдкреЗрдЬ рдкрд░
https://github.com/golang/go/wiki/Go2GenericsFeedback ред рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рдЕрдЧрд░ рдореИрдВ
рдЗрд╕реЗ "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдорд╛рдирд╛" рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд рдЧреЛ 2
рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдореАрдХреНрд╖рд╛ рд╕рдореВрд╣ https://github.com/golang/go/issues/33892 ?) рдпрд╛ if
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдПрдХрддреНрд░ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292#issuecomment-622657596 , рдпрд╛
рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд
https://github.com/notifications/unsubscribe-auth/AACQ2NJRBNLDGY2XGCCQCLRPOCEHANCNFSM4CA35RXQ
.

рд╣рдо рд╕рднреА рдЧреЛ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдкреИрджрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рд╢реЗрд╖ рдЧреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдЗрд╕рд▓рд┐рдП рд░рд╣реЗ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рд╡реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рдереЗ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рддрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рдордЫрд▓рд┐рдпрд╛рдБ рдереАрдВред рдЕрдм рддрдХ рд╡реЗ (рдХреЛрд╖реНрдардХ) рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЯрд┐рдХреЗ рд╣реБрдП рд╣реИрдВред

рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдВрдХреЗрддрди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрддрддрд╛ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ (рдкрд╛рд░реНрд╕рд░ рдХреЛ рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рднреА рдирд┐рдХрд╛рдп рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЖрд╕рд╛рдиреА рд╕реЗ gofmt рдХреЗ рд╕рд╛рде)ред

@ianlancetaylor рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рддреБрдо рд╕рд╣реА рд╣реЛ; рд╡рд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ "рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ" рдФрд░ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрд╛ рд╡рд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдореНрдореАрджрд╡рд╛рд░ рдерд╛, рдлрд┐рд░ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ред

рдпрджрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, (рдпрд╣ рдЬрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ) рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд┐рдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ? рдпрд╣реАрдВ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реБрдЦ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрдкрд░реНрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХ рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рднреА рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣реЛрдЧрд╛ред

рдХрд▓ рд░рд╛рдд, рд╕рдВрдпреЛрдЧ рд╕реЗ, рдореИрдВ рдбреА рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реИ:

template Square(T) {
    T Square(T t) {
        return t * t;
    }
}

writefln("The square of %s is %s", 3, Square!(int)(3));

template TCopy(T) {
    void copy(out T to, T from) {
        to = from;
    }
}

int i;
TCopy!(int).copy(i, 3);

рджреЛ рдкреНрд░рдореБрдЦ рдЕрдВрддрд░ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

  1. рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рддрддреНрдХрд╛рд▓ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ ! рд╣реИред
  2. рдЙрдирдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╢реИрд▓реА (рдХреЛрдИ рдПрдХрд╛рдзрд┐рдХ рд╡рд╛рдкрд╕реА рдорд╛рди рдирд╣реАрдВ, рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рд╡рд┐рдзрд┐рдпрд╛рдВ) рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрдо рдХреЛрд╖реНрдардХ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╛рди рджреГрд╢реНрдп рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред

рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдСрдкрд░реЗрдЯрд░

рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рд╛рдердорд┐рдХ рджреГрд╢реНрдп рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдПрдХ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг, рдпрд╛...?) рдХреЗ рдмреАрдЪ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдХреНрдпреЛрдВ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рддрддреНрдХрд╛рд▓ рд╕рдВрдХрд▓рди-рд╕рдордп рд╣реИрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд░рди-рдЯрд╛рдЗрдо рд╣реИрдВред рдЧреЛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рджреГрд╢реНрдп рд╕реБрд░рд╛рдЧ рд╣реИрдВ рдЬреЛ рдПрдХ рдкрд╛рдардХ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЦрдВрдб рдХрд┐рд╕ рд╢рд┐рд╡рд┐рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЗрдиреНрд╣реЗрдВ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рд╡рд╛рд╣ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрджрд╛рд╣рд░рдг:

// Instantiation with unexported types and then function call,
// or chained method call?
a := draw(square, ellipse)(canvas, color)

рдкреНрд░рд╕реНрддрд╛рд╡: рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрддреНрдХрд╛рд▓ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред ! рдЬреЛ D рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред рдХреБрдЫ рдирдореВрдирд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕:

// Lifted from the design draft
func New(type K, V)(compare func(K, K) int) *Map!(K, V) {
    return &Map!(K, V){compare: compare}
}

// ...

func (m *Map(K, V)) InOrder() *Iterator!(K, V) {
    sender, receiver := chans.Ranger!(keyValue!(K, V))()
    var f func(*node!(K, V)) bool
    f = func(n *node!(K, V)) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue!(K, V){n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдФрд░ рдкрд╛рд░реНрд╕рд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЦреБрдж рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдкрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдШреЛрд╖рдгрд╛ рд╢реИрд▓реА

рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп, "рд░рди-рдЯрд╛рдЗрдо рдпрд╛ рд╕рдВрдХрд▓рди-рд╕рдордп" рдХрдо рд╣реЛрддрд╛ рд╣реИ? рдореБрд╕реАрдмрддред рдПрдХ рдЧреЛрдлрд░ type рдпрд╛ func рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдПрдХ рд░реЗрдЦрд╛ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдПрдХ рдШреЛрд╖рдгрд╛ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рджреГрд╢реНрдп рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдПрдБ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИрдВ:

// Type-parameterized function,
// or function with multiple return values?
func Draw(cvs canvas, t tool)(canvas, tool) {
    // ...
}
func Draw(type canvas, tool)(cvs canvas, t tool) {
    // ...
}

// Type-parameterized struct, or function call?
func Set(elem constructible) rect {
    // ...
}
type Set(type Elem comparable) struct{
    // ...
}

// Method call, or type-parameterized function?
func Map(type Element)(s []Element, f func(Element) Element) (results []Element) {
    // ...
}
func (t Element) Map(s []Element, f func(Element) Element) (results []Element) {
    // ...
}

рд╡рд┐рдЪрд╛рд░:

  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдореБрджреНрджреЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
  • рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реАрдорд╛рдВрдХрдХ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
  • рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдпрд╛ рдЪрд░рд┐рддреНрд░ рдХреЛ рд╡рд╣рд╛рдВ рд░рдЦрдирд╛ ( ! рдЦреЛ рд╕рдХрддрд╛ рд╣реИ, # рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?) рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: @griesemer рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдзрдиреНрдпрд╡рд╛рджред рдмрд╕ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдкреНрд░рд╢реНрди рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП: рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ рдХрд┐ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдпрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ? рдпрд╣ рдЕрд╣рдо рд╕рд╡рд╛рд▓ рдХреНрдпреЛрдВ рд╣реИ?

@tooolbox

// Instantiation with unexported types and then function call,
// or chained method call?
a := draw(square, ellipse)(canvas, color)

рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рдорд╛рдпрдиреЗ рд░рдЦреЗрдЧрд╛? рдПрдХ рдЖрдХрд╕реНрдорд┐рдХ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдерд╛ рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдмрд╛рдХреА рд╕рднреА рдХреЗ рд▓рд┐рдП, рд╡реЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЖрдкрдХреЗ рдмрд╛рдж рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЕрд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХреБрдЫ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ - рдФрд░ рдпрд╣ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рд╣реА рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдЖрдо рддреМрд░ рдкрд░ рдмрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛ рдмрд╣реБрдд рдкреНрд░рд╕рд┐рджреНрдз рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╢реЗрдб рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рди рдХрд┐ рдЙрд╕рдХреЗ рд░рдВрдЧ рдХрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ @tooolbox рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рдФрд░ рд░рди-рдЯрд╛рдЗрдо рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИред рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ? рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░ рд░рд╣реА рд╣реИ рдпрд╛ рдПрдХ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред рдпрд╛рдиреА a := draw(square, ellipse)(canvas, color) рдЬреИрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЖрд╕рдкрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдП рдмрд┐рдирд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЗрд╕рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░реАрди рдЙрджрд╛рд╣рд░рдг рд░рд╣рд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рджред рдмрд╕ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдкреНрд░рд╢реНрди рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП: рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ рдХрд┐ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдпрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ? рдпрд╣ рдЕрд╣рдо рд╕рд╡рд╛рд▓ рдХреНрдпреЛрдВ рд╣реИ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕рдВрдЪрд╛рд░ рдореЗрдВ рдЧрдбрд╝рдмрдбрд╝реА рдХреА рд╣реИред рдпрд╣ рд╡рд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛:

рдпрджрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рд╡рд╛рд╣ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ

(рдлрд┐рд▓рд╣рд╛рд▓, рдПрдХ рдХреЛ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╣реИрдВ...рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ, рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдирд╣реАрдВ, рдЬрд┐рд╕реЗ @infogulch рдиреЗ рдареАрдХ рд╣реА рдЙрдард╛рдпрд╛-рдзрдиреНрдпрд╡рд╛рдж!)


рдореИрдВрдиреЗ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд░рд╛рдп рджреЗрдЦреА рд╣реИ рдХрд┐ рдорд╕реМрджреЗ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХреА рддреБрд▓рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ: рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдХрд▓рди-рд╕рдордп рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ, рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

// Example from the Contracts draft
Print(int)([]int{1, 2, 3})

// New naming that communicates behavior and intent
MakePrintFunc(int)([]int{1, 2, 3}) // Chained function call, great!

рд╡рд╣рд╛рдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рдкрдардиреАрдп рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ Type рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдкреНрд░рддреНрдпрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд╛рдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдХреЙрд▓" рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) Pair(...) рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡рд╣ рд╕рдореНрдореЗрд▓рди рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: a := drawType(square, ellipse)(canvas, color)

(рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП "-рдПрд░" рд╕рдореНрдореЗрд▓рди рд╣реИред)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдХреИрд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ" рд╡рд░реНрддрдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдлрд┐рд░ рд╕реЗ, @infogulch рдиреЗ рдореЗрд░реА рдмрд╛рдд рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рджреГрд╖реНрдЯрд┐ рд╕реЗ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рд╣реВрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдХрд┐ рд╡реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рджреГрд╢реНрдп рднрд╛рдЧ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдФрд░ рдЖрдк рдХреИрд╕реЗ рдЖрдЧреЗ рдХреА рдУрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рдЪрд░рд┐рддреНрд░ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП ┬л┬╗ рдХреЛ рдореЗрд░рд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ (рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдХреАрдмреЛрд░реНрдб рдкрд░ рдирд╣реАрдВ рдкрд╛рдпрд╛!)

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЧреЛрд▓ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд╛рдж рдЧреЛрд▓ рдХреЛрд╖реНрдардХ рджреЗрдЦрдирд╛ рднреА рдмрд╣реБрдд рдЖрдХрд░реНрд╖рдХ рдирд╣реАрдВ рд╣реИред

рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓ рдХреИрд╕реЗ?

a := draw{square, ellipse}(canvas, color)

Print(int)([]int{1,2,3}) рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рдЕрдВрддрд░ "рд╕рдВрдХрд▓рди-рд╕рдордп рдмрдирд╛рдо рд░рди-рдЯрд╛рдЗрдо" рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рд╣рд╛рдВ, MakePrintFunc рдХреЗ рдмрдЬрд╛рдп Print рдЗрд╕ рд╕рдорд╛рдирддрд╛ рдкрд░ рдЕрдзрд┐рдХ рдЬреЛрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди... рдХреНрдпрд╛ рдпрд╣ рддрд░реНрдХ MakePrintFunc рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдВрддрд░ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдпрджрд┐ рдХреБрдЫ рднреА рдЖрдк рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ Print(int) рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди) рд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд░рд╛рдмрд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ Pair(int, string) рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ - рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИред Print(int) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡реИрдз рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬреЛ func -рдореВрд▓реНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреА рд╣реИ, рдЬрдмрдХрд┐ Pair(int, string) рдорд╛рдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░-рдХрд▓реНрдкрдирд╛ рд╣реИред рддреЛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрддрд░ "рдЬреЗрдиреЗрд░рд┐рдХ рдмрдирд╛рдо рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕" рдирд╣реАрдВ рд╣реИ, рдпрд╣ "рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрдирд╛рдо рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░" рд╣реИред рдФрд░ рдЙрд╕ рдкреАрдУрд╡реА рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдорд╛рдорд▓рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рдХреГрддрд┐ рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ - рдФрд░ рд╢рд╛рдпрдж рд╣рдореЗрдВ <> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП () рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпреЗ рдлрд╝рдВрдХреНрд╢рди-рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ-рдкреНрд░рдХрд╛рд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП () рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реВрдВ рдФрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд╕рдВрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн рдкрд░, рдореИрдВ рдХрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреЗ рд▓рд╛рдн рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреВрдВрдЧрд╛ - рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдореЗрдВ рд╢реБрджреНрдз рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред .

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ @tooolbox рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рдФрд░ рд░рди-рдЯрд╛рдЗрдо рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИред рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ? рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░ рд░рд╣реА рд╣реИ рдпрд╛ рдПрдХ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред рдпрд╛рдиреА a := draw(square, ellipse)(canvas, color) рдЬреИрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЖрд╕рдкрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдП рдмрд┐рдирд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЗрд╕рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░реАрди рдЙрджрд╛рд╣рд░рдг рд░рд╣рд╛ рд╣реИред

рдЯрд╛рдЗрдк рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдХреАрд╡рд░реНрдб type рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рджреГрд╢реНрдп рднрд╛рдЧ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЪрд╛рд╣реЗ рд╡рд╣ рдХрд┐рд╕реА рднреА рд░рдВрдЧ рдХрд╛ рд╣реЛред рдЧреЛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рд╣реА рд░рд╣рд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрд╕ рдорд╛рдирдХ рд╕реЗ рдиреАрдЪреЗ рдЙрддрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓ рдХреИрд╕реЗ?

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИред

Print(int)([]int{1,2,3}) рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рдЕрдВрддрд░ "рд╕рдВрдХрд▓рди-рд╕рдордп рдмрдирд╛рдо рд░рди-рдЯрд╛рдЗрдо" рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рд╣рд╛рдВ, MakePrintFunc рдХреЗ рдмрдЬрд╛рдп Print рдЗрд╕ рд╕рдорд╛рдирддрд╛ рдкрд░ рдЕрдзрд┐рдХ рдЬреЛрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди... рдХреНрдпрд╛ рдпрд╣ рддрд░реНрдХ MakePrintFunc рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдВрддрд░ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдПрдХ рдХреЗ рд▓рд┐рдП, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ MakePrintFunc(int)([]int{1,2,3}) рд╕реЗ рдЕрдзрд┐рдХ MakePrintFunc(int)([]int{1,2,3}) Print!(int)([]int{1,2,3}) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреБрдЫ рдЕрдиреЛрдЦрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдлрд┐рд░, рд╕рд╡рд╛рд▓ рдЬреЛ @ianlancetaylor рдиреЗ рдкрд╣рд▓реЗ рдкреВрдЫрд╛ рдерд╛: рдпрд╣ рдХреНрдпреЛрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди/рдлрд╝рдВрдХреНрд╢рди-рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ-рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдХрд▓рди-рд╕рдордп рдмрдирд╛рдо рд░рди-рдЯрд╛рдЗрдо рд╣реИ?

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдпрджрд┐ рдЖрдкрдиреЗ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд▓рд┐рдЦреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рдХ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рддреЛ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реЛрдВрдЧреЗ! рдмрд▓реНрдХрд┐, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрдм рдореИрдВ Print(...) рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░реА рдкрд╣рд▓реА рд╡реГрддреНрддрд┐ "рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИ рдЬреЛ рдХрд╣реАрдВ рд▓рд┐рдЦрддреА рд╣реИ"ред рдпрд╣ рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ "рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓реМрдЯрд╛рдПрдЧрд╛"ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдЗрд░рд╛рджреЗ рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

  • MakePrintFunc(...)
  • Print!(...)
  • Print<...>

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХреЛрдб рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ "рд╕рдВрджрд░реНрдн" рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ "рдореБрдЭреЗ" рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдЯ рдХреЛрдб рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдпрджрд┐ рдХреБрдЫ рднреА рдЖрдк рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВред ...

рдирд╣реАрдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╡рдХрд╛рд▓рдд рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдЯреАрдо рдЬреЗрдирд░рд┐рдХ рдХреЛ рдЧреЛ рдореЗрдВ рддрдм рддрдХ рдЬреЛрдбрд╝реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдПрдХ рдПрдХреАрдХреГрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХреАрдХреГрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рди рд╣реЛрдВред

рдЬрдм рдореИрдВ Print(...) рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░реА рдкрд╣рд▓реА рд╡реГрддреНрддрд┐ "рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИ рдЬреЛ рдХрд╣реАрдВ рд▓рд┐рдЦрддреА рд╣реИ"ред рдпрд╣ рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ "рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓реМрдЯрд╛рдПрдЧрд╛"ред

рди рддреЛ func Print(тАж) func(тАж) , рдЬрдм Print(тАж) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд╛рдореВрд╣рд┐рдХ рд░реВрдк рд╕реЗ рдареАрдХ рд╣реИрдВред рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓-рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд┐рдирд╛, рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди func рд▓реМрдЯрд╛рддрд╛ рд╣реИред
Print(тАж) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЖрдкрдХреЛ рдмрд╣реБрдд рдХреБрдЫ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдЬ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ: рд╡рд╣ Print рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреБрдЫ рдорд╛рди рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Print(тАж) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрдЦреЗрдВред
рдпрд╛, рдЕрдзрд┐рдХ рд╢рд╛рдпрдж, рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Print(тАж)(тАж) рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдпрджрд┐ рдЖрдкрдиреЗ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд▓рд┐рдЦреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рдХ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рддреЛ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реЛрдВрдЧреЗ!

рдЬрд╝рд░реВрд░ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред рдФрд░ рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рдХреНрдп-рд░рдЪрдирд╛ рд╕рдВрдмрдВрдзреА рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рд▓рдЧрд╛рддрд╛рд░ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реНрдпреБрд░рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕ рдкрд░ рдпреЗ рдХрд╛рд░реНрдп рд╣реИрдВред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдЗрд░рд╛рджреЗ рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рдХрдо рд╕реЗ рдХрдо 100% рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлреЙрд░реНрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрдВрдЧреЗ (рдФрд░ рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдХрд┐ рд╡рд╣реА рдирд┐рдпрдо рдХреЗрд╡рд▓ func рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ )

рдирд╣реАрдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╡рдХрд╛рд▓рдд рдХрд░рддрд╛ рд╣реВрдВред

рдареАрдХ рд╣реИ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛ :) рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдк рдЬреЛ рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ "рдЬреЗрдиреЗрд░рд┐рдХ рдмрдирд╛рдо рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ" рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИрдВред рджреЛред рд╡реЗ "рдЯрд╛рдЗрдк рдмрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди" рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдЯрд╛рдЗрдк-рд╕реНрдкреЗрдХ рд╣реИ рдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рднреА рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдВ рд╕рдордЭреВрдВрдЧрд╛ рдЙрдиреНрд╣реЗрдВ :)

@Merovius рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рди рддреЛ func Print(тАж) func(тАж) , рдЬрдм Print(тАж) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд╛рдореВрд╣рд┐рдХ рд░реВрдк рд╕реЗ рдареАрдХ рд╣реИрдВред рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓-рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд┐рдирд╛, рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдПрдХ func.
Print(тАж) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЖрдкрдХреЛ рдмрд╣реБрдд рдХреБрдЫ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдЬ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ: рд╡рд╣ Print рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреБрдЫ рдорд╛рди рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Print(тАж) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрдЦреЗрдВред

рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдЙрд╕рдХреЗ рдХрд╛рд░реНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ Print(...) рдХреБрдЫ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛, рдЪрд╛рд╣реЗ рд╡рд╣ рдХреБрдЫ рднреА рд▓реМрдЯрд╛рдПред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдЕрдкреЗрдХреНрд╖рд╛ рд╣реИ, рдФрд░ рдПрдХ рдЬрд┐рд╕реЗ рдореМрдЬреВрджрд╛ рдЧреЛ рдХреЛрдб рдХреЗ рдмрд╣реБрдордд рдореЗрдВ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдЧрд░ рдореИрдВ Print(...)(...) рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ () рдиреЗ рдХреБрдЫ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ () рдЙрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ .

(рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдпрд╛ рджреБрд░реНрд▓рдн рд░рд╛рдп рдереА, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рдХрдо рд╕реЗ рдХрдо 100% рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлреЙрд░реНрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрдВрдЧреЗ (рдФрд░ рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдХрд┐ рд╡рд╣реА рдирд┐рдпрдо рдХреЗрд╡рд▓ рдПрдХ func рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ)ред

рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ :)

рджреЗрдЦрд┐рдП, рдореИрдВрдиреЗ рдЙрди 3 рддрд░реАрдХреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рджреГрд╢реНрдп рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреЛрдИ рднреА рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдПрдЧрд╛!

рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдк рдЬреЛ рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ "рдЬреЗрдиреЗрд░рд┐рдХ рдмрдирд╛рдо рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ" рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИрдВред рд╡реЗ "рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди" рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдПрдХ рдкреНрд░рдХрд╛рд░-рдХрд▓реНрдкрдирд╛ рд╣реИ рдпрд╛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ 3 рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рдЙрдкрд░реЛрдХреНрдд рдмрд┐рдВрджреБ рджреЗрдЦреЗрдВред

рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдирдИ рдЪреАрдЬ рд╣реИред

  • рдпрджрд┐ рд╣рдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирдИ рдмрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд рдХреЛрдб рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛рдВрдХрдХ рдмрджрд▓рдиреЗ рдпрд╛ рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ: рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг, рдЖрджрд┐ред
  • рдЕрдЧрд░ рд╣рдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╛рдо рджреЗрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕реЗ рдХрд┐ identifier рдореЗрдВ identifier(...) рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдкреВрд░реНрд╡ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╡реИрд╢реНрд╡рд┐рдХ рд╣реЛрдВрдЧреЗред

рдЗрд╕ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рдиреЗ рдХреЗ рдХреБрдЫ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╣реИрдВ:

  1. рд╕рд░реНрд╡реЗрдХреНрд╖рдг
  2. рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓

1. рд╕рд░реНрд╡реЗрдХреНрд╖рдг

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛: рдпрд╣ рд▓реЛрдХрддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрдгрдп рдбреЗрдЯрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдбреЗрдЯрд╛ рджреЛрдиреЛрдВ рдирд┐рд░реНрдгрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк "рд╕реНрдкрд╖реНрдЯрддрд╛ рд╕реЗ рдЗрдиреНрд╣реЗрдВ рд░реИрдВрдХ рдХрд░реЗрдВ" рдкрд░ рдХреБрдЫ рд╣рдЬрд╝рд╛рд░ рдЧреЛрдлрд╝рд░реНрд╕ рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░реЗрдВред

рдЖрдзрд╛рд░ рд░реЗрдЦрд╛:

// Lifted from the design draft
func New(type K, V)(compare func(K, K) int) *Map(K, V) {
    return &Map(K, V){compare: compare}
}

// ...

func (m *Map(K, V)) InOrder() *Iterator(K, V) {
    sender, receiver := chans.Ranger(keyValue(K, V))()
    var f func(*node(K, V)) bool
    f = func(n *node(K, V)) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue(K, V){n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдСрдкрд░реЗрдЯрд░:

// Lifted from the design draft
func New(type K, V)(compare func(K, K) int) *Map!(K, V) {
    return &Map!(K, V){compare: compare}
}

// ...

func (m *Map(K, V)) InOrder() *Iterator!(K, V) {
    sender, receiver := chans.Ranger!(keyValue!(K, V))()
    var f func(*node!(K, V)) bool
    f = func(n *node!(K, V)) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue!(K, V){n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

рдХреЛрдг рдмреНрд░реЗрд╕рд┐рдЬрд╝: (рдпрд╛ рдбрдмрд▓ рдХреЛрдг рдмреНрд░реЗрд╕рд┐рдЬрд╝, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ)

// Lifted from the design draft
func New<type K, V>(compare func(K, K) int) *Map<K, V> {
    return &Map<K, V>{compare: compare}
}

// ...

func (m *Map<K, V>) InOrder() *Iterator<K, V> {
    sender, receiver := chans.Ranger<keyValue<K, V>>()
    var f func(*node<K, V>) bool
    f = func(n *node<K, V>) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue<K, V>{n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

рдЙрдкрдпреБрдХреНрдд рдирд╛рдорд┐рдд рдХрд╛рд░реНрдп:

// Lifted from the design draft
func NewConstructor(type K, V)(compare func(K, K) int) *MapType(K, V) {
    return &MapType(K, V){compare: compare}
}

// ...

func (m *MapType(K, V)) InOrder() *IteratorType(K, V) {
    sender, receiver := chans.RangerType(keyValueType(K, V))()
    var f func(*nodeType(K, V)) bool
    f = func(n *nodeType(K, V)) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValueType(K, V){n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

...рдордЬреЗрджрд╛рд░, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдХрд╛рдлреА рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

(рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдЧреЛрдлрд╝рд░реНрд╕ @Merovius рдХреА рд╡реНрдпрд╛рдкрдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХреИрд╕рд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗ?)

2. рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдЕрднреНрдпрд╛рд╕ рд╣реЛрдЧрд╛: рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реБрд░реБрдЖрддреА-рдЕрдиреБрдХреВрд▓ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд▓рд┐рдЦреЗрдВ, рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рдкрдврд╝рдХрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВред рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдХрд┐рддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдЖрдк рдЙрдирдХрд╛ рдЙрддреНрддрд░ рдХреИрд╕реЗ рджреЗрддреЗ рд╣реИрдВ?

рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдорд╕реМрджрд╛ рдЕрдиреБрднрд╡реА рдЧреЛрдлрд░реЛрдВ рдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рддрд░реНрдХ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдбреБрдмреЛрддрд╛ рд╣реИред рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрд╕реНрдХрд░рдг рдХреНрдпрд╛ рд╣реИ? рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЖрддреНрдорд╕рд╛рдд рдХрд┐рдП рдЧрдП рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╕реБрдирд╣рд░реЗ рдирд┐рдпрдореЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ?

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реАрдбрдмреИрдХ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рднрд┐рдиреНрди рдХреЛрдг рдпрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@tooolbox рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдЬреЛ рдЙрддреНрддрд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ рд╡рд╣ рд╣реИ: рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреИрд░-рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП func рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ? рдореИрдВ рдЖрдЬ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдБ

func Print(a string) func(string) {
    return func(b string) {
        fmt.Println(a+b)
    }
}

func main() {
    Print("foo")("bar")
}

рдпрд╣ рдареАрдХ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕реЗ рд╕реБрдкрд░ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА Print рдорд╛рди-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдпрд╣ рдЕрд╕рд╣рдиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ? рдФрд░ рдХреНрдпрд╛ рдЖрдк (рд╕реНрдкрд╖реНрдЯ рд╕рдВрдЧрддрддрд╛-рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдпрд╣ рднреА рд╕реБрдЭрд╛рд╡ рджреЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдЙрдЪрд┐рдд рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдмрдВрдз рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рддрдХ рдХрд┐ Print рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ MakeXFunc рдХреБрдЫ X рдХреЗ рд▓рд┐рдП рди рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП

@tooolbox рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдЬрдм рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ?

@Merovius рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ Print("foo")("bar") рдХреЗ рд╕рд╛рде рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ 1 рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ, рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдПрдХ рд╣реА рд╕рдВрднрд╛рд╡рд┐рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИ ред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрд╕рдВрд╢реЛрдзрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ Foo(X)(Y) рдЕрдм рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рджреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдЧреЛ 1 рдореЗрдВ), рдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ . рд╕рдорд╕реНрдпрд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд░реНрде рд╕рдВрдмрдВрдзреА рд╡реНрдпрд╛рдЦреНрдпрд╛рдПрдВ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реИрдВред

@urandom рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдереЛрдХ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕рднреА рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрдзреЗрд░реЗ рдХреЛрдиреЛрдВ рдореЗрдВ рдлреЗрдВрдХрдирд╛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡реЗ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХрд╛рдлреА рджреБрд░реНрд▓рдн рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдЖрдо рддреМрд░ рдкрд░ рдЙрдирдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рд╡реЗ рдХрднреА-рдХрднреА рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреБрдЫ рдХреЛрдб рдХреЛ рднреНрд░рдорд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ "рдЕрдзрд┐рдХрд╛рдВрд╢" рдХреЛрдб рдореЗрд░реЗ рдореБрдВрд╣ рдореЗрдВ рдЦрд░рд╛рдм рд╕реНрд╡рд╛рдж рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИред рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдЧреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрддрдирд╛ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╣реИ рдЬрдм stdlib рд╕рд╣рд┐рдд "рдкреНрд▓рдВрдмрд┐рдВрдЧ" рдХреЛрдб рдкрдврд╝рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рдХрд┐ "рджреБрд░реНрд▓рдн" "рдХрднреА рдирд╣реАрдВ" рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рд╛рд╕рд┐рдд рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХрднреА рднреА рдРрд╕рд╛ рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдВ; рддреЛ рдпрд╣ рдкреВрд░рд╛ рдорд╛рдорд▓рд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рджрд╛рдВрд╡ рдирд╣реАрдВ рд▓рдЧрд╛рдКрдВрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @tooolbox рдХреЗ рддрд░реНрдХ рдХрд╛ рдореБрдЦреНрдп рдЬреЛрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рдВрджрд░реНрдн-рд╕рдВрд╡реЗрджреА рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреБрдЫ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ (рднрд▓реЗ рд╣реА рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рдЬреЛрдбрд╝ рдмрдирд╛ рд░рд╣рд╛ рд╣реЛ рдЬреИрд╕реЗ рдХрд┐ Foo(X)!(Y) ред) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрд╛рдп рд╣реИред

рдореИрдВрдиреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ (~ 2008-2009) D рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдкрдврд╝рд╛, рдФрд░ рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ ! рд╣рдореЗрд╢рд╛ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдореБрдЭреЗ рдЗрд╕ рд╢реЗрдб рдХреЛ # , $ рдпрд╛ @ рдХреЗ рд╕рд╛рде рдкреЗрдВрдЯ рдХрд░рдиреЗ рджреЗрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп (рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЧреЛ рдпрд╛ рд╕реА рдореЗрдВ рдХреЛрдИ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ)ред
рдпрд╣ рддрдм рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ w/o рдХрд┐рд╕реА рднреА рднреНрд░рдо w/рдорд╛рдирдЪрд┐рддреНрд░, рд╕реНрд▓рд╛рдЗрд╕ рдпрд╛ structs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИред

  • Foo@{X}(Y)
  • Foo${X}(Y)
  • Foo#{X}(Y)
    рдпрд╛ рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХред

рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЛ рджреЗрдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ Foo(X)(Y) рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЧреЛ рдореЗрдВ, рдирд╛рдо рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ рдЪрд░ рдирд╛рдо рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рд▓реЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рд▓реЛрдЧ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ int64(v) рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ рдФрд░ F(v) рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЬреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реЛрдВред

рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯрд╛рдЗрдк рддрд░реНрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рд╡реЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдмрд╕ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдмреБрдзрд╡рд╛рд░, 6 рдордИ, 2020 рдХреЛ 13:00 рдмрдЬреЗ рдЗрдпрд╛рди рд▓рд╛рдВрд╕ рдЯреЗрд▓рд░ рдиреЗ рд▓рд┐рдЦрд╛:

рд▓реЛрдЧ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ int64(v) рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ рдФрд░ F(v) рдПрдХ рд╣реИ
рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рднрд▓реЗ рд╣реА рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реЛрдВред

рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЕрднреА рдореЗрд░реА рдХреЛрдИ рд░рд╛рдп рдирд╣реАрдВ рд╣реИ
рд╡рд╛рдХреНрдп рд░рдЪрдирд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдпрдж
рдмрд┐рд▓реНрдЯ рдЗрди рдЯрд╛рдЗрдкреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реВрдВ
рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛ рдХрдИ рдмрд╛рд░ рдЦреБрдж (рдореИрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рддрдбрд╝рдк рд░рд╣рд╛ рдерд╛
рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рд╣реЛрдирд╛ рдХрд┐ рдХреЛрдб рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛
рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдереА рдФрд░ рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрд╛ рдХреНрдпреЛрдВрдХрд┐
рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдерд╛)ред рджреБрдирд┐рдпрд╛ рдХрд╛ рдЕрдВрдд рдирд╣реАрдВ, рдФрд░
рдлреИрдВрд╕реА рдЖрдИрдбреАрдИ рдкрд╕рдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рд░ 5 рдорд┐рдирдЯ рдпрд╛ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЯрдЯреЛрд▓рдирд╛ рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ред

тАФрд╕рд╛рдореА

--
рд╕реИрдо рд╡реНрд╣рд╛рдЗрдЯрдб

@ianlancetaylor рдПрдХ рдмрд╛рдд рдЬреЛ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рдЕрд░реНрде рдХреЗ рд╕рд╛рде рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рдЬреИрд╕реЗ int64(v) рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЙрд╕реА рддрд░рд╣ strconv.Atoi(v) рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк UseConverter(strconv.Atoi) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЧреЛ 1 рдореЗрдВ UseConverter(int64) рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рд╣реЛрдиреЗ рд╕реЗ рдХреБрдЫ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЦреБрд▓ рд╕рдХрддреА рд╣реИрдВ рдпрджрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

func StrToNumber(type K)(s string) K {
  asInt := strconb.Atoi(s)
  return K(asInt)
}

рдпрд╣ рдареАрдХ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕реЗ рд╕реБрдкрд░ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдареАрдХ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд╣рд▓реА рдХреЙрд▓ рддрд░реНрдХ рд▓реЗрддреА рд╣реИ рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрдк рдХрд░рддреА рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ Print рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ/рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? Print("foo") рдЫреЛрдбрд╝реЗ рдЧрдП рдХреЛрд╖реНрдардХ рдХреЗ рджреВрд╕рд░реЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рдиреЛ-рдСрдк рд╣реИред

рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд╣ рдХреЛрдб рдореБрдЭреЗ рдХрд┐рд╕реА рдЬрдирд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдирд╛рдо рдмрджрд▓рдХрд░ PrintFunc рдпрд╛ MakePrintFunc рдпрд╛ PrintPlusFunc рдпрд╛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реВрдВрдЧрд╛ рдЬреЛ рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ (~ 2008-2009) рдбреА рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рдкрдврд╝рд╛, рдФрд░ рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛! рд╣рдореЗрд╢рд╛ рдореБрдЭреЗ рдЯреНрд░рд┐рдк рдХрд░ рд░рд╣рд╛ рдерд╛ред

рд╣рд╛, рджрд┐рд▓рдЪрд╕реНрдкред рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рд╡реЗ рд╕рднреНрдп рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рд▓рдЧрддреЗ рд╣реИрдВред

рдЧреЛ рдореЗрдВ, рдирд╛рдо рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ рдЪрд░ рдирд╛рдо рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рджрд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рд▓реЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рд▓реЛрдЧ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ int64(v) рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ рдФрд░ F(v) рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЬреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реЛрдВред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреБрдореНрд╣реЗрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ?

рдореЗрд░рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рд┐рджреНрдзрд╛рдВрдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдЖрдорддреМрд░ рдкрд░ рд╕рдВрдЬреНрдЮрд╛ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрдп рдЖрдорддреМрд░ рдкрд░ рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреЗ рд╣реИрдВред рддреЛ рдЬрдм рдЖрдк Noun(...) рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ, рдФрд░ рдЬрдм рдЖрдк Verb(...) рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реЛрддрд╛ рд╣реИред

рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯрд╛рдЗрдк рддрд░реНрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рд╡реЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдмрд╕ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдпрд╣ рд╕рдордЭ рдЖрддрд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╕реМрджреЗ рдХреЛ рдкрдврд╝рд╛ (рд╢рд╛рдпрдж 5 рдмрд╛рд░, рд╣рд░ рдмрд╛рд░ рдЙрдЫрд▓рддрд╛ рд╣реБрдЖ рдФрд░ рдлрд┐рд░ рдЬрдм рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдпрд╛ рддреЛ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рдерд╛) рдФрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рднреНрд░рдорд┐рдд рдФрд░ рдЕрдкрд░рд┐рдЪрд┐рдд рдкрд╛рдпрд╛ред рдЬрдм рдореИрдВрдиреЗ рдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЯрдЯреЛрд▓рд╛, рддреЛ рдореБрдЭреЗ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рдкрд╕рдВрдж рдЖрдИрдВ, рд▓реЗрдХрд┐рди рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдмрдбрд╝реА рдмрд╛рдзрд╛ рдереАред

рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╕реМрджреЗ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб" рд╣реИрдВ, рдЬреЛ рдЙрди рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ! рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдиреЗрддреНрд░рд╣реАрди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ; рдореИрдВ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдзреАрдорд╛ рд╣реВрдВред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЪреАрдЬреЛрдВ рдХреЗ рддрд░реНрдХ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд╕рдВрджрд░реНрдн рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЪреАрдЬреЗрдВ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдорд┐рдд рдХреЛрдб рд╕реЗ рдПрдХ рдХрджрдо рдиреАрдЪреЗ рд╣реИред

рдЖрдЗрдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд▓реЗрдВ:

import "container/orderedmap"

var m = orderedmap.New(string, string)(strings.Compare)

func Add(a, b string) {
    m.Insert(a, b)
}

рдЬрдм рдореИрдВ orderedmap.New( рдкрдврд╝рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ New рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ, рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╡реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреБрдХрдбрд╝реЗ рдЬрд┐рдиреНрд╣реЗрдВ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрд╖реНрдардХ рдХреЗ рджреВрд╕рд░реЗ рд╕реЗрдЯ рдореЗрдВ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдХреЛ рдЧреНрд░реЛрдХ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред

(рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдпрд╣ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрддреГрдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред)

рдпрд╣рд╛рдВ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:

// Instantiation operator
var m = orderedmap.New!(string, string)(strings.Compare)
// Alternate delimiters -- notice I don't insist on any particular kind
var m = orderedmap.New<|string, string|>(strings.Compare)
// Appropriately named function
var m = orderedmap.MakeConstructor(string, string)(strings.Compare)

рдкрд╣рд▓реЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдПрдХ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрд░реА рдзрд╛рд░рдгрд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрд╖реНрдардХ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдореЗрдВ New() рдХреЗ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХрдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдЙрдЪреНрдЪ рд╕реНрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдордХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдФрд░ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдПрдХ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдмрджрд▓реЗ рдореЗрдВ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд░реНрддрдорд╛рди рд╢реИрд▓реА рдореЗрдВ рдХреЛрдб рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдЕрдиреБрдмрдВрдз рдорд╕реМрджреЗ рдореЗрдВ рд╕рднреА рдХреЛрдб рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдзреАрдорд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ: orderedmap.New рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, https://github.com/golang/go/issues/15292#issuecomment -623649521 рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╢рд╛рдпрдж рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рдерд╛ред рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рдбрд┐рдЧреНрд░реА рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИред

рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд╣рд░ рдХрд┐рд╕реА рдХреА рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдкрдардиреАрдпрддрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреБрдЫ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рд╡реНрдпрдХреНрддрд┐ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 4 рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдХреЗрддрдХ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

import "container/orderedmap"

var m = orderedmap.NewOf(string, string)(strings.Compare)

func Add(a, b string) {
    m.Insert(a, b)
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ NewOf New рд╕реЗ рдмреЗрд╣рддрд░ рдкрдврд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ New рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рдЬреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред


рдЖрдкрдХреЗ рдкрд╛рд╕ Print рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЪреВрдВрдХрд┐ рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп Print(foo) рдпрд╛ рддреЛ рдЕрдиреБрдорд╛рди рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд┐рдВрдЯ рдХреЙрд▓ рд╣реЛрдЧрд╛ред рдЧреЛ рдЯреБрдбреЗ рдореЗрдВ, рдирдВрдЧреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ :

package main

import (
    "fmt"
)

func main() {
    fmt.Println
}

./prog.go:8:5: fmt.Println evaluated but not used

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдорд╛рди рдХреЛ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@tooolbox

рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдареАрдХ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд╣рд▓реА рдХреЙрд▓ рддрд░реНрдХ рд▓реЗрддреА рд╣реИ рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЯрд╛рдЗрдк рдХрд░рддреА рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд┐рдВрдЯ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ/рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЖрдкрдиреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЕрдиреБрд╡рд░реНрддреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдардиреАрдп рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рдмрд╛рдзрд╛ рдХреЗ рднрд╛рд╖рд╛-рд╕реНрддрд░ рдХреЗ рдкреНрд░рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рдерд╛ "рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИрдВ" рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИрдВ", рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИрдВ"ред

рдореЗрд░рд╛ рдЕрдиреБрд╡рд░реНрддреА рдкреНрд░рд╢реНрди рдХреМрди рд╕рд╛ рдерд╛ред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдПрдХ рдмрджрддрд░ рднрд╛рд╖рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдиреЗ рдлрд╝рдВрдХреНрд╢рди-рджреИрдЯ-рд░рд┐рдЯрд░реНрди- func рдХреЗ рд▓рд┐рдП рдирд╛рдо-рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рдПрдХ рдмрджрддрд░ рднрд╛рд╖рд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА рдпрджрд┐ рд╣рдо рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдЬрдм рд╡реЗ рдореВрд▓реНрдп-рддрд░реНрдХ рдХреЗ рдмрдЬрд╛рдп рдЯрд╛рдЗрдк-рддрд░реНрдХ рд▓реЗрддреЗ рд╣реИрдВ?

@рдореЗрд░реЛрд╡рд┐рдпрд╕

рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рдмрд╛рдзрд╛ рдХреЗ рднрд╛рд╖рд╛-рд╕реНрддрд░ рдХреЗ рдкреНрд░рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВред

рдирд╣реАрдВ, рд╡рд╣ рддрд░реНрдХ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдирд╛рдордХрд░рдг рдорд╛рдирдХреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡реИрдз рд╕рдорд╛рдзрд╛рди рд╣реИред рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдирд┐рдпрдо рдЬреИрд╕реЗ "рдЯрд╛рдЗрдк рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рд╕реЗ рдХрдо рдЖрд╕рд╛рдиреА рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ" рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╡реИрдз рд╕рдорд╛рдзрд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЪрдореБрдЪ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред

рд╡рд╣ рдХрд╣реАрдВ рднреА рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рдХрд╣ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЕрдиреБрд░рдХреНрд╖рдХ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдпрдерд╛рд╡рдд рд░рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддрдм рднреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдФрд░ рд╡рд╣ рджрд╛рд╡рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдереЛрдбрд╝рд╛ рд╣рдЯрдХрд░ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдмрд╣реБрдд рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ред

рдирд╣реАрдВ, рд╡рд╣ рддрд░реНрдХ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдирд╛рдордХрд░рдг рдорд╛рдирдХреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡реИрдз рд╕рдорд╛рдзрд╛рди рд╣реИред

рдХреНрдпрд╛ рд╡реЗ рд╣реИрдВ? рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреВрдЫрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рдХрдо рд╕реЗ рдХрдо 100% рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлреЙрд░реНрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрдВрдЧреЗ (рдФрд░ рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдХрд┐ рд╡рд╣реА рдирд┐рдпрдо рдХреЗрд╡рд▓ рдПрдХ func рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ)ред

рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ :)

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ "рдкреНрд░рд┐рд╕реНрдХреНрд░рд╛рдЗрдм" рдпрд╣рд╛рдВ рдЕрддреНрдпрдВрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣реА рд╡рд╣ рдкреНрд░рд╢реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЗрд░рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ред рдпрджрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рднрд╛рд╖рд╛-рд╕реНрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрд▓рддрдлрд╣рдореА рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдорд╛рдирдиреЗ рдореЗрдВ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо "рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдирд┐рдпрдо" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдирд┐рд░реНрдзрд╛рд░рд┐рдд" рдХрдо рд╕реЗ рдХрдо рдордЬрдмреВрдд рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рд╡реЗ рдЕрдиреНрдп рджреЛ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ (рдПрдХ рд╣реА рд╕реНрддрд░ рдкрд░) рдЬреЛ рднрд╛рд╖рд╛-рд╕реНрддрд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдорд╛рдиреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рд╕рдореБрджрд╛рдп рдХреЛ рдирд╡реАрдирддрдо рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП vgo рдЬреИрд╕реА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реЛрдЧреА?

рдЬрд╛рдиреЗрдВ рдФрд░ рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВред рдЬрд╛рдирдХрд╛рд░реА:
https://blog.tempus-ex.com/generics-in-go-how-the-work-and-how-to-play-with-them/

рдЕрдиреБрдмрдВрдз-рд╕рдХреНрд╖рдо рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдФрд░ рдирд┐рдпрдорд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЭрдЧрдбрд╝рд╛ рд╣реИред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдореИрдВрдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЯрд╛рдЗрдк рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рднрд▓реЗ рд╣реА рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдареАрдХ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХреЛрдб рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХреЛрдИ рднреНрд░рдо рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
a) рдкреНрд░рдХрд╛рд░ рдпрд╛ рддреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рд╣реИ
рдмреА) рдкреНрд░рдХрд╛рд░ рддреГрддреАрдп рдкрдХреНрд╖ рд╣реИрдВ, рдФрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЯрд╛рдЗрдЯрд▓рдХреЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦрдбрд╝рд╛ рдХрд░ рджреЗрдЧрд╛ред рд╣рд╛рдВ, рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реА рдХреЙрд▓ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдЪрд░ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рдж рджреБрд░реНрд▓рдн рд╣реИред
рд╕реА) рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдирд┐рдЬреА рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реЗ рдирд┐рдпрдорд┐рдд рдЪрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рджрд┐рдЦреЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреВрдВрдХрд┐ рд╡реЗ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд╛рдардХ рдЬрд┐рд╕ рдХреЛрдб рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╡реЗ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрджрдо рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рд╡рд╛рдж рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рд╣реИ рдХрд┐ рдмрд┐рдирд╛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ https://play.golang.org/p/7BRdM2S5dwQ рдФрд░ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреИрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреИрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕реНрдЯреИрдХрдЗрдВрдЯ, ... рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдлрд┐рд░ рд╡рд░реНрддрдорд╛рди рдЬреЗрдиреЗрд░рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдХ (рдЯреА)ред рдореБрдЭреЗ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рдореВрд▓реНрдп рдЖрд╡рдВрдЯрди рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╣рд▓реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╕рд╣рдордд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рддрдХрдиреАрдХреА рд╕рдВрдХрд▓рдХ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЗрд╕реЗ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛ рд░рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдирдВрдмрд░ рдПрдХ рдХрд╛рд░рдг рдерд╛ред рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд╕рдлрд▓рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

@Merovius рдирд╣реАрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @infogulch рдиреЗ рдХрд╣рд╛, рдореЗрд░рд╛ рдорддрд▓рдм рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ -er рдПрдХ рд╕рдореНрдореЗрд▓рди рдмрдирд╛рдирд╛ рдерд╛ред рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рднреНрд░рдо рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред (рдореИрдВ рдПрдХ "рд╡рд╣" рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рд╣реВрдВред)

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдореИрдВрдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЯрд╛рдЗрдк рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рднрд▓реЗ рд╣реА рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдареАрдХ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХреЛрдб рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХреЛрдИ рднреНрд░рдо рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЬреЗрдиреЗрд░рд┐рдХ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдХрд╛рдВрдЯреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЙрд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

рдореИрдВрдиреЗ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрд▓реЙрдЬ рдХреЗ рд▓рд┐рдП ::<> рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рддреЛ рдЖрдк <> рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдг рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдкрд░ рдХреЛрдИ рдкрд╛рд░реНрд╕рд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ - рдЬреЗрдирд░рд┐рдХ рдФрд░ рдХреЛрдб рджреЛрдиреЛрдВ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред (рдФрд░ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВ, рддреЛ рдмреЗрд╣рддрд░ред)

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдореИрдВ рдЯрд╛рдЗрдк рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП ! рдкрд░ рдЕрдЯрдХрд╛ рдирд╣реАрдВ рдерд╛ (рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ :: рд╕рдореАрдХреНрд╖рд╛ рдкрд░ рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ)ред рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд╣реАрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рдЗрддрдирд╛ рдирд╣реАрдВред рддреЛ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, <> рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬрд╣рд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдХреБрдЫ рд╣рдж рддрдХ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП () рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЫреЛрдбрд╝рдирд╛ рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реИред

рдирдореВрдирд╛ рдЕрдВрд╢:

type Stack::<type E> []E

func (s Stack::E) Peek() E {
    return s[len(s)-1]
}

func (s *Stack::E) Pop() {
    *s = (*s)[:len(*s)-1]
}

func (s *Stack::E) Push(value E) {
    *s = append(*s, value)
}

type StackIterator::<type E> struct{
    stack Stack::E
    current int
}

func (s *Stack::E) Iter() Iterator::E {
    it := StackIterator::E{stack: *s, current: len(*s)}

    return &it
}

func (i *StackIterator::E) Next() (bool) { 
    i.current--

    if i.current < 0 { 
        return false
    }

    return true
}

func (i *StackIterator::E) Value() E { 
    if i.current < 0 {
        var zero E
        return zero
    }

    return i.stack[i.current]
}

// ...

var it Iterator::string = stack.Iter()

it = Filter::string(it, func(s string) bool {
    return s == "foo" || s == "beta" || s == "delta"
})

it = Map::<string, string>(it, func(s string) string {
    return s + ":1"
})

it = Distinct::string(it)

println(Reduce(it, "", func(a, b string) string {
    if a == "" {
        return b
    }
        return a + ":" + b
}))

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЪрд░ рдирд╛рдореЛрдВ рдХреЛ рднреА рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдПрд▓рд┐рдореЗрдВрдЯ" рдХреЗ рд▓рд┐рдП $# E 7$#$ "рдЯрд╛рдЗрдк" рдХреЗ рд▓рд┐рдП T рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЬреЗрдирд░рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрд▓рдЧ рджрд┐рдЦрд╛рдиреЗ рд╕реЗ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЧреЛ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреЛрдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрджрд┐ред

рдпрд╣ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рд╕рд╛рде рднреА рдареАрдХ рд╣реИ:

var it Iterator::string = stack.Iter()

it = Filter(it, func(s string) bool {
    return s == "foo" || s == "beta" || s == "delta"
})

it = Map::<string, string>(it, func(s string) string {
    return s + ":1"
})

it = Distinct(it)

println(Reduce(it, "", func(a, b string) string {
    if a == "" {
        return b
    }
        return a + ":" + b
}))

@tooolbox рдорд╛рдлрд╝реА, рдлрд┐рд░, рд╣рдо рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ :)

рдХреЛрдИ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреИрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реИ рдЬреИрд╕реЗ рд╕реНрдЯреИрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕реНрдЯреИрдХрдЗрдВрдЯ, ... рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдЖрд╡рдВрдЯрд┐рдд рд╣реИ рддреЛ рдПрдХ рд╕реНрдЯреИрдХ (рдЯреА)

рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рддреЛ рдореБрдЭреЗ рд╡рд╛рдХрдИ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ред рдХреЛрдИ рднреА рдЕрдЪреВрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдкрд╣рд▓рд╛ рдмрдЧ рдЬреЛ рдХреЛрдб рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рднреА рдШреБрд╕ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕ рдмрд╛рдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рдпрд╣ рдХрдерди рдХрд┐рддрдирд╛ рдЧрд▓рдд рд╣реИред

рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреА рдЬрдбрд╝ рд╣реИ, рди рдХрд┐ рдирдореВрдирд╛ Stack рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред

рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреА рдЬрдбрд╝ рд╣реИ, рди рдХрд┐ рдирдореВрдирд╛ рд╕реНрдЯреИрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ @gertcuykens рдХрд╛ рдорддрд▓рдм рдЖрдкрдХреЗ рд╕реНрдЯреИрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджрд╕реНрддрдХ рджреЗрдирд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЙрд╕рдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
(рдП рдмреА рд╕реА рдбреА)...

рдореИрдВ рдЖрдкрдХреЗ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЖрдкрдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд╡реЗ рдЧрд▓рдд рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐, рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХреЛрдб рдХреА рдмрд╛рд░реАрдХреА рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдХреЗ, рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЧреЛ рджреЗрд╡реЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА, рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рдЕрдВрддрддрдГ рдЗрд╕реЗ рдкрдврд╝ рд╕рдХреЗрдВред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдПрдХ рдЕрд▓реМрдХрд┐рдХ рдШрд╛рдЯреА рдореЗрдВ рд╣реИред рдХреЛрдб рдХреБрдЫ рдЕрд▓рдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореМрдЬреВрджрд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдлреЗрдВрдХ рджреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЭрд▓рдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЖрдк рдирдИ рдЕрдкреЗрдХреНрд╖рд╛рдПрдБ рднреА рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ (рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ) рдпреЗ рддрддреНрд╡ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ, рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдФрд░ рднрд╛рдЧреЛрдВ рдореЗрдВред

рдЙрди рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реЛрдЧ рд╕рдВрдмрдВрдзреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, @infogulch рдиреЗ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрддрд╛рдпрд╛:

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕рднреА рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрдзреЗрд░реЗ рдХреЛрдиреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХрд╛рдлреА рджреБрд░реНрд▓рдн рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдЖрдо рддреМрд░ рдкрд░ рдЙрдирдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рд╡реЗ рдХрднреА-рдХрднреА рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреБрдЫ рдХреЛрдб рдХреЛ рднреНрд░рдорд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ "рдЕрдзрд┐рдХрд╛рдВрд╢" рдХреЛрдб рдореЗрд░реЗ рдореБрдВрд╣ рдореЗрдВ рдЦрд░рд╛рдм рд╕реНрд╡рд╛рдж рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо рд╡рд┐рд╖рдп рдХреЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рднрд╛рдЧ рдкрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрддреГрдкреНрддрд┐ рддрдХ рдкрд╣реБрдБрдЪ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рддрдиреА рднреА рдмрд╛рдд рдХрд░реЗрдВ, рдПрд╕рд┐рдб рдЯреЗрд╕реНрдЯ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЧреЛ рджреЗрд╡ рдЗрд╕реЗ рдХрд┐рддрдиреА рдЬрд▓реНрджреА рдФрд░ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

(рдФрд░ рд╣рд╛рдВ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдмреЛрдЭ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рджреЗрд╡ рдкрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдмреВрд╕реНрдЯ рдЗрдлреЗрдХреНрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдбрд╝рдХ рдкрд░ рдЖрджрдореА рдХреЗ рд▓рд┐рдП рдЕрдирдЬрд╛рди рд╣реИрдВред рдореИрдВ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ ' рдореИрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдЬрдВрдмреЛрд░реА рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдж рддрдХ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЪреВрдХ рд╡реНрдпрд╛рдкрдХрддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рджреЗрдЧреАред)

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╣реИ рдФрд░ рд╣рдо рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдВрдЯреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╢рд╛рдирджрд╛рд░ рд╣реИред рд╢рд╛рдпрдж рд╣рдореЗрдВ рдФрд░ рднреА рдЯреВрд▓реНрд╕ рдЪрд╛рд╣рд┐рдП!

рд▓реЛрдЧреЛрдВ рдиреЗ рдлреАрдбрдмреИрдХ рджрд┐рдпрд╛ рд╣реИ ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдлреАрдбрдмреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рд╣рдореЗрдВ рдмреЗрд╣рддрд░ рдпрд╛ рдЕрдзрд┐рдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдлреАрдбрдмреИрдХ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@tooolbox рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рд╣рдореЗрд╢рд╛ <> рдФрд░ type рдХреЛ рдРрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЙрд╕рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ?

type Stack::E []E

func (s Stack::E) Peek() E {
    return s[len(s)-1]
}

func (s *Stack::E) Pop() {
    *s = (*s)[:len(*s)-1]
}

func (s *Stack::E) Push(value E) {
    *s = append(*s, value)
}

type StackIterator::E struct{
    stack Stack::E
    current int
}

func (s *Stack::E) Iter() Iterator::E {
    it := StackIterator::E{stack: *s, current: len(*s)}

    return &it
}

func (i *StackIterator::E) Next() (bool) { 
    i.current--

    if i.current < 0 { 
        return false
    }

    return true
}

func (i *StackIterator::E) Value() E { 
    if i.current < 0 {
        var zero E
        return zero
    }

    return i.stack[i.current]
}

// ...

var it Iterator::string = stack.Iter()

it = Filter::string(it, func(s string) bool {
    return s == "foo" || s == "beta" || s == "delta"
})

it = Map::string, string (it, func(s string) string {
    return s + ":1"
})

it = Distinct::string(it)

println(Reduce(it, "", func(a, b string) string {
    if a == "" {
        return b
    }
        return a + ":" + b
}))

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдпрд╣ Map::string, string (... рдмрд╕ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 2 рдЯреЛрдХрди рдмрдирд╛рддрд╛ рд╣реИ, рдПрдХ Map::string , рдФрд░ рдПрдХ string рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд▓реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЛ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, "рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ :: рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЧрд▓рдд рдкреНрд░рднрд╛рд╡ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕реЛрдЪрдХрд░ рдХрд┐ $#$ string рдХреЗ рд╕рд╛рде Filter рд╡рд░реНрдЧ/рдирд╛рдо рд╕реНрдерд╛рди рд╣реИ рдЗрд╕рдореЗрдВ string рдлрд╝рдВрдХреНрд╢рдиред рдЕрдиреНрдп рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЕрдкрдирд╛рдИ рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЯреЛрдХрди рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рд╣рдореЗрд╢рд╛ <> рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЙрд╕рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ?

рдирд╣реАрдВ, рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдореИрдВ @urandom рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЕрдВрддрд░рд┐рдХреНрд╖ рдЪрд░рд┐рддреНрд░, рдмрд┐рдирд╛ рдХреБрдЫ рд╕рдВрд▓рдЧреНрди рдХрд┐рдП, рдЗрд╕реЗ рджреЛ рдЯреЛрдХрди рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рджрд╛рдпрд░рд╛ рднреА рдкрд╕рдВрдж рд╣реИ рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд▓реЗ рд╣реА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЛ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, "рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ :: рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рдпрд╣ рд╕реЛрдЪрдХрд░ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдлрд╝рд┐рд▓реНрдЯрд░ рдХреНрд▓рд╛рд╕/рдиреЗрдорд╕реНрдкреЗрд╕ рд╣реИред рдЕрдиреНрдп рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЕрдкрдирд╛рдИ рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЯреЛрдХрди рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ :: рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рджреЗрдЦрд╛ рд╣реИред рд╢рд╛рдпрдж ! рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреА рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ :: рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдЗрд╕ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рди рдкрд╛рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЪрд░реНрдЪрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдо рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  • рдирдВрдЧреЗ identifier() рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рддрд╛рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рди рджрд┐рдЦреЗред
  • рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХреЛрд╖реНрдардХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рджрд┐рдЦрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдЗрдХрд╛рдИ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
  • рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред
  • рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдордЬрдмреВрдд рдбреЗрд╡рд▓рдкрд░ рдорд╛рдЗрдВрдбрд╢реЗрдпрд░ рд╣реИред
  • рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЬреЗрдирд░рд┐рдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рднреА рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

  • identifier!(a, b) (рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди )
  • identifier@(a, b)
  • identifier#(a, b)
  • identifier$(a, b)
  • identifier<:a, b:>
  • identifier.<a, b> рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреА рддрд░рд╣ рд╣реИ!
  • identifier:<a, b>
  • рдЖрджрд┐ред

рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдФрд░ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

рдмрд╕ рдПрдХ рддреНрд╡рд░рд┐рдд рдиреЛрдЯ рдХрд┐ рд╣рдордиреЗ рдЙрди рд╕рднреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ рдРрд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдЬреИрд╕реЗ

func F(T : a, b T) { }
func G() { F(int : 1, 2) }

рд▓реЗрдХрд┐рди рдлрд┐рд░, рд╣рд▓рд╡рд╛ рдХрд╛ рд╕рдмреВрдд рдЦрд╛рдиреЗ рдореЗрдВ рд╣реИред рдХреЛрдб рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рд╕рд╛рд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рддрдХ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддреА рд╣реИред

(рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдмрд╛рдд рдХреА рдЧрдИ рд╣реИ) рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рд╣рдо рдореМрдЬреВрджрд╛ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдХреЛ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЧреИрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

func Repeat(v, n int) []int {
    var r []int
    for i := n; i > 0; i-- {
        r = append(r, v)
    }
    return r
}

Repeat(4, 4)

рд╣рдо рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

func Repeat(type T)(v T, n int) []T {
    var r []T
    for i := n; i > 0; i-- {
        r = append(r, v)
    }
    return r
}

Repeat("a", 5)

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп struct . рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

type XY struct {
    X, Y int
}

func RangeRepeat(arr []XY) []int {
    var r []int
    for _, n := range arr {
        for i := n.Y; i > 0; i-- {
            r = append(r, n.X)
        }
    }
    return r
}

RangeRepeat([]XY{{1, 1}, {2, 2}, {3, 3}})

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ

type XY(type T) struct {
    X T
    Y int
}

func RangeRepeat(type T)(arr []XY(T)) []T {
    var r []T
    for _, n := range arr {
        for i := n.Y; i > 0; i-- {
            r = append(r, n.X)
        }
    }
    return r
}

// error: cannot use generic type XY(type T any) without instantiation
// RangeRepeat([]XY{{1, 1}, {2, 2}, {3, 3}}) // error in old code
RangeRepeat([](XY(int)){{1, 1}, {2, 2}, {3, 3}}) // API changed
// RangeRepeat([]XY{{"1", 1}, {"2", 2}, {"3", 3}}) // error
RangeRepeat([](XY(string)){{"1", 1}, {"2", 2}, {"3", 3}}) // ok

рд╕рдВрд░рдЪрдирд╛рдУрдВ рд╕реЗ рднреА рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

@ianlancetaylor

рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╕реМрджреЗ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ methods may not take additional type arguments ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдРрд╕реА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ?

рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╕реМрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ред рдХреНрдпрд╛ рдЯрд╛рдЗрдк рдбрд┐рд╕рдЬрдВрдХреНрд╢рди рдмрд┐рд▓реНрдЯ-рдЗрди рдЯрд╛рдЗрдкреНрд╕ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд░рд╣реЗрдЧрд╛? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд┐рд╕рдЬрдВрдХреНрд╢рди рд╕реВрдЪреА рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕?

рдХреБрдЫ рдЗрд╕ рддрд░рд╣

type Getter(T) interface {
    Get() T
}

contract(G, T) {
    G Getter(T)
}

рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рди рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЕрдиреБрдмрдВрдз рдореЗрдВ рд╕реЗрдЯ рдХреА рдЧрдИ рд╡рд┐рдзрд┐ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдПрдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЬрдм рдЯрд╛рдЗрдк рдЗрдВрдлрд░реЗрдВрд╕рд┐рдВрдЧ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдВрдХреНрд░реАрдЯ рдкреНрд░рдХрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)

@ianlancetaylor рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдХреНрдпрд╛ рддрд░реНрдХ рд╕реВрдЪреА рдХреЛ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рддреЛ рдЧреНрд░рд╛рдл рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗ рдмрдЬрд╛рдп

var g = graph.New(*Vertex, *FromTo)([]*Vertex{ ... })

рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ

var g = graph.New(*Vertex, *FromTo, []*Vertex{ ... })

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рддрд░реНрдХ рд╕реВрдЪреА рдХрд╛ рдкрд╣рд▓рд╛ K рддрд░реНрдХ рд▓рдВрдмрд╛рдИ K рдХреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░реНрдХ рд╕реВрдЪреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╢реЗрд╖ рддрд░реНрдХ рд╕реВрдЪреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдпрдорд┐рдд рддрд░реНрдХреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдЗрд╕рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдорд┐рд░рд░ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реИ

make(Type, size)

рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред

рдпрд╣ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рддрд░реНрдХ рдХрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рдпрдорд┐рдд рддрд░реНрдХ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред

@ smasher164 рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд╣рд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рдорд╛рдирд╛ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХреНрдпреЛрдВ)ред

func F(T : a, b T) { }
func G() { F(int : 1, 2) }

рдЖрдк рдпрд╣реА рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрд▓рди рдХреЗ рд╕рд╛рдеред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрдзреВрд░реА рддрд╕реНрд╡реАрд░ рд╣реИ; рдЯрд╛рдЗрдк рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди, рдореЗрдердбреНрд╕, рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдореИрдВ рдХреБрдЫ рдкрд░ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ @Inuart рдиреЗ рдХрд╣рд╛:

рд╣рдо рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

рдХреНрдпрд╛ рдЧреЛ рдЯреАрдо рдЧреЛ 1 рд╕рдВрдЧрддрддрд╛ рдЧрд╛рд░рдВрдЯреА рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧреА? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ strings.Repeat(s string, count int) string рдХреЛ Repeat(type S stringlike)(s S, count int) S рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдП? рдЖрдк //Deprecated рдЯрд┐рдкреНрдкрдгреА рдХреЛ bytes.Repeat рдореЗрдВ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд▓реАрдЧреЗрд╕реА рдХреЛрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡рд╣реАрдВ рдЫреЛрдбрд╝ рджреЗрдВред рдХреНрдпрд╛ рдЧреЛ рдЯреАрдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧреА?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпрд╛ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ Go1Compat рдХреЗ рднреАрддрд░ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛? рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВред

@carlmjohnson рдирд╣реАрдВред рдпрд╣ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛: f := strings.Repeat , рдХреНрдпреЛрдВрдХрд┐ рдкреЙрд▓рд┐рдореЙрд░реНрдлрд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рддрддреНрдХрд╛рд▓ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдЬрд╛рдХрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк-рддрд░реНрдХ рдФрд░ рдореВрд▓реНрдп-рддрд░реНрдХ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдПрдХ рдЧрд▓рддреА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрддреНрдХрд╛рд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЧреЛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░реА рд╣реЛ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ foo(int, 42) рдФрд░ foo(int) рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛ рдФрд░ рджреЛрдиреЛрдВ рдХреЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдВред

@urandom рд╣рд╛рдВ, рд╣рдордиреЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИред рдЗрд╕рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рдд рдирд┐рд╢реНрдЪрд┐рдд рд▓рдЧрддреА рд╣реИ: рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдмрд┐рдирд╛ рдХреБрдЫ рддреЛрдбрд╝реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрдордд рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХреНрдпрд╛ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЙрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╝рд╛рдЗрди рдорд╕реМрджреЗ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрддреНрдХрд╛рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ рд╣реИред

@ smasher164 @tooolbox рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдирд┐рдпрдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЛ рджреЗрдЦрддреЗ рд╕рдордп рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП (рдпрджрд┐ рд╡реЗ рдЕрд▓рдЧ рд╣реЛ рдЧрдП рд╣реИрдВ) рдФрд░ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдирд┐рдпрдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ (рд╕рдВрднрд╡рддрдГ рд╣рдо рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рдорд▓рд╛)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рдирд┐рдпрдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдиреЗ рд▓реЗрдХрд┐рди рдЙрд╕реЗ рдХреЙрд▓ рди рдХрд░рдиреЗ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдиреЗ рдФрд░ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдЬрдмрдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рд╡реЗ рдкреВрд░реНрд╡ рдорд╛рдорд▓реЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВред

рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдорд╛рди рдХреЛрд╖реНрдардХ рдХреЗ рдЕрдВрджрд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдерд╛, рддреЛ @griesemer рдиреЗ # 36177 (рдЙрдирдХреА рджреВрд╕рд░реА рдкреЛрд╕реНрдЯ) рдореЗрдВ рдХрд╣рд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреЛрд▓рди рдХреЗ рдмрдЬрд╛рдп рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рдкрд╕рдВрдж рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ (рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк) рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ) рдЗрд╕рдиреЗ рдПрдХ рдХреЛ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╡рдд рд╕рд▓рд╛рдЦреЛрдВ ( |..| ) рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдкрд╕рдВрдж рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрднреА-рдХрднреА рдкреИрд░рд╛рдореАрдЯрд░ рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдиреНрд╣реЗрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ (рд░реВрдмреА, рдХреНрд░рд┐рд╕реНрдЯрд▓ рдЗрддреНрдпрд╛рджрд┐) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рди рд╣реЛрдЧрд╛:

func F(|T| a, b T) { }
func G() { F(|int| 1, 2) }

рдлрд╛рдпрджреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рд╡реЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдирд┐рдпрдорд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдЪреНрдЫрд╛ рджреГрд╢реНрдп рднреЗрдж (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реА рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП) рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
  • рдЖрдкрдХреЛ type рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
  • рдХреЛрдИ рдирд┐рдпрдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
  • рд╡рд░реНрдЯрд┐рдХрд▓ рдмрд╛рд░ рдХреИрд░реЗрдХреНрдЯрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, ASCII рд╕реЗрдЯ рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреАрдмреЛрд░реНрдб рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдк рдЗрд╕реЗ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд╛рд╣рд░ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ <...> рдпрд╛ [...] рдЬреИрд╕реА рд╣реА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ 'рдпрд╛' рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрднрд╡рддрдГ рдореБрд╢реНрдХрд┐рд▓реЗрдВ рдХрдо рд╣реЛрдВрдЧреАред

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдирд┐рдпрдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рди рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рдВрдмрд╡рдд рдмрд╛рд░ рдХреИрд╕реЗ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдХреЛ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрди рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ type рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рдереЗ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реВрдХреНрд╖реНрдо рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдЪреНрдЪ рд▓рдХреНрд╖реНрдп рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдРрд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ, рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реЛрдВ, рдФрд░ рдЬреЛ рдмрд╛рдХреА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рд╣реЛрдВред рдХреЛрдб рдкрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдмреЗрд╢рдХ рд╣рдо рд╣рдореЗрд╢рд╛ рдЙрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ianlancetaylor рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдо рдПрдХ рд╕рдореБрджрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЖрдкрдХреА рдФрд░ рдЯреАрдо рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдЕрдзрд┐рдХ рдХреЛрдб рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдмреЗрд╣рддрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдФрд░ рдЕрдиреНрдпрдерд╛ рджреЛрдиреЛрдВ? рдФрд░/рдпрд╛ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ?

@tooolbox рд╣рд╛рдБред рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреВрд▓ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред рд░рд┐рдпрд▓ рдЬрд▓реНрдж рд╣реА рдЕрдмред

рдХреНрдпрд╛ рдЖрдк рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛?

рдХреНрдпрд╛ рдпрд╣ рдореБрджреНрджрд╛ рдЬреЗрдирд░рд┐рдХ рдлреАрдбрдмреИрдХ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрджреАрджрд╛ рд╕реНрдерд╛рди рд╣реИ? рдпрд╣ рд╡рд┐рдХреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдХреНрд░рд┐рдп рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХрдИ рдкрд╣рд▓реВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧрд┐рдЯрд╣рдм рдореБрджреНрджрд╛ рдПрдХ рд░реИрдЦрд┐рдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рдзреНрд╡рд╕реНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред

F(T:) / G() { F(T:)} рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди рдЕрдиреБрднрд╡рд╣реАрди рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рдЬ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдареАрдХ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреНрдпрд╛ рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЕрдиреБрдмрдВрдз рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдорд╕реМрджреЗ рдореЗрдВ рдПрдХ рд╕реАрдорд╛ рд╣реИред рдпрд╣ рд╡рдЬрди (рдФрд░ рдорд╛рдкрдиреЗ) рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдирд╛ рдХреЛрдб рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдореЗрд░реА рд╕рдордЭ рдХреЗрд╡рд▓ рдХреЛрдб рд╣реИ рдЬреЛ contract рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдирд╣реАрдВ рд╣реИ (рдЬрд┐рд╕реЗ рдкреБрд░рд╛рдиреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ go1 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рджрд╢рдХреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рд╡рдЬрди рдХрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреЛ рдХреЗ рдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рдеред

рдЙрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рднреАрддрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд┐рд╖реЗрдз рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡реЗ рдПрдХрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрдмрдВрдз рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдкреНрд░рддрд┐рдмрдВрдз рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ - рдпрд╣ рд╢рд╛рдпрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рднрд╛рд╖рд╛ рджреЛрд╖ рд╣реИред

рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреЗ рдЙрджрд╛рд╣рд░рдг рднреА рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЕрдиреБрдмрдВрдз if err != nil рд╢рдмреНрджрд╛рдбрдВрдмрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рд╡реЗ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдВрдЧреЗред рдХреНрдпрд╛ F() (X, error) {return IfError(foo(), func(i, j int) X { return X(i*j}), Identity )} рдЬреИрд╕рд╛ рдХреБрдЫ рд╕рдВрднрд╡ рд╣реИ?

рдореИрдВ рдпрд╣ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЧреЛ рдЯреАрдо рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреА рд╣реИ рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░, рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдорд┐рддреНрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрдХ рдЕрдиреБрдкрд▓рдмреНрдз рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗред рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдирдИ рдирд┐рд╣рд┐рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВ? рдпрд╛ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╛ рдпрд╣ рдХрднреА рднреА рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реИрдВред рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдХрд╛рдлреА рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдХрд╛рд░реНрдп рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рднреАрддрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЖрдЬ рдХрд╛рд░реНрдп рдирд┐рдХрд╛рдпреЛрдВ рдХреЗ рднреАрддрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ; рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЕрднреА рднреА рджреБрд░реНрд▓рдн рд╣реЛрдВрдЧреЗред рдЙрд╕ рдиреЗ рдХрд╣рд╛, #25860 рджреЗрдЦреЗрдВ (рдЬреЗрдиреЗрд░рд┐рдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ)ред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд░реНрдмреЛрдЬрд╝ рд╡рд┐рд╖рдп)ред рдореБрдЭреЗ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдПрдХ рдЫреЛрдЯрд╛ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдмреНрджрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕, рдЬреЛ рдЬреЗрдирд░рд┐рдХ рд╕реЗ рднреА рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, #21498 рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рдХрд▓ рд░рд╛рдд рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рдорд╕реМрджреЗ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (!!)ред рд╡рд╛рд╣, рдЕрдВрдд рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдореБрдЭреЗ рдбреНрд░рд╛рдлреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП...


рд▓реЛрдЧ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрд╛рдпреЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ
рдЙрдирдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдЕрдВрджрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрдВрд╕рд╛ рд╕рдХрддрд╛ рд╣реИ
рдмреНрд▓реЙрдХ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдПрдХ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдЕрдиреНрдпрддреНрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдЬрд╛рд╡рд╛ рдЕрдирд╛рдо рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ, рдФрд░ рдЙрдирдХрд╛ рдЙрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо #25860 рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпреБрдЧ рдореЗрдВ
рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ, рддрд░реАрдХреЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЧрд▓рддреА рдХрд░реЗрдВ
рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЛрдЧреЛрдВ рдФрд░ рдХреНрд▓реЛрдЬрд░ рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд╢рдХреНрдд рдмрдирд╛рдиреЗ рдХрд╛ рдкрдХреНрд╖, рдирд╣реАрдВ
рдЙрдиреНрд╣реЗрдВ рдХрдордЬреЛрд░ рдХрд░ рд░рд╣рд╛ рд╣реИред

(рдФрд░ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рд╕рдЦреНрдд go1 рд╕рдВрдЧрддрддрд╛ [рдмрдирд╛рдо рд╡рд╕реНрддреБрддрдГ . рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ)
99.999% рд╕рдВрдЧрддрддрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ] рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдореЗрдВ рдПрдХ рдХрд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ
рд╡рд┐рд╢реЗрд╖рддрд╛ред)


рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рдерд╛ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ
(T1, T2, ..., error) рд░рд┐рдЯрд░реНрди рдЯреБрдкрд▓реНрд╕ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрдиред рдореИрдВ рдирд╣реА
рдорди рдореЗрдВ рдХреБрдЫ рднреА рд╡рд┐рд╕реНрддреГрдд рд╣реИред type ErrPair(type T) struct{T T; Err Error} Promise in . рдЬреИрд╕реА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ
рдЬрд╛рд╡рд╛/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╕реЛрдЪрд╛ рд╣реЛред рдкрд░ рдПрдХ рдкреНрд░рдпрд╛рд╕
рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВред

рдХреБрдЫ рдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖред рдореИрдВ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛
рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ ErrPair(T) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдПрдХ рдмрдбрд╝реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рддрдХрдиреАрдХред

type result struct {min, max point}

// with a generic ErrPair type and generic function errMap2 (like Java's Optional#map() function).
func minMax2(msg *inputTimeSeries) (result, error) {
    return errMap2(
        MakeErrPair(time.Parse(layout, msg.start)).withMessage("bad start"),
        MakeErrPair(time.Parse(layout, msg.end)).withMessage("bad end"),
        func(start, end time.Time) (result, error) {
            min, max := argminmax(msg.inputPoints, func(p inputPoint) float64 {
                return float64(p.value)
            })
            mkPoint := func(ip inputPoint) point {
                return point{interpTime(start, end, ip.interp).Format(layout), ip.value}
            }
            return result{mkPoint(*min), mkPoint(*max)}, nil
        }).tuple()
}

// without generics, lots of if err != nil 
func minMax(msg *inputTimeSeries) (result, error) { 
    start, err := time.Parse(layout, msg.start)
    if err != nil {
        return result{}, fmt.Errorf("bad start: %w", err)
    }
    end, err := time.Parse(layout, msg.end)
    if err != nil {
        return result{}, fmt.Errorf("bad end: %w", err)
    }
    min, max := argminmax(msg.inputPoints, func(p inputPoint) float64 {
        return float64(p.value)
    })
    mkPoint := func(ip inputPoint) point {
        return point{interpTime(start, end, ip.interp).Format(layout), ip.value}
    }
    return result{mkPoint(*min), mkPoint(*max)}, nil
}

// Most languages look more like this.
func minMaxWithThrowing(msg *inputTimeSeries) result {
    start := time.Parse(layout, msg.start)) // might throw
    end := time.Parse(layout, msg.end)) // might throw
    min, max := argminmax(msg.inputPoints, func(p inputPoint) float64 {
        return float64(p.value)
    })
    mkPoint := func(ip inputPoint) point {
        return point{interpTime(start, end, ip.interp).Format(layout), ip.value}
    }
    return result{mkPoint(*min), mkPoint(*max)}
}

(рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ)


рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкреИрдХреЗрдЬ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА
рдпрд╣рд╛рдБ ред
рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рдШрдмрд░рд╛рд╣рдЯ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛
Form([]*Form(T)) рдЬреИрд╕реЗ рдпреМрдЧрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рдореИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ
рдЙрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдЧрд░ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдпрд╣ рднреА рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рдерд╛ рдХрд┐ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ -> рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди:

contract PrimitiveType(T) {
    T bool, int, int8, int16, int32, int64, string, uint, uint8, uint16, uint32, uint64, float32, float64, complex64, complex128
    // string(T) is not a contract
}

func primitiveString(type T PrimitiveType(T))(t T) string  {
    // I'm not sure if this is an artifact of the experimental implementation or not.
    return string(t) // error: `cannot convert t (variable of type T) to string`
}

рдореИрдВ рдЬрд┐рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдпрд╣ рдерд╛:

// basicFormAdapter implements FormAdapter() for the primitive types.
type basicFormAdapter(type T PrimitiveType) struct{}


func (a *basicFormAdapter(T)) Format(e T, fc *FormatContext) error {
    //This doesn't work: fc.Print(string(e)) -- cannot convert e (variable of type T) to string
    // This also doesn't work: cannot type switch on non-interface value e (type int)
    // switch ee := e.(type) {
    // case int: fc.Print(string(ee))
    // default: fc.Print(fmt.Sprintf("!!! unsupported type %v", e))
    // }
    // IMO, the proposal to allow switching on T is most natural:
    // switch T.(type) {
    //  case int: fc.Print(string(e))
    //  default: fc.Print(fmt.Sprintf("!!! unsupported type %v", e))
    // }

    // This can't be the only way, right?
    rv := reflect.ValueOf(e)
    switch rv.Kind() {
    case reflect.Bool: fc.Print(fmt.Sprintf("%v", e))
    case reflect.Int:fc.Print(fmt.Sprintf("%v", e))
    case reflect.Int8: fc.Print(fmt.Sprintf("int8:%v", e))
    case reflect.Int16: fc.Print(fmt.Sprintf("int16:%v", e))
    case reflect.Int32: fc.Print(fmt.Sprintf("int32:%v", e))
    case reflect.Int64: fc.Print(fmt.Sprintf("int64:%v", e))
    case reflect.Uint: fc.Print(fmt.Sprintf("uint:%v", e))
    case reflect.Uint8: fc.Print(fmt.Sprintf("uint8:%v", e))
    case reflect.Uint16: fc.Print(fmt.Sprintf("uint16:%v", e))
    case reflect.Uint32: fc.Print(fmt.Sprintf("uint32:%v", e))
    case reflect.Uint64: fc.Print(fmt.Sprintf("uint64:%v", e))
    case reflect.Uintptr: fc.Print(fmt.Sprintf("uintptr:%v", e))
    case reflect.Float32: fc.Print(fmt.Sprintf("float32:%v", e))
    case reflect.Float64: fc.Print(fmt.Sprintf("float64:%v", e))
    case reflect.Complex64: fc.Print(fmt.Sprintf("(complex64 %f %f)", real(rv.Complex()), imag(rv.Complex())))
    case reflect.Complex128:
         fc.Print(fmt.Sprintf("(complex128 %f %f)", real(rv.Complex()), imag(rv.Complex())))
    case reflect.String:
        fc.Print(fmt.Sprintf("%q", rv.String()))
    }
    return nil
}

рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ 'рдкрд░рд┐рдгрд╛рдо' рдмрдирд╛рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛

type Result(type T) struct {
    Value T
    Err error
}

func NewResult(type T)(value T, err error) Result(T) {
    return Result(T){
        Value: value,
        Err: err,
    }
}

func then(type T, R)(r Result(T), f func(T) R) Result(R) {
    if r.Err != nil {
        return Result(R){Err: r.Err}
    }

    v := f(r.Value)
    return  Result(R){
        Value: v,
        Err: nil,
    }
}

func thenTry(type T, R)(r Result(T), f func(T)(R, error)) Result(R) {
    if r.Err != nil {
        return Result(R){Err: r.Err}
    }

    v, err := f(r.Value)
    return  Result(R){
        Value: v,
        Err: err,
    }
}

рдЬреИрд╕реЗ

    r := NewResult(GetInput())
    r2 := thenTry(r, UppercaseAndErr)
    r3 := thenTry(r2, strconv.Atoi)
    r4 := then(r3, Add5)
    if r4.Err != nil {
        // handle err
    }
    return r4.Value, nil

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдкрд░ then рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреАред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдорд╕реМрджреЗ рдореЗрдВ рдкреВрд░реНрдг рдЕрдВрддрд░ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рдЧрддрд╛ рд╣реИ:

func (a ComplexAbs(T)) Abs() T {
    r := float64(real(a))
    i := float64(imag(a))
    d := math.Sqrt(r * r + i * i)
    return T(complex(d, 0))
}

рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

func (a ComplexAbs(T)) Abs() ComplexAbs(T) {
    r := float64(real(a))
    i := float64(imag(a))
    d := math.Sqrt(r * r + i * i)
    return ComplexAbs(T)(complex(d, 0))
}

рдореБрдЭреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ contract рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдЪрд┐рдВрддрд╛ рд╣реИред

рд╕реНрдХреИрд▓рд╛ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрдо рд╣реИ рдЬреИрд╕реЗ:

def compute[A: PointLike: HasTime: IsWGS](points: Vector[A]): Map[Int, A] = ???

PointLike , HasTime рдФрд░ IsWGS рдХреБрдЫ рдЫреЛрдЯрд╛ рд╣реИ contract (рд╕реНрдХрд╛рд▓рд╛ рдЙрдиреНрд╣реЗрдВ type class рдХрд╣рддреЗ рд╣реИрдВ)ред

рдЬрдВрдЧ рдХрд╛ рднреА рдПрдХ рд╕рдорд╛рди рддрдВрддреНрд░ рд╣реИ:

fn f<F: A + B>(a F) {}

рдФрд░ рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрдирд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

type I1 interface {
    A()
}
type I2 interface {
    B()
}
func f(a interface{
    I1
    I2
})

рдЖрдИрдПрдордУ, рдЕрдирд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдЦрд░рд╛рдм рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ interface рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓рд░ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди contract рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рдзрд╛ , рдХреЙрд▓рд░ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдЬреНрдЮрд╛рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдмрдВрдз рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ contract рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдпрджрд┐ рдХреБрдЫ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджреЗрдЧрд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдорд┐рдд рдЕрдиреБрдмрдВрдз рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЗрд╕ рдирдП рдЕрдиреБрдмрдВрдз рдореЗрдВ рдФрд░ рднреА рдЕрдиреБрдмрдВрдз рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдиреНрдп рд╣реИ

contract C1(T) {
    T A()
}
contract C2(T) {
    T B()
}
contract C3(T) {
    T C()
}

contract PART(T) {
    C1(T)
    C2(T)
}

contract ALL(T) {
    C1(T)
    C2(T)
    C3(T)
}

func f1(type A PART) (a A) {}

func f2(type A ALL) (a A) {
    f1(a)
}

рдореИрдВрдиреЗ рдЗрдиреНрд╣реЗрдВ рдбреНрд░рд╛рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд░ рдЖрдЬрдорд╛рдпрд╛ рд╣реИ, рдЗрди рд╕рднреА рдХреЛ рдЯрд╛рдЗрдк рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

func f(type A C1, C2)(x A)

func f1(type A contract C(A1) {
    C1(A)
    C2(A)
}) (x A)

func f2(type A ((type A1) interface {
    I1(A1)
    I2(A1)
})(A)) (x A)

CL . рдореЗрдВ рдиреЛрдЯреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдХрдИ рдЕрдиреБрдмрдВрдзреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╡рд╢ рд╣реИ, рдЙрд╕реЗ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзреНрдпрддрд╛ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╣рд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдЕрдЬреАрдм рд╕реНрдирд┐рдкреЗрдЯ рдорд╛рдиреНрдп рд╣реИ

func f1(type A C1, _ C2(A)) (x A)

рдпрд╣рд╛рдБ рдореЗрд░реЗ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ:

  • рдпрджрд┐ рд╣рдо contract рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ, type a A <=> var a A , рддреЛ рд╣рдо рдПрдХ рдЕрдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП type a { A1(a); A2(a) } рдЬреИрд╕реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдиреБрдмрдВрдз рдЬрд▓реНрджреАред
  • рдЕрдиреНрдпрдерд╛, рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, type a, b, A1(a), A2(a), A3(a, b) , рдпрд╣ рд╢реИрд▓реА рдареАрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП interface рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

@bobotu рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдореЗрдВ рдпрд╣ рдЖрдо рд╣реИред рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк рдЗрд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд░реЗрдВрдЧреЗред

@azunymous рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ рдкреВрд░реЗ рдЧреЛ рд╕рдореБрджрд╛рдп рдХреЛ рдХрдИ рд░рд┐рдЯрд░реНрди рд╕реЗ Result рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕реЗ рдХреБрдЫ рд╣рдж рддрдХ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛ред рдЧреЛ рдЯреАрдо рдЙрди рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдХрддрд░рд╛рддреА рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдХреЗ "рдЕрдиреБрднрд╡" рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдЪрд╛рд░; рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдХреЛрдИ рд▓реЗрдирд╛ рджреЗрдирд╛ рд╣реИред

@tooolbox рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рдПрдХрд▓ Result рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд╣рд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп Result рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди рди рд╣реЛ s рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЧрдгрдирд╛ рдФрд░ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рдХрд╛рд░реНрдпред рдпрд╛ рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреНрд░рдорд╛рдВрдХрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдкрдардиреАрдпрддрд╛ рдЦреЛ рджреЗрдВрдЧреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреА рдХрд┐ рдЖрдк errWriter рдХреЗ рдмрд░рд╛рдмрд░ рдХреБрдЫ рджреЗрдЦреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдЖрдк рдЙрд╕ рддрд░рд╣ рдХреБрдЫ рдРрд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрдм рдпрд╣ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ рд╕рдВрдкреВрд░реНрдг рдЧреЛ рд╕рдореБрджрд╛рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрдИ рд░рд┐рдЯрд░реНрди рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ @azunymous рдиреЗ рдХрд╣рд╛, рдмрд╣реБрдд рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрдИ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрди рд╕рднреА рдЕрдиреНрдп рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдмрд╣реБрд░реВрдкрддрд╛ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ; рдЖрдкрдХреЛ рдЯреБрдкрд▓реНрд╕ рдФрд░ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдзрдиреНрдпрд╡рд╛рдж! рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдХрд╣рд╛, рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕реЛрдЪрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдЧрд▓рдд рдереАред

@tooolbox рдореИрдВ рдХреБрдЫ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣рд╛рдВ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдЕрдирд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддрд░рд╣ рдЕрдирд╛рдо рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдХрдореА рд╣реИред

рдбреНрд░рд╛рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИред рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдЕрдирд╛рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╡рд░реНрдмреЛрдЬрд╝ рд╢реИрд▓реА рдореЗрдВ рднреА рдЕрдиреБрдмрдВрдз рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

func f1(type A, B, C, D contract {
    C1(A)
    C2(A, B)
    C3(A, C)
}) (a A, b B, c C, d D)

// Or a more verbose style

func f2(type A, B, C, D (contract (_A, _B, _C) {
    C1(_A)
    C2(_A, _B)
    C3(_A, _C)
})(A, B, C)) (a A, b B, c C, d D)

IMO, рдпрд╣ рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИ, рдФрд░ рд╣рдо рдЕрднреА рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЧреЛ рдкрд╣рд▓реЗ рд╕реНрдирд┐рдкреЗрдЯ рдХреА рддрд░рд╣ рдЕрдиреБрдмрдВрдз рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪреАрдиреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

func fff(type A C1(A), B C2(B, A), C C3(B, C, A)) (a A, b B, c C)

// is more verbose than

func fff(type A, B, C contract {
    C1(A)
    C2(B, A)
    C3(B, C, A)
}) (a A, b B, c C)

рдЬрдм рдореИрдВ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд┐ рдХреЗ рдмрд┐рдирд╛ рдЖрд▓рд╕реА рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдХреБрдЫ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЬрдВрдЧ рдХреЗ рдЗрдЯрд░реЗрдЯрд░ рдХреА рддрд░рд╣ред

рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг Iterator рдЕрдиреБрдмрдВрдз рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

contract Iterator(T, E) {
    T Next() (E, bool)
}

рдЪреВрдВрдХрд┐ рдЧреЛ рдореЗрдВ type member рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ E рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рд░реЛрд╣

func Collect(type I, E Iterator) (input I) []E {
    var results []E
    for {
        e, ok := input.Next()
        if !ok {
            return results
        }
        results = append(results, e)
    }
}

рддрддреНрд╡реЛрдВ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди

contract MapIO(I, E, O, R) {
    Iterator(I, E)
    Iterator(O, R)
}

func Map(type I, E, O, R MapIO) (input I, f func (e E) R) O {
    return &lazyIterator(I, E, R){
        parent: input,
        f:      f,
    }
}

рдореБрдЭреЗ рдпрд╣рд╛рдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  1. рдореИрдВ рдпрд╣рд╛рдВ lazyIterator рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд╕рдВрдХрд▓рдХ рдХрд╣рддрд╛ рд╣реИ cannot convert &(lazyIterator(I, E, R) literal) (value of type *lazyIterator(I, E, R)) to O ред
  2. рдореБрдЭреЗ MapIO рдирд╛рдордХ рдПрдХ рдирдпрд╛ рдЕрдиреБрдмрдВрдз рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 4 рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдмрдХрд┐ Map рдХреЛ рдХреЗрд╡рд▓ 6 рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП Map рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ

type staticIterator(type E) struct {
    elem []E
}

func (it *(staticIterator(E))) Next() (E, bool) { panic("todo") }

func main() {
    inpuit := &staticIterator{
        elem: []int{1, 2, 3, 4},
    }
    mapped := Map(input, func (i int) float32 { return float32(i + 1) })
    fmt.Printf("%v\n", Collect(mapped))
}

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдВрдХрд▓рдХ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ

func main() {
    input := &staticIterator(int){
        elem: []int{1, 2, 3, 4},
    }
    mapped := Map(*staticIterator(int), int, *lazyIterator(*staticIterator(int), int, float32), float32)(input, func (i int) float32 { return float32(i + 1) })
    result := Collect(*lazyIterator(*staticIterator(int), int, float32), float32)(mapped)
    fmt.Printf("%v\n", result)
}

рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ, рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреЗрдд рд╣реИрдВред

BTW, рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕рд╕реЗ рдШрдмрд░рд╛рдПрдЧрд╛:

panic: interface conversion: ast.Expr is *ast.ParenExpr, not *ast.CallExpr

goroutine 1 [running]:
go/go2go.(*translator).instantiateTypeDecl(0xc000251950, 0x0, 0xc0001af860, 0xc0001a5dd0, 0xc00018ac90, 0x1, 0x1, 0xc00018bca0, 0x1, 0x1, ...)
        /home/tuzi/go-tip/src/go/go2go/instantiate.go:191 +0xd49
go/go2go.(*translator).translateTypeInstantiation(0xc000251950, 0xc000189380)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:671 +0x3f3
go/go2go.(*translator).translateExpr(0xc000251950, 0xc000189380)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:518 +0x501
go/go2go.(*translator).translateExpr(0xc000251950, 0xc0001af990)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:496 +0xe3
go/go2go.(*translator).translateExpr(0xc000251950, 0xc00018ace0)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:524 +0x1c3
go/go2go.(*translator).translateExprList(0xc000251950, 0xc00018ace0, 0x1, 0x1)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:593 +0x45
go/go2go.(*translator).translateStmt(0xc000251950, 0xc000189840)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:419 +0x26a
go/go2go.(*translator).translateBlockStmt(0xc000251950, 0xc00018d830)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:380 +0x52
go/go2go.(*translator).translateFuncDecl(0xc000251950, 0xc0001c0390)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:373 +0xbc
go/go2go.(*translator).translate(0xc000251950, 0xc0001b0400)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:301 +0x35c
go/go2go.rewriteAST(0xc000188280, 0xc000188240, 0x0, 0x0, 0xc0001f6280, 0xc0001b0400, 0x1, 0xc000195360, 0xc0001f6280)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:122 +0x101
go/go2go.RewriteBuffer(0xc000188240, 0x7ffe07d6c027, 0xa, 0xc0001ec000, 0x4fe, 0x6fe, 0x0, 0xc00011ed58, 0x40d288, 0x30, ...)
        /home/tuzi/go-tip/src/go/go2go/go2go.go:132 +0x2c6
main.translateFile(0xc000188240, 0x7ffe07d6c027, 0xa)
        /home/tuzi/go-tip/src/cmd/go2go/translate.go:26 +0xa9
main.main()
        /home/tuzi/go-tip/src/cmd/go2go/main.go:64 +0x434

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдЬреЛ Iterator рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред

type User struct {}

func UpdateUsers(type A Iterator(A, User)) (it A) bool { 
    // Access `User`'s field.
}

// And I found this may be possible

contract checkInts(A, B) {
    Iterator(A, B)
    B int
}

func CheckInts(type A, B checkInts) (it A) bool { panic("todo") }

рджреВрд╕рд░рд╛ рд╕реНрдирд┐рдкреЗрдЯ рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд B рдкреНрд░рдХрд╛рд░ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

type Iterator(type E) interface {
    Next() (E, bool)
}

рдореИрдВ рдмрд╕ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЧреЛ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рддрдирд╛ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИред

BTW, рдореИрдВ рдЬрд┐рд╕ рдЬрдВрдЧ рдХреЛрдб рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ

fn main() {
    let input = vec![1, 2, 3, 4];
    let mapped = input.iter().map(|x| x * 3);
    let result = f(mapped);
    println!("{:?}", result.collect::<Vec<_>>());
}

fn f<I: Iterator<Item = i32>>(it: I) -> impl Iterator<Item = f32> {
    it.map(|i| i as f32 * 2.0)
}

// The definition of `map` in stdlib is
pub struct Map<I, F> {
    iter: I,
    f: F,
}

fn map<B, F: FnMut(Self::Item) -> B>(self, f: F) -> Map<Self, F>

рдпрд╣рд╛рдБ https://github.com/golang/go/issues/15292#issuecomment -633233479 рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

  1. рд╣рдореЗрдВ existential type рдХреЛ func Collect(type I, E Iterator) (input I) []E . рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд╛рд╣рд┐рдП

    • рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд░рд┐рдорд╛рдгрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ E рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ E рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП type member рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    • рд╢рд╛рдпрдж рд╣рдо $#$7 func Consume(type I, E Iterator) (input I) #$ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреЗ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб ? existential type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо _ E , func Consume(type I Iterator(I, _)) (input I) $ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    • рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА Collect рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорд╛рди рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ E рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдВрдЧ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

    • рдпрд╛ рд╣рдо _ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдХрд▓рдХ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд▓рд╛рдкрддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рднрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ Collect(_, float32) (...) рдлреНрд▓реЛрдЯ32 рдХреЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдкрд░ рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

  1. existential type рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг, рд╣рдореЗрдВ func Map(type I, E, O, R MapIO) (input I, f func (e E) R) O рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ

    • impl Iterator<E> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрдВрдЧ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред рдпрджрд┐ рдЧреЛ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирдпрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

    • рдпрд╛ рд╣рдо рдмрд╕ рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рд░рд╕реНрдЯ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡рд╣ рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ existential type рд╕рдорд░реНрдерди рдХрд░реЗред рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ contract рдФрд░ interface рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рд░реВрдкрд╛рдВрддрд░рдг рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рджреЗрдВред рдЕрдиреНрдпрдерд╛, рд╣рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде contract рдФрд░ interface рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

    • рдЕрдиреНрдпрдерд╛ рд╣рдо рдХреЗрд╡рд▓ рд╕реАрдкреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд░рд┐рдЯрд░реНрди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЗрдирдкреБрдЯ рд╕реВрдЪреА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, func Map(type I, E, O, R MapIO) (input I, f func (e E) R, f1 func (outout O)) ред рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ Map рдкрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ O рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкрдХрдбрд╝рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдорд╕реМрджрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реА рдХрдард┐рдирд╛рдИ рдмрдиреА рд╣реБрдИ рд╣реИрдВред рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдмрдЪрдиреЗ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ: # 32863 - рд╢рд╛рдпрдж рдпрд╣ рдХреБрдЫ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЕрд╕реЗрдВрдмрд▓реА рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдореЗрд░реА рд╕рдордЭ рдореЗрдВ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдзреНрдпрд╛рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреА рд╢реБрджреНрдзрддрд╛ рдкрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред

рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ рдлреЗрджрд░рд╡реЗрдЯ рдЧреЛ рдкрд░ рдПрдХ рдкреЗрдкрд░ рдЖрд░реНрдХреНрд╕рд┐рд╡ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рдерд╛ рдФрд░ рдпрд╣ рдЧреЛ рдЯреАрдо рдФрд░ рдЯрд╛рдЗрдк рдереНрдпреЛрд░реА рдкрд░ рдХрдИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рд╣рдпреЛрдЧ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдирд╕ рдореЗрдВ рдФрд░ рднреА рдирд┐рдпреЛрдЬрд┐рдд рдХрд╛рдЧрдЬрд╛рдд рд╣реИрдВред

рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рд╕рд┐рджреНрдзрд┐ рдХреЗ рдлрд┐рд▓ рд╡рд╛рдбрд▓рд░ рдФрд░ рдХрд╛рдЧрдЬ рдкрд░ рд▓реЗрдЦрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рд╕реЛрдорд╡рд╛рд░, рдЬреВрди 8th @ 7am PDT / 10am EDT рдкрд░ "рдлреЗрджрд░рд╡реЗрдЯ рдЧреЛ" рдкрд░ рдПрдХ рд╡рд╛рд░реНрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ: http://chalmersfp.org/ . рдпреВрдЯреНрдпреВрдм рд▓рд┐рдВрдХ

@rcoreilly рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ "рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ" рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрдм рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рдорд╕реМрджреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ред рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЙрд╕рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдмрд╕ рд╡рд╣реА рд╣реИ рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рдЙрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдо рдЕрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗред

рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рд╕рд┐рджреНрдзрд┐ рдХреЗ рдлрд┐рд▓ рд╡рд╛рдбрд▓рд░ рдФрд░ рдХрд╛рдЧрдЬ рдкрд░ рд▓реЗрдЦрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рд╕реЛрдорд╡рд╛рд░ рдХреЛ "рдлреЗрджрд░рд╡реЗрдЯ рдЧреЛ" рдкрд░ рдПрдХ рд╡рд╛рд░реНрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ

рдлрд┐рд▓ рд╡рд╛рдбрд▓рд░ рдХреА рдмрд╛рдд рдмрд╣реБрдд рд╣реА рдЖрдХрд░реНрд╖рдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдереАред рдореИрдВ рдЙрд╕ рд╡реНрдпрд░реНрде рдХреА рдШрдВрдЯреЗ-рд▓рдВрдмреА рд╕рдордп рд╕реАрдорд╛ рд╕реЗ рдирд╛рд░рд╛рдЬрд╝ рдерд╛ рдЬрд┐рд╕рдиреЗ рдЙрд╕реЗ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдерд╛ред

рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдкрд╛рдЗрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдбрд▓рд░ рдХреЛ рдкреЙрдк рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛; рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдмреЗрд▓ рд▓реИрдмреНрд╕ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВред рдореЗрд░реЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрд▓рдЧ рд╕реЗрдЯ рд╣реИ, рдФрд░ рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ (рдирд┐рд░реНрдорд╛рддрд╛? рдкреНрд░рдореБрдЦ рдбрд┐рдЬрд╛рдЗрдирд░?) рдЧреЛ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдЗрди рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реЛрдЪрддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд▓реЗрдиреЗ рдФрд░ рдЙрд╕ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд╛рдзрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред

рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдЧреЛ рдЯреАрдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ рдпрд╛ рдЗрд╕рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ! рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдЗрд╕ рдмреАрдЪ, рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?

package graph

type Node(type e) interface{
    Edges() []e
}

type Edge(type n) interface{
    Nodes() (from n, to n)
}

type Graph(type n Node(e), e Edge(n)) struct { ... }
func New(type n Node(e), e Edge(n))(nodes []n) *Graph(n, e) { ... }
func (g *Graph(type n Node(e), e Edge(n))) ShortestPath(from, to n) []e { ... }

рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╣ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ? рдореБрдЭреЗ рднреА рдРрд╕рд╛ рд╣реА рд▓рдЧрддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ ... рдмреБрд░рд╛ рдирд╣реАрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рд╣рдХрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рдХрд╛рдлреА рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИред рдореЗрд░реЗ рднреАрддрд░ рдХреБрдЫ рдЕрдирд╛рдо рдЙрдерд▓-рдкреБрдерд▓ рд╢рд╛рдВрдд рд╣реЛ рдЧрдИ рд╣реИред

@urandom рд╕реЗ рд╕реНрдЯреИрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? ( interface{} рд╕реЗ Any рдХреЛ рдЕрд▓рд┐рдпрд╛рд╕ рдХрд░рдирд╛ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЕрдиреБрдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред)

package main

type Any interface{}

type Stack(type t Any) []t

func (s Stack(type t Any)) Peek() t {
    return s[len(s)-1]
}

func (s *Stack(type t Any)) Pop() {
    *s = (*s)[:len(*s)-1]
}

func (s *Stack(type t Any)) Push(value t) {
    *s = append(*s, value)
}

type StackIterator(type t Any) struct{
    stack Stack(t)
    current int
}

func (s *Stack(type t Any)) Iter() *StackIterator(t) {
    it := StackIterator(t){stack: *s, current: len(*s)}

    return &it
}

func (i *StackIterator(type t Any)) Next() (bool) { 
    i.current--

    if i.current < 0 { 
        return false
    }

    return true
}

func (i *StackIterator(type t Any)) Value() t {
    if i.current < 0 {
        var zero t
        return zero
    }

    return i.stack[i.current]
}

type Iterator(type t Any) interface {
    Next() bool
    Value() t
}

func Map(type t Any, u Any)(it Iterator(t), mapF func(t) u) Iterator(u) {
    return mapIt(t, u){it, mapF}
}

type mapIt(type t Any, u Any) struct {
    parent Iterator(t)
    mapF func(t) u
}

func (i mapIt(type t Any, u Any)) Next() bool {
    return i.parent.Next()
}

func (i mapIt(type t Any, u Any)) Value() u {
    return i.mapF(i.parent.Value())
}

func Filter(type t Any)(it Iterator(t), predicate func(t) bool) Iterator(t) {
    return filter(t){it, predicate}
}

type filter(type t Any) struct {
    parent Iterator(t)
    predicateF func(t) bool
}

func (i filter(type t Any)) Next() bool {
    if !i.parent.Next() {
        return false
    }

    n := true
    for n && !i.predicateF(i.parent.Value()) {
        n = i.parent.Next()
    }

    return n
}

func (i filter(type t Any)) Value() t {
    return i.parent.Value()
}

func Distinct(type t comparable)(it Iterator(t)) Iterator(t) {
    return distinct(t){it, map[t]struct{}{}}
}

type distinct(type t comparable) struct {
    parent Iterator(t)
    set map[t]struct{}
}

func (i distinct(type t Any)) Next() bool {
    if !i.parent.Next() {
        return false
    }

    n := true
    for n {
        _, ok := i.set[i.parent.Value()]
        if !ok {
            i.set[i.parent.Value()] = struct{}{}
            break
        }
        n = i.parent.Next()
    }


    return n
}

func (i distinct(type t Any)) Value() t {
    return i.parent.Value()
}

func ToSlice(type t Any)(it Iterator(t)) []t {
    var res []t

    for it.Next() {
        res = append(res, it.Value())
    }

    return res
}

func ToSet(type t comparable)(it Iterator(t)) map[t]struct{} {
    var res map[t]struct{}

    for it.Next() {
        res[it.Value()] = struct{}{}
    }

    return res
}

func Reduce(type t Any)(it Iterator(t), id t, acc func(a, b t) t) t {
    for it.Next() {
        id = acc(id, it.Value())
    }

    return id
}

func main() {
    var stack Stack(string)
    stack.Push("foo")
    stack.Push("bar")
    stack.Pop()
    stack.Push("alpha")
    stack.Push("beta")
    stack.Push("foo")
    stack.Push("gamma")
    stack.Push("beta")
    stack.Push("delta")


    var it Iterator(string) = stack.Iter()

    it = Filter(string)(it, func(s string) bool {
        return s == "foo" || s == "beta" || s == "delta"
    })

    it = Map(string, string)(it, func(s string) string {
        return s + ":1"
    })

    it = Distinct(string)(it)

    println(Reduce(it, "", func(a, b string) string {
        if a == "" {
            return b
        }
        return a + ":" + b
    }))


}

рдРрд╕рд╛ рдХреБрдЫ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдЙрд╕ рдХреЛрдб рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдлрдЬреАрдЬреА-рд╢реИрд▓реА рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдПрдХ рдкрд▓ рдореЗрдВ рдирд┐рдкрдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВред

рдЫрд╛рдкреЗ:

  • рдореБрдЭреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╢реИрд▓реА рдкрд╕рдВрдж рд╣реИред рдпрд╛рдиреА "рдЯрд╛рдЗрдк" рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ("type" param paramType, param paramType...) рдХреЗ рдмрдЬрд╛рдп (param, param) рдХреЗ рдкреНрд░рдХрд╛рд░ рдмрддрд╛рддреЗ рд╣реБрдПред рдпрд╣ рдЗрд╕реЗ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рд╕реБрд╕рдВрдЧрдд рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдЕрдзрд┐рдХ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
  • рдореБрдЭреЗ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЛрдЕрд░рдХреЗрд╕ рд╣реЛрдирд╛ рдкрд╕рдВрдж рд╣реИред рдЧреЛ рдореЗрдВ рд╕рд┐рдВрдЧрд▓-рд▓реЗрдЯрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рдЕрддреНрдпрдзрд┐рдХ рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреИрдкрд┐рдЯрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЬрдм рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡реЗ рд╡рд┐рдкрд░реАрдд рд▓рдЧрддреЗ рд╣реИрдВред рд▓реЛрдЕрд░рдХреЗрд╕ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди/рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реИрдВред

рдареАрдХ рд╣реИ, рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдЦреИрд░, рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ Stringer рдЕрдЫреВрддрд╛ рд╣реИ; рдЖрдкрдХреЗ рдкрд╛рд╕ Stringer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ Stringer рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

type Stringer interface {
    String() string
}

func Stringify(type t Stringer)(s []t) (ret []string) {
    for _, v := range s {
        ret = append(ret, v.String())
    }
    return ret
}

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ viaStrings рдЙрджрд╛рд╣рд░рдг рднреА рд╣реИ:

type ToString interface {
    Set(string)
}

type FromString interface {
    String() string
}

func SetViaStrings(type to ToString, from FromString)(s []from) []to {
    r := make([]to, len(s))
    for i, v := range s {
        r[i].Set(v.String())
    }
    return r
}

рджрд┐рд▓рдЪрд╕реНрдкред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдиреБрдмрдВрдз рдиреЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ред рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рдирд┐рдпрдо рдерд╛ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкреЗрдкрд░/рдЯреЙрдХ рдореЗрдВ рдЗрдХреНрд╡рд▓ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

contract equal(T) {
    T Equal(T) bool
}

// becomes

type equal(type t equal(t)) interface{
    Equal(t) bool
}

рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдореИрдВ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕реБрдВрджрд░ рд╣реВрдВред рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╣реА рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ "рдмреЙрдХреНрд╕рд┐рдВрдЧ" рдирд╣реАрдВ рд╣реИ - рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдЖрдк рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рд╕рдмрд╕реЗ рдмрдбрд╝реА рдмрд╛рдд рдЬреЛ рдореИрдВрдиреЗ рдиреЛрдЯ рдХреА рд╣реИ, рдЬреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ, рд╡рд╣ рд╣реИ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдзреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдиред рдЦреИрд░, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдгрдиреАрддрд┐ рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЖрдПрдВрдЧреА :

8 - рдирд┐рд╖реНрдХрд░реНрд╖

рдпрд╣ рдХрд╣рд╛рдиреА рдХреА рд╢реБрд░реБрдЖрдд рд╣реИ, рдЕрдВрдд рдирд╣реАрдВред рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рдо рдореЗрдВ, рд╣рдо рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ .NET рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдПрдХ рдорд┐рд╢реНрд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреЛ рдХрднреА-рдХрднреА рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рд░рдирдЯрд╛рдЗрдо рдкреНрд░рд╕реНрддреБрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реЗ .NET рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлреЗрджрд░рд╡реЗрдЯ рдЧреЛ рдЧреЛ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рддрдХ рд╣реА рд╕реАрдорд┐рдд рд╣реИред рд╣рдо рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдПрд░реЗрдЬрд╝, рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдкреИрдХреЗрдЬ рдЬреИрд╕реА рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдПрдХ рдореЙрдбрд▓ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдмреИрдВрдЯрдорд╡реЗрдЯ рдЧреЛ рдирд╛рдо рджреЗрдВрдЧреЗ; рдФрд░ рдЧреЛ рдХреЗ рдЕрднрд┐рдирд╡ рд╕рдорд╡рд░реНрддреА рддрдВрддреНрд░ рдХрд╛ рдПрдХ рдореЙрдбрд▓ рдЬреЛ "рдЧреЛрд░рдЖрдЙрдЯреНрд╕" рдФрд░ рд╕рдВрджреЗрд╢ рдкрд╛рд╕рд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдХреНрд░реВрдЬрд╝рд╡реЗрдЯ рдЧреЛ рдХрд░рд╛рд░ рджреЗрдВрдЧреЗред

рдлреЗрджрд░рд╡реЗрдЯ рдЧреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ред рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреА рд╡рдХрд╛рд▓рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдпрд╣ рд╕реБрдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рдЯрд╛рдЗрдк рдереНрдпреЛрд░реА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЗрд╕ рдкрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ!

рдпрд╣ рдореЗрд░реЗ рдкреБрд░рд╛рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди (рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рджрд┐рдЦрддрд╛ рд╣реИ "рдЕрдиреБрдмрдВрдз рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ" https://github.com/cosmos72/gomacro/blob/master/doc/generics-cti.md

@tooolbox
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ (рд╕рд╛рде рд╣реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░, FGG рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЦреЛрд▓рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдмрдВрдз рдорд╕реМрджреЗ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рдереЗред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдлрдЬреАрдЬреА рдХреЗ рд╕рд╛рде, рдПрдХ рдЗрдЯрд░реЗрдЯрд░ рдФрд░ рдПрдХ рд░рд┐рд╡рд░реНрд╕рд┐рдмрд▓ рдЗрдЯрд░реЗрдЯрд░ рджреЛрдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдФрд░ рдЯрд░реНрдорд┐рдиреЗрдЯрд┐рдВрдЧ рдЗрдЯрд░реЗрдЯрд░реНрд╕ (рдорд╛рдирдЪрд┐рддреНрд░, рдлрд╝рд┐рд▓реНрдЯрд░ рдХрдо рдХрд░рдирд╛) рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЗрдХреНрд╕реНрдЯ() рдФрд░ рдиреЗрдХреНрд╕реНрдЯрдлреНрд░реЙрдордмреИрдХ() рд░рд┐рд╡рд░реНрд╕рд┐рдмрд▓ рдХреЗ рд▓рд┐рдП) , рдкреИрд░реЗрдВрдЯ рдЗрдЯрд░реЗрдЯрд░ рдХреНрдпрд╛ рд╣реИ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдлрдЬреАрдЬреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдЧреЛ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдЦрддреНрдо рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдЙрди рдкрд░ рдПрдХ рдЯреЗрдХ рд╣реИ, рдмрд╛рд╣рд░ рд╕реЗред рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЕрдЦрдмрд╛рд░ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рд╕рд┐рд░реНрдл рдмрд╛рддрдЪреАрдд рджреЗрдЦреА рд╣реИред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП: рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реАрдХреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ FGG рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╕реМрджреЗ рдкрд░ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╢рдХреНрддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

  1. рдпрд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдирдП рдкреНрд░рдХрд╛рд░-рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рд░реНрддрд╛ рдореЗрдВ "рд╕реВрдЪреА рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░" рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред AFAICT рдпрд╣ Functor рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЙрд╕рдХрд╛ рд╕реВрдЪреА рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ), Monad рдФрд░ рдЙрдирдХреЗ рджреЛрд╕реНрддред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдЧреЛрдлрд░реНрд╕ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдлреНрд▓реВрдо рдХрд╛ рдЧреЛ рдкреЛрд░реНрдЯ рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛)ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрджрд▓рд╛рд╡ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЕрднреА рддрдХ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреНрдпрд╛ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ - рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд░рд┐рд╕реАрд╡рд░ рдореЗрдВ рднреА рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рдпрд╣ рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдЯрд╛рдЗрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдЦреНрдд рд╕реАрдорд╛ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рджреВрд╕рд░реЛрдВ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрджрд▓рд╛рд╡ рд╣реИред рдпрд╣ рднреНрд░рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдиреБрд╕реНрдЦрд╛ рд▓рдЧрддрд╛ рд╣реИ, Map(int, T) рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЬреЛ Map(string, T) рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред рдЕрдЧрд░ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЙрддреНрдХреГрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдмреАрдЪ, рд▓рд╛рдн рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЫреЛрдЯрд╛ рд▓рдЧрддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдмрд╛рдд (рдЕрд▓рдЧ рд╕рдВрдХрд▓рди) рд╕реЗ рдкреНрд░реЗрд░рдХ рдХрд╛рд░рдХ рдЧреЛ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ: рдЬреИрд╕рд╛ рдХрд┐ рдЙрд╕реА рдкреИрдХреЗрдЬ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдкреИрдХреЗрдЬ рдЗрдХрд╛рдИ рд╣реИрдВ рд╕рдВрдХрд▓рди рдХреЗ, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд▓рдЧ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╛рд░ рд▓рд╛рдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдареЛрд╕ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд▓рд╛рдн рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рдЪрд░рдгреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ :)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдлрдЬреАрдЬреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдЧреЛ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдЦрддреНрдо рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

@Merovius рдЖрдк рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ?

@arl
FG рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдкрд░ рдПрдХ рд╢реЛрдз рдкрддреНрд░ рд╣реИред рдХрд┐рд╕реА рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЧреЛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рднрд▓реЗ рд╣реА 2 рдЧреЛ рдХреЛрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреЗрдкрд░ рдореЗрдВ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЧреЛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдлрдЬреАрдЬреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдЧреЛ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдЦрддреНрдо рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдЙрди рдкрд░ рдПрдХ рдЯреЗрдХ рд╣реИ, рдмрд╛рд╣рд░ рд╕реЗред рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред

рд╣рд╛рдБ, рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБред

рд╕рд╛рде рд╣реА, рдореИрдВ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ рдХрд┐ рд╡рд╛рдбрд▓рд░ рдПрдХ рдЯреАрдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдЙрддреНрдкрд╛рдж рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрдмрдВрдз рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ, рдЬреЛ рдХрд┐ рдХреЛрд░ рджреЗрд╡реЛрдВ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ (рд╕рд╛рде рд╣реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░, FGG рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЦреЛрд▓рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдмрдВрдз рдорд╕реМрджреЗ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рдирд╣реАрдВ рдереЗред ...

@urandom рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдЗрдЯрд░реЗрдЯрд░ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ; рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдПрдХ рд╕рд╛рде рдлреЗрдВрдХрдиреЗ рдХрд╛ рдорди рдХрд░реЗрдВрдЧреЗ?

рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдирдХреНрд╢реЗ рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪреАрдЬреЛрдВ рд╕реЗ рдкрд░реЗ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХ рдЙрддреНрд╕реБрдХ рд╣реИрдВ рдХрд┐ рд╡реЗ k8s рдЬреИрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреА рдХрдореА рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлреИрдВрд╕реА рдлреБрдЯрд╡рд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде? рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХреЛрдИ рднреА рдореБрдЭреЗ рд╕рд╣реА рдХрд░ рд╕рдХрддрд╛ рд╣реИред)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ - рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд░рд┐рд╕реАрд╡рд░ рдореЗрдВ рднреА рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╢рд╛рдпрдж gofmt рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рд╢рд╛рдпрдж рд╣рдореЗрдВ рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╢рд╛рдпрдж рд╕рд╛рде рдЦреЗрд▓рдиреЗ рд▓рд╛рдпрдХред

рдЬреИрд╕рд╛ рдХрд┐ рджреВрд╕рд░реЛрдВ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ @Merovius

рдЗрд╕реЗ рд╡реИрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдЙрд╕реЗ рдЕрдкрдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЗрдореЗрдЯрд┐рдХ рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ/рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рдЬреИрд╕рд╛ рдХрд┐ рджреВрд╕рд░реЛрдВ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ @Merovius

рдЗрд╕реЗ рд╡реИрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдЙрд╕реЗ рдЕрдкрдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЗрдореЗрдЯрд┐рдХ рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ/рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреБрдЫ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://blog.merovius.de/2017/07/30/the-trouble-with-Optional-interfaces.html

@ рдЯреВрд▓рдмреЙрдХреНрд╕

рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪреАрдЬреЛрдВ рд╕реЗ рдкрд░реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ "рдирдХреНрд╢реЗ рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪреАрдЬреЗрдВ" рдмреЗрдЪрдиреЗ рдХреА рддрд░рд╣ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛-рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ map рдФрд░ filter рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдореИрдВ рдлреЙрд░-рд▓реВрдк рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ)ред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

  1. рдХрд┐рд╕реА рднреА рддреГрддреАрдп-рдкрдХреНрд╖ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред рдпрд╛рдиреА map рдФрд░ filter рдХреЛ рдЬреЗрдиреЗрд░рд┐рдХ рдЯреНрд░реА, рдпрд╛ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рдореИрдкреНрд╕, рдпрд╛тАж рдкрд░ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ, рдЖрдк рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдореИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд
  2. рдЖрдк рд╕реНрд╡реИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдореИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк Compose рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрдИ рдЧреЛрд░рдЖрдЙрдЯреНрд╕ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд╕рдорд╡рд░реНрддреА рдбреЗрдЯрд╛-рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЪрд▓рд╛рдирд╛ рдФрд░ рдмреЙрдЯрд▓-рдиреЗрдХ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬрдмрдХрд┐ рдХреЗрд╡рд▓ func(A) B s рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╛ рдЖрдк рдЙрдиреНрд╣реАрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдврд╛рдВрдЪреЗ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╣рдЬрд╛рд░реЛрдВ рдкреНрд░рддрд┐рдпрд╛рдВ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЙрди рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдмреИрдЪреЛрдВ рдХреЛ рд╢реЗрдбреНрдпреВрд▓ рдХрд░рддрд╛ рд╣реИ (рдЬрдм рдореИрдВрдиреЗ рдКрдкрд░ рдлреНрд▓реВрдо рд╕реЗ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдерд╛ рддреЛ рдореИрдВрдиреЗ рдпрд╣реА рдХрд╣рд╛ рдерд╛)ред

рдЗрд╕рд▓рд┐рдП, Map рдФрд░ Filter рдФрд░ Reduce рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рд╕рддрд╣ рдкрд░ рдЙрдмрд╛рдК рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣реА рддрдХрдиреАрдХ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдЧрдгрдирд╛ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд╛рдХрдИ рд░реЛрдорд╛рдВрдЪрдХ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЦреЛрд▓рддреА рд╣реИред

@ChrisHines

рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреБрдЫ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://blog.merovius.de/2017/07/30/the-trouble-with-Optional-interfaces.html

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗред рдпрджрд┐ рдЖрдк ResponseWriter рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп, рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд░реИрдкрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд┐рдкрдЯреЗ рд╣реБрдП ResponseWriter рдХреЗ рд╕рдорд░реНрдерди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рднрд▓реЗ рд╣реА рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ , рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдЬрдм рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдЖрдк рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рдЙрди рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЖрдк рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдордзреНрдп-рд╡реЗрдпрд░ рдЕрднреА рднреА рдХреБрдЫ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдореБрдЦреМрдЯрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╕рд┐рд░реНрдл рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рди рдЬрд╛рдирдиреЗ рд╕реЗред рдЗрд╕ рдмреАрдЪ, рдЖрдк (рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд┐рдирд╛ рднреА) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

type Middleware (type RW http.ResponseWriter) struct {
    RW
}

рдФрд░ рдЙрди рдЪреБрдирд┐рдВрджрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреА рдЖрдк рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ - рдФрд░ RW рдкреНрд░рдЪрд╛рд░рд┐рдд рдЕрдиреНрдп рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░реЗрдВред рддреЛ рдЖрдкрдХреЛ рд░реИрдкрд░ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рддрд░реАрдХреЗ рд╕реЗ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗред

рдЗрд╕рд▓рд┐рдП, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдкрд░ рдПрдореНрдмреЗрдбреЗрдб рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рдЪрд╛рд░рд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ (рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ), рд╕рдорд╕реНрдпрд╛ рдЙрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдмреЗрд╣рддрд░ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ http.ResponseWriter рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдзрд╛рди error.Is/As рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ ред рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, ResponseWriter рд░реИрдкрд┐рдВрдЧ рдХреА рдПрдХ рдорд╛рдирдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛрдбрд╝ рдФрд░ рдпрджрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХреЛрдИ ResponseWriters рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛, egwPushред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмреАрдЪ рд░рдирдЯрд╛рдЗрдо рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреБрд╢ рдХреЗрд╡рд▓ http2 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдпрджрд┐ рдореИрдВ http1 рд╕реНрдерд╛рдиреАрдп рджреЗрд╡ рд╕рд░реНрд╡рд░ рдХреЛ рдХрддрд╛рдИ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЧрд┐рдердм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрднреА рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХрд░реВрдБрдЧрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: #39558ред

@tooolbox
рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

package iter

type Any interface{}

type Iterator(type T Any) interface {
    Next() bool
    Value() T
}

type ReversibleIterator(type T Any) interface {
    Iterator(T)
    NextBack() bool
}

type mapIt(type I Iterator(T), T Any, U Any) struct {
    parent I
    mapF func(T) U
}

func (i mapIt(type I Iterator(T))) Next() bool {
    return i.parent.Next()
}

func (i mapIt(type I Iterator(T), T Any, U Any)) Value() U { 
    return i.mapF(i.parent.Value())
}

func (i mapIt(type I ReversibleIterator(T))) NextBack() bool { 
    return i.parent.NextBack()
}

// Monomorphisation
type mapIt<OnlyForward, int, float64> struct {
    parent OnlyForward,
    mapF func(int) float64
}

func (i mapIt<OnlyForward, int, float64>) Next() bool {
    return i.parent.Next()
}

func (i mapIt<OnlyForward, int, float64>) Value() float64 {
    return i.mapF(i.parent.Value())
}

type mapIt<Slice, int, string> struct {
    parent Slice,
    mapF func(int) string
}

func (i mapIt<Slice, int, string>) Next() bool {
    return i.parent.Next()
}

func (i mapIt<Slice, int, string>) Value() string {
    return i.mapF(i.parent.Value())
}

func (i mapIt<Slice, int, string>) NextBack() bool {
    return i.parent.NextBack()
}



рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХрд╛ рдореЗрд░рд╛ рдПрдХ рдЯреНрд╡реАрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЧреЛ рдореЗрдВ рдЗрдЯрд░реЗрдЯрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк <T> рдХреЛ (type T) рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рд╣реИ: https://twitter.com/rogpeppe/status/425035488425037824

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ "рдирдХреНрд╢реЗ рдФрд░ рдлрд┐рд▓реНрдЯрд░ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЪреАрдЬреЗрдВ" рдмреЗрдЪрдиреЗ рдХреА рддрд░рд╣ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдмрд┐рд▓реНрдЯрд┐рди рдбреЗрдЯрд╛-рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд░ рдирдХреНрд╢рд╛ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдореИрдВ рдлреЙрд░-рд▓реВрдк рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ)ред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...

рдореИрдВ рдЖрдкрдХреА рдмрд╛рдд рджреЗрдЦрддрд╛ рд╣реВрдВ рдФрд░ рдЕрд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ, рдФрд░ рд╣рд╛рдВ рд╣рдо рдЙрди рдЪреАрдЬреЛрдВ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ k8s рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдЧреА, рдпрд╛ "рдЬреЗрдиреЗрд░рд┐рдХ" рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреНрдп рдХреЛрдбрдмреЗрд╕ рдЬрд╣рд╛рдВ рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИрдВ, рд╡реЗ рдирдХреНрд╢реЗ рдпрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЙрд╕рд╕реЗ рдЖрдЧреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рдпрд╛ FGG рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдХрд┐рддрдиреЗ рдкреНрд░рднрд╛рд╡реА рд╣реИрдВред

рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдХреЛрдбрдмреЗрд╕ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ k8s рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ?

@urandom рд╡рд╛рд╣ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк mapIt рдХреЛ parent $ рдХреЗ рд╕рд╛рде рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ $# ReversibleIterator рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рддреЛ mapIt рдореЗрдВ NextBack() рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ ' рдЯреАред рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рд╕рд╣реА рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ?

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдХрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рдЙрдкрдпреЛрдЧреА-рдЖрд╢ рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ рдмрд╣реБрдд рдЦреБрд▓реЗ рд╣реИрдВ ( Any рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛) рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдЗрдВрдЯрд░рдлреЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╡рд╢ рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рдорд┐рд▓рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд╣ рд╕реЗрдЯ рдХреНрдпрд╛ рд╣реИ, рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

... рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ChrisHines рдиреЗ рдЬреЛ рдХреБрдЫ рд▓рд╛рдпрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рдЖрдк рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдмрдврд╝рдиреЗ рдпрд╛ рдШрдЯрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ, рддреЛ рд╣рд╛рдБ, рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ http2 рдЕрдкрд╣рд░реНрддрд╛ рдЪреАрдЬрд╝ рдХреЛ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред

рд╡реИрд╕реЗ рднреА, рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкред

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдРрд╕рд╛ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛:

type OverrideX interface {
    GetX() int
}

type OverrideY interface {
    GetY() int
}

type Inheritor(type child Any) struct {
    Parent
    c child
}

func (i Inheritor(type child OverrideX)) GetX() int {
    return i.c.GetX()
}

func (i Inheritor(type child OverrideY)) GetY() int {
    return i.c.GetY()
}

type Parent struct {
    x, y int
}

func (p Parent) GetX() int {
    return p.x
}

func (p Parent) GetY() int {
    return p.y
}

type Child struct {
    x int
}

func (c Child) GetX() int {
    return c.x
}

func main() {
    i := Inheritor(Child){Parent{5, 6}, Child{3}}
    x, y := i.GetX(), i.GetY() // 3, 6
}

рдлрд┐рд░ рд╕реЗ, рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рдордЬрд╛рдХ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рд╕рдВрднрд╡ рд╣реИ рдЙрд╕рдХреА рд╕реАрдорд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдЪрдПрдо, рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдкрд░рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди Parent рдореЗрдВ Child рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╕рдЯреАрдХ рдкреНрд░рднрд╛рд╡ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░, рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг;)

рдореИрдВ рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред @tooolbox рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд░реНрдж рд╣реЛрдЧрд╛ рдХрд┐ рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдЪреНрдЪреЗ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ - рдкрд░реАрдХреНрд╖рдХ рдХреЛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╡рд┐рдзрд┐рдпрд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдФрд░ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреАрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЧреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рдХреЗ рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

func (i Inheritor(type child Any)) GetX() int {
    if c, ok := i.c.(OverrideX); ok {
        return c.GetX()
    }
    return i.Parent.GetX()
}

func (i Inheritor(type child Any)) GetY() int {
    if c, ok := i.c.(OverrideY); ok {
        return c.GetY()
    }
    return i.Parent.GetY()
} 

рдпрд╣ рдХреЛрдб рднреА рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд, рд╕реНрдкрд╖реНрдЯ, рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреНрд░рдо рдХреЗ рдореВрд▓ рдХреЗ рд╕рдорд╛рди рдЪрд▓рддрд╛ рд╣реИред

@TotallyGamerJet
рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреНрдп рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЕрд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд░рдирдЯрд╛рдЗрдо рдкреИрдирд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдХ рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдХреЛ рдХреИрд╕реЗ рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╡реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд▓рд┐рдЦрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреАрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдзреНрдпрд╛рди рд░рдЦреЗрдВ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рд╡рд┐рдзрд┐ рдХреЛ рдпрд╛ рддреЛ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЗ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдЫреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдИ рднреА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

@urandom рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдорд╛рдорд▓реЗ рдХреЛ рдпрд╛рдж рдХрд░реЗрдЧрд╛ - рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдХреЗ рдЦрдбрд╝рд╛ рд╣реВрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ)ред рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдХрдерди рдпрд╛ рдЙрдк-рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдорд╕реНрдпрд╛" рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред рдРрд╕реЗ:

type Any interface {}

type Evaler(type t Any) interface {
    Eval() t
}

type Num struct {
    value int
}

func (n Num) Eval() int {
    return n.value
}

type Plus(type a Evaler(type t Any)) struct {
    left a
    right a
}

func (p Plus(type a Evaler(type t Any)) Eval() t {
    return p.left.Eval() + p.right.Eval()
}

func (p Plus(type a Evaler(type t Any)) String() string {
    return fmt.Sprintf("(%s+%s)", p.left, p.right)
}

type Expr interface {
    Evaler
    fmt.Stringer
}

func main() {
    var e Expr = Plus(Num){Num{1}, Num{2}}
    var v int = e.Eval() // 3
    var s string = e.String() // "(1+2)"
}

Eval рд╡рд┐рдзрд┐ рдХрд╛ рдХреЛрдИ рднреА рджреБрд░реБрдкрдпреЛрдЧ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрдХрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг Eval рдХреЛ Plus рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдЯреНрд░рд┐рдВрдЧ () (рд╕рдВрднрд╡рддрдГ рд╕рдВрд░рдЪрдирд╛ рдЬреЛрдбрд╝рдирд╛) рдХрд╛ рдЕрдиреБрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЕрдЪреНрдЫрд╛ рдкрд░реАрдХреНрд╖рдг рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЧреЛ рдЖрдорддреМрд░ рдкрд░ "рд╢реБрджреНрдзрддрд╛" рдкрд░ рд╕рд╛рджрдЧреА рдХреЛ рдЕрдкрдирд╛рддрд╛ рд╣реИред рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рднреНрд░рдо рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рдЕрд╕рдВрдмрджреНрдз рд╣реВрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдлрд┐рдХреНрд╕реНрдб рдЧрд▓рддреА рдФрд░ рд╕реБрдзрд╛рд░

@TotallyGamerJet рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ Eval

@TotallyGamerJet рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ Eval

@рдЬрд╛рджреБрдИ
рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдкреНрд▓рд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЗрд╡реЗрд▓рд░ рд╣реИ рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ fmt.Stringer рд╕рдВрддреБрд╖реНрдЯ рд╣реИред рджреЛрдиреЛрдВ рдЗрд╡рд▓рд░реНрд╕ рдкрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реЗрдл рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@TotallyGamerJet
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рджрд╕реНрдпреЛрдВ рдкрд░ рдХрд┐рд╕реА рднреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рдШрдмрд░рд╛рд╣рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрджрд┐ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ a рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рд╣реИ

@urandom
рдареАрдХ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдЖрдк! рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдкреНрд░рд┐рдВрдЯрдл рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░реЗрдЧрд╛ред рддреЛ, рдЖрдк рдХреЗрд╡рд▓ рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдпрджреНрдпрдкрд┐ рдпрд╣ рдЕрднреА рднреА рдШрдмрд░рд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд▓рд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧрд░ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП %v рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрддрдВрдХ рд╕реЗ рдмрдЪрдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ ( ) рдЕрдЧрд░ рд╣реЛ рддреЛ)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛рдУрдВ рдХреЛ рдХреЛрдб рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрднреА рднреА рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИред

@TotallyGamerJet
рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рд╡рд┐рднрд┐рдиреНрди рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ рддреЛ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╡рд┐рдзрд┐ рдЕрднреА рднреА рд╣реИ, рдФрд░ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рддрд░реНрдХ (рдФрд░ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рд░рд┐рд╕реАрд╡рд░) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЬрд┐рд╕ рддрд░рд╣ рдПрдХ рд╡рд┐рдзрд┐ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, string рддрд░реНрдХ, рдпрд╛ MyType рд░рд┐рд╕реАрд╡рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдардиреАрдп рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рднреА рд╣реЛрдЧреА:

func (rec MyType(type T SomeInterface(T)) Foo() T

рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред IE рдпрд╣ MyType(type T SomeInterface(T)) рдХрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред

рдмрджрд▓реЗрдВ https://golang.org/cl/238003 рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ: design: add go2draft-type-parameters.md

рдмрджрд▓реЗрдВ https://golang.org/cl/238241 рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ: content: add generics-next-step article

рдХреНрд░рд┐рд╕рдорд╕ рдЬрд▓реНрджреА рд╣реИ!

  • рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕реБрд▓рдн рдмрдирд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рдЧрдП, рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдФрд░ рдмрд╣реБрдд рд╕рд░рд╛рд╣рдиреАрдп рд╣реИред
  • рдпрд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрд░реА рджреГрд╖реНрдЯрд┐ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ред
  • рд╕рднреА рддрд░реНрдХреЛрдВ рдФрд░ рддрд░реНрдХреЛрдВ рд╕реЗ рдХрд╛рдлреА рд╣рдж рддрдХ рд╕рд╣рдордд рд╣реИрдВред
  • рдЙрд╕реА рддрд░рд╣, рдпрджрд┐ рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдзрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  • рддреБрд▓рдиреАрдп рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред
  • рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдЯрд╛рдЗрдк рд╕реВрдЪрд┐рдпрд╛рдВ рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИрдВ; рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдСрдкрд░реЗрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдпрд╣ рд╢рд╛рдпрдж рдЖрдЧреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИред
  • рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди (рдЕрднреА рднреА) рдорд╣рд╛рди рд╣реИред
  • рдПрдХрд▓-рддрд░реНрдХ рдкреНрд░рдХрд╛рд░-рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рди рд╕реНрдкрд╖реНрдЯрддрд╛ рдкрд░ рдЪрддреБрд░рд╛рдИ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред
  • рдореБрдЭреЗ рдЧреНрд░рд╛рдл рдЙрджрд╛рд╣рд░рдг рдореЗрдВ "рд╣рдо рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рд╣реИ" рдкрд╕рдВрдж рд╣реИред рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред
  • (type *T constraint) рд╕реВрдЪрдХ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
  • func(x(T)) рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реИрдВред
  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрд▓реНрд▓реЗ рд╕реЗ рд╕рдордЧреНрд░ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдореИрдВ

рдЧреЛ рдЯреАрдо рдХреЛ рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ

https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md#comparable -types-in-constraints

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рддреБрд▓рдиреАрдп рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рддрд░рд╣ рд╣реИ, рдлрд┐рд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдорд╕реМрджреЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрдЧ рд╣реИред

type ComparableHasher interface {
    comparable
    Hash() uintptr
}

рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд

type ComparableHasher interface {
    type comparable
    Hash() uintptr
}

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдпрд╣ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ type comparable . рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
https://go2goplay.golang.org/p/mhrl0xYsMyj

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрдпрд╛рди рд▓рд╛рдВрд╕ рдЯреЗрд▓рд░ рдФрд░ рд░реЙрдмрд░реНрдЯ рдЧреНрд░рд┐рд╕реЗрдорд░ go2go рдЯреВрд▓ рдХреЛ рдареАрдХ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (go2go рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ рдЫреЛрдЯрд╛ рдмрдЧ рдерд╛, рдбреНрд░рд╛рдлреНрдЯ рдирд╣реАрдВред рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рд╕рд╣реА рдерд╛)

рдХреНрдпрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрд╢-рдЯреЗрдмрд▓ рдФрд░ рдЗрд╕реА рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? ISTM рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдмрд┐рд▓реНрдЯ-рдЗрди рдореИрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ)ред рдореВрд▓ рд░реВрдк рд╕реЗ, рдмрд┐рд▓реНрдЯрд┐рди рдореИрдк рдореЗрдВ рдХреБрдВрдЬреА-рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ comparable рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, == рдФрд░ != рд╣реИрд╢-рдЯреЗрдмрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреИрд╕реЗ ComparableHasher рдХреЗрд╡рд▓ рдХреЙрд▓рд░ рдХреЛ рд╣реИрд╢-рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ (рд╕рд╛рде рд╣реА, рдХреЙрд▓рд░ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рдЕрдЪреНрдЫрд╛ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдХрдард┐рди рд╣реИ)ред рдЕрдВрдд рдореЗрдВ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ uintptr рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд╕реА рдХреЛ рдкреЙрдЗрдиреНрдЯреА рдХреЛ рдЗрдзрд░-рдЙрдзрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдмрд╛рд▓реНрдЯреА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП (рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдПрдХ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд func hash(type T comparable)(v T) uintptr рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛)

рдореИрдВ рдПрдХ рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ "рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ" рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ :)

@gertcuykens рдореИрдВрдиреЗ рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ comparable рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП go2go рдЯреВрд▓ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИред

@Merovius рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╡реЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕рдВрднрд╡рддрдГ рдЙрдирдХрд╛ рдЕрдкрдирд╛ рддреБрд▓рдирд╛ рдлрд╝рдВрдХреНрд╢рдиред рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╕рдордп, https://golang.org/pkg/hash/maphash/ рдкреИрдХреЗрдЬ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдПрдХ рд╕реВрдЪрдХ рдорд╛рди рдХрд╛ рд╣реИрд╢ рдЙрд╕ рдорд╛рди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рд╕реВрдЪрдХ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ; рдпрд╣ uintptr рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕реВрдЪрдХ рдХреЗ рдореВрд▓реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдХрд░рдг рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдПрдХ рд╕реАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:
https://go2goplay.golang.org/p/KYRFL-vrcUF

рдореИрдВрдиреЗ рдХрд▓ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╡рд┐рд╢реНрд╡ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ ред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рд╣реИ рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рд░рджреНрджреАрдХрд░рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ errgroup рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ go2go рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛рдирд╛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд╛рдо)ред рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди:

  • рдпрд╣ рдХрд╛рдлреА рдордЬреЗрджрд╛рд░ рдерд╛ред рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЯрд╛рдЗрдк-рдЪреЗрдХрд░ рд╣реЛрдиреЗ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди-рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЯрд╛рдЗрдк-рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдХреЗ, рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реАред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕рд╣рд┐рдд рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо ~ 100 рдПрд▓рдУрд╕реА рд╣реИред рддреЛ, рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╕реБрдЦрдж рд╣реИ, рдЖрдИрдПрдордУред
  • рдпрд╣ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдХрдо рд╕реЗ рдХрдо рдЯрд╛рдЗрдк-рдЕрдиреБрдорд╛рди рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрддреНрдХрд╛рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред
  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░-рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛ред Compose рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЙрд▓реНрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ - рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рдж рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк Stage рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ func (s *Stage(A, B)) Compose(type C)(n int, f func(B) C) *Stage(A, C) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдЧрд┐рд░ рдЧрдпрд╛ рд╣реИ (рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ)ред рдореМрдЬреВрджрд╛ рдорд╕реМрджреЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдПрдкреАрдЖрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ - рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореБрдЭреЗ рдирдпрд╛ рдбреНрд░рд╛рдлреНрдЯ рдкрд╕рдВрдж рд╣реИ, рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ :) рдЖрдИрдПрдордУ рдбреНрд░реЙрдкрд┐рдВрдЧ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдПрдХ рд╕реБрдзрд╛рд░ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк-рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдирдпрд╛ рддрд░реАрдХрд╛ рднреА рд╣реИред

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рдПрдХ рдмрдЧ рдлрд┐рдХреНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди-рдЪрд░рдг рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдЧрддрд┐рд░реЛрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдХрдард┐рди рд╣реИ]

рдЯреВрд▓ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд┐рдо рдЧреЛ рд░рд┐рд▓реАрдЬрд╝ (рдЗрд╕рд▓рд┐рдП v1.15, v1.15.1, ...) рдХреЗ рд╕рд╛рде рдмрдирд╛ рд░рд╣реЗрдЧрд╛?

@urandom : рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЬреЛ рдореВрд▓реНрдп рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдлреВ (рдЯреА) рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдПрдХ рдирдпрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдлреВ (рдЯреА)ред
(рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдб рдореЗрдВ рдХрдИ рдлреВ (рдЯреА) рд╣реИрдВ, рддреЛ рд╡реЗ рд╕рднреА рд╕рдорд╛рди рд╣реИрдВ
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░)ред

рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ V рд╣реИ, рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ
рдХрд┐ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ Valuer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╡рд╢ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ
_not_ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпрд╛ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА)ред V рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬреЛ рд╣реИ
рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕рдХреЗ рд╡рд┐рд╡рд╢рддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдмрд╛рддреЗрдВред
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдпрд╣ рд╡реА рдирд╛рдордХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рддреЛ рдЖрдк рдкреНрд░рдХрд╛рд░ V . рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдлреВ (рдЯреА) рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
(рдЬреЛ рди рддреЛ рдлреВ (рдЯреА) рд╣реИ рдФрд░ рди рд╣реА рд╡реИрд▓реНрдпреВрд░ (рдЯреА), рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд░реНрдгрд┐рдд рдЧреБрдг рд╣реИрдВ
рдореВрд▓реНрдпрд╛рдВрдХрдХ (рдЯреА))ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

(рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЕрдкрдиреА рд╕рдордЭ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдФрд░ рдЕрдВрддрдд: рдЗрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рд▓рд┐рдЦ рд╕рдХреЗрдВ a
рдХрд▓реНрдкрдирд╛ рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ рд╣реИ
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдЙрддрдирд╛ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрд┐рддрдирд╛ рдХрд┐ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИред)

рд╢рд╛рдпрдж рдЖрдк рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ: https://go2goplay.golang.org/p/8Hz6eWSn8Ek?

@Inuart рдпрджрд┐ рдЯреВрд▓ рд╢рд╛рдЦрд╛ рд╕реЗ рдЖрдкрдХрд╛ рддрд╛рддреНрдкрд░реНрдп dev.go2go рд╢рд╛рдЦрд╛ рд╕реЗ рд╣реИ: рдпрд╣ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ, рдЗрд╕реЗ рд╕рдореАрдЪреАрдирддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЛрдЧ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓реЗрдВ рдФрд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдбрдХреНрд╢рди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рджрдХ рдкрд░ _rely_ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)ред рдлреАрдбрдмреИрдХ рд╕реЗ рд╕реАрдЦрддреЗ рд╣реБрдП рд╣рдо рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдПрдбрдЬрд╕реНрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдирд╡реАрдирддрдо рдЧреЛ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦрдирд╛ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдХрд▓ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рд╣реИ рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рд░рджреНрджреАрдХрд░рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд░рдЧреНрд░реБрдк рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ go2go рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛рдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ)ред

рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╕рдВрдж рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕ рдЪреАрдЬ рдиреЗ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдлрдВрд╕рд╛рдпрд╛ рд╣реИ (рд╕рдордЭрд╛рдиреЗ рд▓рд╛рдпрдХ рднреА рдирд╣реАрдВ) рдЙрд╕рдХрд╛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЬреЗрдирд░рд┐рдХ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╣реА рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдордЭрдирд╛ рдЬреНрдпрд╛рджрд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдПрдХ рдмрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдореВрд░реНрдЦ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рд╣реИред

рдПрдХ рдЪреАрдЬ рдЬреЛ рдкрдардиреАрдпрддрд╛ рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЧреЛ рдЯреВрд▓ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЗ рдореЛрдиреЛрдореЛрд░реНрдлрд╛рдЗрдЬреНрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдерд╛, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВред рдЕрдХреНрд╖рдореНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬреНрдб рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░рд╛рдкреНрдп рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░-рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рд╡рд╣ рдЯрд┐рдкреНрдкрдгреА рдЖрдкрдХреЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рднреА рджреЗрдЦреА рдереА; рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рд╕реАрдзрд╛ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдкрдирд╛ рд╕рд┐рд░ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдХреВрджрдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ :)

рддреЛ рдЖрдк рдкреНрд░рдХрд╛рд░ V . рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдлреВ (рдЯреА) рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
(рдЬреЛ рди рддреЛ рдлреВ (рдЯреА) рд╣реИ рдФрд░ рди рд╣реА рд╡реИрд▓реНрдпреВрд░ (рдЯреА), рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд░реНрдгрд┐рдд рдЧреБрдг рд╣реИрдВ
рдореВрд▓реНрдпрд╛рдВрдХрдХ (рдЯреА))ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдмрдврд╝рд┐рдпрд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ред

...рдЕрдиреНрдпрдерд╛, рдпрд╣ рджреЗрдЦрдХрд░ рджреБрдЦ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рднреАрдбрд╝ рджреНрд╡рд╛рд░рд╛ HN рдкреЛрд╕реНрдЯ рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЧреЛрдлрд╝рд░реНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред

рдЧреЛ рдЯреАрдо рдХреЗ рд▓рд┐рдП рджреЛ рдкреНрд░рд╢реНрди:

  • рдХреНрдпрд╛ рдЖрдк рдЬреЗрдирд░рд┐рдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдкреНрд░рд╢реНрдиреЛрдВ/рдмрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЬреАрдердм рдореБрджреНрджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдХреНрдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдордВрдЪ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ?
  • рдореИрдВ рдЯрд╛рдЗрдк рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рдерд╛: рдЙрджрд╛рд╣рд░рдг: https://go2goplay.golang.org/p/AAwSof_wT6t

рдХреНрдпрд╛ рдЗрди рджреЛрдиреЛрдВ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рд╣реИ, рдпрд╛ рдпрд╣ go2 рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ? рдкрд╣рд▓рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ

type Addable interface {
    type int, float64
}

func Add(type T Addable)(a, b T) T {
  return a + b
}
type Addable interface {
    type int, float64, string
}

func Add(type T Addable)(a, b T) T {
  return a + b
}

рдЗрд╕рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓: invalid operation: operator + not defined for a (variable of type T)

рдЦреИрд░, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдФрд░ рд╕реБрдЦрдж рдЖрд╢реНрдЪрд░реНрдп рдерд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЬрд▓реНрдж рд╣реА рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереАред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдмрдЧ рдорд┐рд▓рд╛: https://go2goplay.golang.org/p/1r0NQnJE-NZ

рджреВрд╕рд░рд╛, рдореИрдВрдиреЗ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдФрд░ рдпрд╣ рдЬрд╛рдирдХрд░ рдереЛрдбрд╝рд╛ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╕реАрдзреЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖ рд░рд╣реА рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕рд╛рде рд╣реА, рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рджреМрд░рд╛рди рдирдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрдирд╛ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк рдпрд╛ рддреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдпрджрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╣рд╛рдВ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рднреА рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ ( type Example interface { Method(type T someConstraint)(v T) bool } ), рдпрд╛, рд╕рдВрднрд╡рддрдГ, рдпрджрд┐ _any_ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

```рдЬрд╛рдУ
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЯрд╛рдЗрдк рдХрд░реЗрдВ {
рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рд╕реНрдЯреНрд░рд┐рдВрдЧ
}

рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдк рдХрд░реЗрдВ (рдЯрд╛рдЗрдк рдЯреА) рд╕рдВрд░рдЪрдирд╛ {
рд╡реА рдЯреА
}

// рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ Interface.Get, example.Get рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред
func (рдИ рдЙрджрд╛рд╣рд░рдг (рдЯреА)) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдкреНрд░рдХрд╛рд░ рдЖрд░) (рд╡реА рдЖрд░) рдЯреА {
рд╡рд╛рдкрд╕реА fmt.Sprintf("%v: %v", v, ev)
}

func DoSomething (рдЗрдВрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕) {
// рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдФрд░ рдЙрджрд╛рд╣рд░рдг (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рд╣реИред рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
fmt.Println(inter.Get("example"))
}

func рдореБрдЦреНрдп () {
// рдЕрдиреБрдорддрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг (рд╕реНрдЯреНрд░рд┐рдВрдЧ)ред рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рд╕рдВрднрд╡ рд╣реИред
рдХреБрдЫ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг (рд╕реНрдЯреНрд░рд┐рдВрдЧ) {v: "рдПрдХ рдЙрджрд╛рд╣рд░рдгред"})
}

@DeedleFake рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдЖрдк рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдмрдЧ рдирд╣реАрдВ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓ рдЖрдкрдХреЛ https://go2goplay.golang.org/p/qo3hnviiN4k рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рдореЗрдВ, a(b) рд▓рд┐рдЦрдиреЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ a (b) ( a рдХреЛрд╖реНрдардХ рдкреНрд░рдХрд╛рд░ рдХреЗ b ) рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдкрд╢реНрдЪ-рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рдЗрд╕реЗ рдЖрдЧреЗ рдЬрд╛рдХрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрдЯрд░реЗрдЯрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ - рдпрд╣ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдПрдХ рдмрдЧ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдПрдХ рдмрдЧ рджрд░реНрдЬ рдХрд░реЗрдВ (рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢) рдФрд░ рдЗрд╕реЗ рдореБрдЭреЗ рд╕реМрдВрдкреЗрдВред рдзрдиреНрдпрд╡рд╛рджред

@Kashomon рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ (https://blog.golang.org/generics-next-step) рдмрдЧ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдФрд░ рдлрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ + рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@tooolbox

рдПрдХ рдЪреАрдЬ рдЬреЛ рдкрдардиреАрдпрддрд╛ рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЧреЛ рдЯреВрд▓ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЗ рдореЛрдиреЛрдореЛрд░реНрдлрд╛рдЗрдЬреНрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдерд╛, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВред рдЕрдХреНрд╖рдореНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬреНрдб рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░рд╛рдкреНрдп рд╣реИред

go2go рдЯреВрд▓ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред go tool go2go run x.go2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, go tool go2go translate x.go2 рд▓рд┐рдЦреЗрдВред рдпрд╣ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде x.go рдлрд╝рд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдХрд╛рдлреА рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд╣реИред рдирд╛рдореБрдордХрд┐рди рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЖрд╕рд╛рди рднреА рдирд╣реАрдВред

@griesemer

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рдкрд╕реА рддрд░реНрдХ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
https://go2goplay.golang.org/p/LuDrlT3zLRb
рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ рд╣реА рддрддреНрдХрд╛рд▓ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ?

@urandom рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рдкрд╕реА рддрд░реНрдХ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмреНрд▓реЙрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛рдиреА рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рджреНрд╡рд╛рд░рд╛ред

рдЖрдо рддреМрд░ рдкрд░, рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рддреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдЯрдкрд▓ рджреНрд╡рд╛рд░рд╛ рдпрд╛ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЬреЗрдиреЗрд░рд┐рдХ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдЯрдкрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ:

func f(type S)(i int) int
{
    s S =...
    return 2
}

рдкрддрд╛ рдирд╣реАрдВ рдпрд╣ рдХрд┐рддрдирд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред

@urandom рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдорд╛рдорд▓реЗ рдХреЛ рдпрд╛рдж рдХрд░реЗрдЧрд╛ - рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдХреЗ рдЦрдбрд╝рд╛ рд╣реВрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ)ред рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдХрдерди рдпрд╛ рдЙрдк-рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдорд╕реНрдпрд╛" рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред рдРрд╕реЗ:

type Any interface {}

type Evaler(type t Any) interface {
  Eval() t
}

type Num struct {
  value int
}

func (n Num) Eval() int {
  return n.value
}

type Plus(type a Evaler(type t Any)) struct {
  left a
  right a
}

func (p Plus(type a Evaler(type t Any)) Eval() t {
  return p.left.Eval() + p.right.Eval()
}

func (p Plus(type a Evaler(type t Any)) String() string {
  return fmt.Sprintf("(%s+%s)", p.left, p.right)
}

type Expr interface {
  Evaler
  fmt.Stringer
}

func main() {
  var e Expr = Plus(Num){Num{1}, Num{2}}
  var v int = e.Eval() // 3
  var s string = e.String() // "(1+2)"
}

Eval рд╡рд┐рдзрд┐ рдХрд╛ рдХреЛрдИ рднреА рджреБрд░реБрдкрдпреЛрдЧ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрдХрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг Eval рдХреЛ Plus рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдЯреНрд░рд┐рдВрдЧ () (рд╕рдВрднрд╡рддрдГ рд╕рдВрд░рдЪрдирд╛ рдЬреЛрдбрд╝рдирд╛) рдХрд╛ рдЕрдиреБрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЕрдЪреНрдЫрд╛ рдкрд░реАрдХреНрд╖рдг рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЧреЛ рдЖрдорддреМрд░ рдкрд░ "рд╢реБрджреНрдзрддрд╛" рдкрд░ рд╕рд╛рджрдЧреА рдХреЛ рдЕрдкрдирд╛рддрд╛ рд╣реИред рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рднреНрд░рдо рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рдЕрд╕рдВрдмрджреНрдз рд╣реВрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдлрд┐рдХреНрд╕реНрдб рдЧрд▓рддреА рдФрд░ рд╕реБрдзрд╛рд░

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, '<>' рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ?

@99рдпреБрдВ
рдХреГрдкрдпрд╛ рдЕрджреНрдпрддрди рдорд╕реМрджреЗ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рджреЗрдЦреЗрдВ

рд╕рд┐рдВрдЯреИрдХреНрд╕ F\ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВрд╕реА ++ рдФрд░ рдЬрд╛рд╡рд╛ рдХреА рддрд░рд╣?
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдХреЛрдб рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп, рдЬреИрд╕реЗ рдХрд┐ v := F\, < рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо <рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдпрд╛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рд╕рдорд╛рдзрд╛рди рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЕрд╕реАрдорд┐рдд рд▓реБрдХрд╣реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рдо рдЧреЛ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдХреБрд╢рд▓ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

@urandom рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдирд┐рдХрд╛рдп рд╣рдореЗрд╢рд╛ рдЯрд╛рдЗрдк-рдЪреЗрдХ w/o рдЗрдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди (*) рд╣реЛрддрд╛ рд╣реИ; рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ (рдпрджрд┐ рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдпрд╣ рдХреЗрд╡рд▓ рдЙрдкрд▓рдмреНрдз рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЬреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ-рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд░рд┐рдЯрд░реНрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди (рд╕рдВрднрд╡рддрдГ рдЕрдиреБрдорд╛рдирд┐рдд) рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж)ред рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗред

(*) рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛; рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ; рд╣рдо рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддрдирд╛ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрд┐рддрдирд╛ рдХрд┐ рдЙрдирдХреА рдордЬрдмреВрд░рд┐рдпрд╛рдВ рд╣рдореЗрдВ рдмрддрд╛рддреА рд╣реИрдВред

рдХреГрдкрдпрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдФрд░ рдкреНрд░рд╢реНрди рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рджрд░реНрдЬ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рд╡рд╣рд╛рдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХреЗрдВред рдзрдиреНрдпрд╡рд╛рджред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓реЗрдВ:

func zero(type T)() T {
    var zero T
    return zero
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдкреНрд░рдХрд╛рд░ (int, float32 рдЗрддреНрдпрд╛рджрд┐) рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░ рд╡рд╛рд▓реА рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдЪреАрдЬреЗрдВ рдЕрдЬреАрдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

type Opt(type T) struct {
    val T
}

func (o Opt(T)) Do() { /*stuff*/ }

рд╕рдм рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд░рддреЗ рд╕рдордп:

opt := zero(Opt(int))
opt.Do() 

рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗрдиреЗ рдХрд╛ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: opt.Do undefined (type func() Opt(int) has no field or method Do) рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реЛрдЪрдирд╛ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрдм int рдХреЛ рдСрдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЬреАрдм рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:

opt := zero(Opt)      //  But somehow this line compiles
opt(int).Do()         // This will panic

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ рдмрдЧ рд╣реИ рдФрд░ рдХреМрди рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд░рд╛рджрд╛ рд╣реИред
рдХреЛрдб: https://go2goplay.golang.org/p/M0VvyEYwbQU

@TotallyGamerJet

рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди zero() рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдЖрдкрдХреЛ zero func рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

opt := zero(Opt(int))()
opt.Do()

https://go2goplay.golang.org/p/N6ip-nm1BP-

@tooolbox
рдЖрд╣ рд╣рд╛рдБред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЛрд╖реНрдардХ рдХреЗ рджреВрд╕рд░реЗ рд╕реЗрдЯ рдХреЛ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЕрдм рднреА рдЗрди рдЬреЗрдирд░рд┐рдХ рдХреА рдЖрджрдд рд╣реЛ рд░рд╣реА рд╣реИред

рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдпрд╣ рд╕рдордЭрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рди рд╣реЛрдирд╛ рдПрдХ рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдп рдерд╛, рди рдХрд┐ рдирд┐рд░реАрдХреНрд╖рдгред рдЗрд╕рдиреЗ рдЧреЛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдХреБрдЫ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрддрд┐-рд╢реАрд░реНрд╖ рд╡реНрдпрд╛рдореЛрд╣ рдХреА рдерд╛рд╣ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ред рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ рд╣рдордиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреЛ рдХреЛрдб рдмрдирд╛рдП рд╣реИрдВ рдФрд░ рдПрдХ рднреА рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЬреЗрдирд░рд┐рдХ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧреЛ рдХреЛ рдХрдо рдорд╣рд╕реВрд╕ рдХрд░рд╛рдПрдЧрд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдЪрд╛рд░ рднреАрдбрд╝ рдиреЗ рдЕрдВрддрддрдГ рдЧрд▓рдд рджрд┐рд╢рд╛ рдореЗрдВ рдЧреЛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ рд╣реИред рд╡реЗ рдЧреЛ рдХреЛ рдЙрд╕рдХреА рд╕рд░рд▓ рд╕реБрдВрджрд░рддрд╛ рдореЗрдВ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рдереЗ, рдирд╣реАрдВ, рдЙрдиреНрд╣реЗрдВ рддрдм рддрдХ рд╢рд┐рдХрд╛рдпрдд рдФрд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддреЗ рд░рд╣рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛ред

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рдирд╛рд╢ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЕрдЧрд░ рд╣рдо рд╕рд╛рдорд╛рди рдмрджрд▓рддреЗ рд░рд╣реЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЪрд╛рд╣реЗрдВрдЧреЗ, рддреЛ рд╣рдо "C++" рдпрд╛ "JavaScript" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдмрд╕ рдЙрдиреНрд╣реЗрдВ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджреЛ, рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛!

@ iio7 рдореИрдВ рдпрд╣рд╛рдВ рд╕рднреА рдХрд╛ рд╕рдмрд╕реЗ рдХрдо рдЖрдИрдХреНрдпреВ рд╣реВрдВ, рдореЗрд░рд╛ рднрд╡рд┐рд╖реНрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдВред рдкреНрд░рдЪрд╛рд░ рд╕рд┐рд░реНрдл рдЬреЗрдирд░рд┐рдХ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╢реБрд░реВ рд╣реБрдЖ, рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдирдП рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рднреА рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реИрдВ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд┐рдбрд╝рдХреА рд╣реИ рдФрд░ рдЕрднреА рднреА рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрдкрд╣рд╛рд░ рд╣реИрдВред рдореБрдЭреЗ рдЧрд▓рдд рдордд рд╕рдордЭреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдо рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреЛрдИ рди рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рд░реЙрдХреЗрдЯ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдХреА рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдмрдВрджрд░ рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рд╕рдордЭрдиреЗ рд▓рдЧрддрд╛ рд╣реИ? рддреЛ рдЕрдм рдЖрдк рдЬреЛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ рд╡реЗ рд░реЙрдХреЗрдЯ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╣реИрдВ рдФрд░ рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рдВ рдореБрдЭреЗ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрдпрд╛рди рдФрд░ рд░реЙрдмрд░реНрдЯ рдФрд░ рдЕрдиреНрдп рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрднреА рддрдХ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рд╕рд╛рд▓ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрд╛ рддреЛ рдРрд╕реЗ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рд╣реА рд╕рд░рд▓ рдмрдВрджрд░ рднрд╛рд╖рд╛ рдмреЛрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдЪрд╛рд╣реЗ рдЖрдк рдЗрд╕реЗ рдХрд┐рддрдирд╛ рднреА рдХрдард┐рди рд░реЙрдХреЗрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдлреЗрдВрдХ рджреЗрдВред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдЖрдк рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдФрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдЕрдзрд┐рдХ рдЗрдВрдЬреАрдирд┐рдпрд░ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ рдпрд╛ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЙрдкрдХрд░рдг рдХреА рддрд░рд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ <> рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдкрдврд╝рд╛ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЬреИрд╕реЗ рдмреЗрд╡рдХреВрдл рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреЙрд▓ рд╣реИ рдпрджрд┐ рдпрд╣ v := F(T) рдХреЗ рдмрдЬрд╛рдп v := F<T> рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ v := F(T) ? рдХреНрдпрд╛ рдпрд╣ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдирд┐рдпрдорд┐рдд рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреА рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВ?

рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддреЗрдЬрд╝ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдЖрдИрдПрдордУ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ v := F(T) рд╕реАрдзреЗ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдпрд╛ v := F<T> рдЖрд╕рд╛рди рд╣реИ? рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ :)

v := F<T> рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рди рддреЛ рддрд░реНрдХ рдХрд░рдирд╛ рдФрд░ рди рд╣реА рд╡рд┐рд░реЛрдз рдХрд░рдирд╛, рдмрд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЙрдард╛рдирд╛ рдЬреЛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реИ рдЖрдЬ рд╣реА рдЬрд╛рдПрдВ :

    f, c, d, e := 1, 2, 3, 4
    a, b := f < c, d > (e)
    fmt.Println(a, b) // true false

рдХреЛрдг рдХреЛрд╖реНрдардХ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдХрдореНрдкреЗрдЯ рдХреЛ рддреЛрдбрд╝реЗрдВ?) рдпрд╣ рд╕рднреА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдореГрдд рдореБрджреНрджрд╛ рд╣реИред рдЧреЛ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдПрдВрдЧрд▓ рдмреНрд░реИрдХреЗрдЯреНрд╕ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреА рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдХреГрдкрдпрд╛ рдХреБрдЫ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред

рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдЕрддреНрдпрдзрд┐рдХ рд░реВрдЦреА рдереАред рд░реЗрдбрд┐рдЯ рдФрд░ рдПрдЪрдПрди рдкрд░ рдПрдВрдЧрд▓ рдмреНрд░реИрдХреЗрдЯреНрд╕ рдХреА рдмрд╣реБрдд рдЪрд░реНрдЪрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрдирд░рд┐рдХ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмреИрдХ рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬрд╛рдиреА рдЬрд╛рддреА рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЛрдЧ рдХреЛрдг рдХреЛрд╖реНрдардХ рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @ iio7ред рд╣рдореЗрд╢рд╛ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдЬреЛрдЦрд┐рдо рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЪреАрдЬреЗрдВ рд╣рд╛рде рд╕реЗ рдирд┐рдХрд▓ рдЬрд╛рддреА рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЕрддреНрдпрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рдд рд░рд╣реЗ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рдл рдФрд░ рдЕрдзрд┐рдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдбрд┐рдЬрд╛рдЗрди рд╣реИ; рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдФрд░ рднреА рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЯрд╛рдЗрдк рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ - рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рд╣рдо рдФрд░ рдЬрд╛рдиреЗрдВрдЧреЗ, рд╣рдо рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓реЗрдВрдЧреЗред (рдХреБрдЫ рд╣рдж рддрдХ рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдФрд░ рд╕рд╛рдл рд╣реЛрддрд╛ рд╣реИ, рдЙрддрдирд╛ рд╣реА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрдЧрд╛ рдФрд░ рдЬрд┐рддрдирд╛ рдЬрдЯрд┐рд▓ рдХреЛрдб рдХреЛрдИ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред) рдЕрдВрддрд┐рдо рд╢рдмреНрдж рдЕрднреА рддрдХ рдмреЛрд▓реЗ рдирд╣реАрдВ рдЧрдП рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓, рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓рд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдбрд┐рдЬрд╛рдЗрди рдерд╛, рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдкрдХреЗ рд╕рдорд╛рди рдереА: "рдХреНрдпрд╛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?" рдпрд╣ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рд╢реНрди рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдпрдерд╛рд╕рдВрднрд╡ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@gertcuykens рдХрд╛ рдЕрд╡рд▓реЛрдХрди рднреА рд╕рд╣реА рд╣реИ - рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ go2go рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдЗрд╕рдХреА рд╕реАрдорд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдб рднреА рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рдЙрдЪрд┐рдд рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рд╕реНрдерд╛рдкрдирд╛ред рдЕрдм рддрдХ рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рджреЗрдЦреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдордЭрдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЬреАрдд рд╣реЛрдЧреА; рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╣рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреБрдЫ рд╕реВрдХреНрд╖реНрдо рдХреЛрдб рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдХрдВрдЯреЗрдирд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ, рдФрд░ рд╕реЙрд░реНрдЯ рдЖрджрд┐ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВред рд╕рдВрднрд╡рддрдГ рдХреЛрдб рдХреЗ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреЛ рдЬреЗрдирд░рд┐рдХ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рддреА рд╣реИрдВ, рдЧреЛ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЧреЛ рдЯреВрд▓ рд╕реЗрдЯ рдореЗрдВ рдПрдХ рдФрд░ рдЙрдкрдХрд░рдг рд╣реИрдВ; рдмреБрдирд┐рдпрд╛рджреА рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдЬрд┐рд╕ рдкрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╢реАрд░реНрд╖ рдкрд░ рдмрдирд╛ рд╣реИред

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП: рдЧреЛ рдХреЗ рд╢реБрд░реБрдЖрддреА рджрд┐рдиреЛрдВ рдореЗрдВ, рд╣рдо рд╕рднреА рдиреЗ рдЧреЛрд░рдЖрдЙрдЯрд┐рди рдФрд░ рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ рдХрд┐ рд╡реЗ рдХрдм рдЙрдкрдпреБрдХреНрдд рдереЗ рдФрд░ рдХрдм рдирд╣реАрдВред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдХрдореЛрдмреЗрд╢ рд╕реНрдерд╛рдкрд┐рдд рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ рдФрд░ рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реЛред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЗрдирд░рд┐рдХ рд╣реЛрддреЗ рддреЛ рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ред

рдзрдиреНрдпрд╡рд╛рджред

[T] -рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдбреНрд░рд╛рдлрд╝реНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдЕрдиреБрднрд╛рдЧ рд╕реЗ:

рднрд╛рд╖рд╛ рдЖрдо рддреМрд░ рдкрд░ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХреА рдЧрдИ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЕрдиреБрдЧрд╛рдореА рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдП [рдЯреА,] рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдПрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╛рд░реНрд╕рд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ рдпрд╛ рд╕реНрд▓рд╛рдЗрд╕, рд╕рд░рдгреА рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкрд╛рд░реНрд╕ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рддрдм рддрдХ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рдЬрдм рддрдХ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдкреВрд░реА рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреАред рдлрд┐рд░ рд╕реЗ, рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ред

рдХреНрдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЕрдиреБрдЧрд╛рдореА рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдиреВрдиреА рдмрдирд╛рдХрд░ рдФрд░ рдлрд┐рд░ рдХреЗрд╡рд▓ gofmt рдХреЛ рд╣рдЯрд╛рдХрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@DeedleFake рд╕рдВрднрд╡рддрдГред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛; рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдмрджрд╕реВрд░рдд рднреА рд▓рдЧрддрд╛ рд╣реИ, рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ред рдореБрдЭреЗ рд╕рднреА рд╡рд┐рд╡рд░рдг рдпрд╛рдж рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ [рдЯрд╛рдЗрдк рдЯреА] рд╢реИрд▓реА рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдерд╛ред dev.go2go рд╢рд╛рдЦрд╛ рджреЗрдЦреЗрдВ, 3d4810b5ba рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд╕рдорд░реНрдерди рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреЛрдИ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрдж рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ [] рд╕реВрдЪреА рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдмрд┐рд▓реНрдЯрд┐рди рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣ рд╣реА рд╕реАрдорд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ:

  • [рдПрди] рдЯреА
  • []рдЯреА
  • рдирдХреНрд╢рд╛ [рдХреЗ] рдЯреА
  • рдЪрд╛рди рддреЛ

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдВрддрд┐рдо рддрд░реНрдХ рд╕рднреА [] рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рдШреЛрд╖рдгрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: https://github.com/dotaheor/unify-Go-builtin-and-custom-generics#the -generic-declaration-syntax

@dotaheor рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md#containers ред

@ianlancetaylor
рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ [] рджреНрд╡рд╛рд░рд╛ рд╕рдВрд▓рдЧреНрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рд▓рд┐рдВрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type Map[type K][type V] struct

рдЬрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

var m Map[string]int

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХ рдЬреЛ [] рд╕реЗ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реИ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдВрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рдгреА # 39355 рдХреЗ рд▓рд┐рдП рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╕рдордп рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ "рддреБрд▓рдиреАрдп" рдХреЛ рд╡рд░реНрддрдорд╛рди рдЬреЗрдирд░рд┐рдХ рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рддреБрд▓рдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг) рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ .

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдорд╕реМрджреЗ рдХреЛ "рдЖрджреЗрд╢рд┐рдд"/"рдЖрджреЗрд╢ рдпреЛрдЧреНрдп" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЬреИрд╕рд╛ рдХрд┐ "рддреБрд▓рдиреАрдп" рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред рдпрд╣ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрдмрдВрдз рд╣реИ рдФрд░ рдпрд╣ рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ (рд╕рд░рдгреА, рд╕рдВрд░рдЪрдирд╛, рд╕реНрд▓рд╛рдЗрд╕, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░, рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдПрдирдо, ...) рдХрд┐ рд╕рднреА рдЖрджреЗрд╢рд┐рдд рдкреНрд░рдХрд╛рд░ "рддреБрд▓рдиреАрдп" рдЬреИрд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдореИрдВ рдпрд╣ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рднрд╛рд╖рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ (рдПрдХ рдмрд╛рдзрд╛) рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рд╕рдВрдЧрдд рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЬрд╛рджреВ рд╕рдВрдХрд▓рдХ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдкреИрдХреЗрдЬ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ "рдЖрджреЗрд╢рд┐рдд" рд╕реЗ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ "рдмрд╕" рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдпрджрд┐ рдХрднреА рднреА рдмрджрд▓реА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдмрд╛рдзрд╛ рдХреЛ рдХреЛрдИ рдлрд┐рдХреНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@martisch рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, constraints.Ordered рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ comparable рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреЙрдЗрдВрдЯрд░реНрд╕, рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕, рдПрд░реЗ,тАж рддреБрд▓рдиреАрдп рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЬрд╛рджреБрдИ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди ordered рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реАрдорд┐рдд рд╕реЗрдЯ рддрдХ рд╕реАрдорд┐рдд рд╣реИ) рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рддреЛ рд╣рдо рдЕрднреА рднреА рдПрдХ рдирдпрд╛ рдЬрд╛рджреБрдИ ordered рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ constraints.Ordered рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ constraints.Ordered рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирдП рдкреНрд░рддрд┐рдмрдВрдз рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗред рдмреЗрд╢рдХ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рд╕реНрдкрд╖реНрдЯ рдЯрд╛рдЗрдк-рд╕реВрдЪреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рд╣реИ рдпрджрд┐ рд╣рдо рдЕрднреА ordered рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕реЗ рдПрдореНрдмреЗрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ред

рддреЛ, рдЖрдИрдПрдордУ рдЗрд╕рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЛрдпрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рд░реНрдердХ рди рд╣реЛред рд╣рдореЗрдВ рдкреВрд░реНрд╡-рдШреЛрд╖рд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдмрд╛рдзрд╛-рд╕реЗрдЯ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП - рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдмрд╛рдзрд╛-рд╕реЗрдЯ рд╕реЗ рдмрд╣реБрдд рдХрдо :)

рдпрджрд┐ рд╣рдо рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рддреЛ рд╣рдо рдЕрднреА рднреА рдПрдХ рдирдпрд╛ рдЬрд╛рджреБрдИ ordered рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ constraints.Ordered рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@Merovius рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ constraints.Ordered рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ constraints.Comparable рднреА рд╣реЛрдЧрд╛ рддреЛ рдпрд╣ рд╕рдордЧреНрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

@martisch , рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ordered - comparable рдХреЗ рд╡рд┐рдкрд░реАрдд - рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ (рд╡реИрд╢реНрд╡рд┐рдХ) рдХреБрд▓ рдСрд░реНрдбрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЛ < рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВред ordered , рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп, рд░рди-рдЯрд╛рдЗрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ comparable рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЕрдиреНрдпрдерд╛, "рдЙрдкрдХрд░рдг" рдХреА рдкрд╛рд░рдЧрдордирд╢реАрд▓рддрд╛ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

    var x constraints.Ordered = int(0)
    var y constraints.Ordered = string("0")
    fmt.Println(x < y)

рдЗрд╕реЗ рдХреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? (рдХреНрдпрд╛ рдЙрддреНрддрд░ рд╕рд╣рдЬ рд╣реИ, рдпрд╛ рдордирдорд╛рдирд╛ рд╣реИ?)

@рдмреАрд╕реАрдорд┐рд▓реНрд╕
fun (<)(type T Ordered)(t1 T,t2 T) Bool? . рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдпрджрд┐ рдХреЛрдИ рдЕрдВрдХрдЧрдгрд┐рдд S рдХреЗрд╡рд▓ Ordered(T) рдХреЗ рд▓рд┐рдП S<:T рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ:

//Isn't possible I think
interface SorT(S,T)
{ 
type S,T
}

fun (<)(type R SorT(S,T), S Ordered(R), T Ordered(R))(s S, t T) Bool

рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд░рдирдЯрд╛рдЗрдо рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдЬреНрдо рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдпрд╛:
рдЖрдк рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЖрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ (<) рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

//but isn't supported that either
fun(<)(type R Ordered)(s R.0,t R.1)

рдирдорд╕реНрддреЗ!
рдореЗрд░рд╛ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИред

рдХреНрдпрд╛ рдЯрд╛рдЗрдк рдмрд╛рдзрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ?
рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдХреЗрд╡рд▓ Result(T) / Option(T) /etc рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ T рдирд╣реАрдВред
рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА

type Box(type T) interface {
    Val() (T, bool)
}

рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП Val() рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

type Box(type T) interface{}

interface{} рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЕрд░реНрдерд╛рдд Any

https://go2goplay.golang.org/p/lkbTI7yppmh рднреА рдХреЛрд╢рд┐рд╢ рдХреА -> рд╕рдВрдХрд▓рди рд╡рд┐рдлрд▓

type Box(type T) interface {
       type Box(T)
}

https://go2goplay.golang.org/p/5NsKWNa3E1k -> рд╕рдВрдХрд▓рди рд╡рд┐рдлрд▓

type Box(type T) interface{}

type Generic(type T) interface {
    type Box(T)
}

https://go2goplay.golang.org/p/CKzE2J-YOpD -> рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

type Box(type T) interface{}

type Generic(type T Box(T)) interface {}

рдХреНрдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдмрдЧ рд╣реИ?

@tdakkota рдмрд╛рдзрд╛рдПрдВ рдЯрд╛рдЗрдк рддрд░реНрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рд╡реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рддрддреНрдХрд╛рд▓ рд░реВрдк рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЗ рдЧреИрд░-рддрддреНрдХрд╛рд▓ рд░реВрдк рдкрд░ рдХрд┐рд╕реА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд░рдЦрддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдЕрджреНрдпрддрди рдорд╕реМрджреЗ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рджреЗрдЦреЗрдВ

рд╕рд┐рдВрдЯреИрдХреНрд╕ F . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВрд╕реА ++ рдФрд░ рдЬрд╛рд╡рд╛ рдХреА рддрд░рд╣?
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдХреЛрдб рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп, рдЬреИрд╕реЗ рдХрд┐ v:= F, < рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо <рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдпрд╛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рд╕рдорд╛рдзрд╛рди рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЕрд╕реАрдорд┐рдд рд▓реБрдХрд╣реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рдо рдЧреЛ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдХреБрд╢рд▓ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

@TotallyGamerJet рдЬреЛ рднреА рд╣реЛ!

рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдореВрд▓реНрдп рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ? рдПрдирдо рдХреЗ рдмрд┐рдирд╛, рд╣рдо рд╡реИрдХрд▓реНрдкрд┐рдХ рдореВрд▓реНрдп рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: vector рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг, рдФрд░ First рдирд╛рдордХ рдПрдХ func рдкрд╣рд▓рд╛ рддрддреНрд╡ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд▓рдВрдмрд╛рдИ> 0 рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИред
рд╣рдо рдРрд╕рд╛ рдХреЛрдб рдХреИрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдХреМрди рд╕рд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдпрджрд┐ chan/slice/map , рддреЛ рд╣рдо return (nil, false) , рдпрджрд┐ struct рдпрд╛ primitive type рдЬреИрд╕реЗ string рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ , int , bool , рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ?

@ рд▓реЗрдХреНрд╕реЙрдп

var zero T рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

@ рд▓реЗрдХреНрд╕реЙрдп

var zero T рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЬрд╛рджреВ рдЪрд░ рдЬреИрд╕реЗ nil ?

@ рд▓реЗрдХреНрд╕реЙрдп
var zero T рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЬрд╛рджреВ рдЪрд░ рдЬреИрд╕реЗ nil ?

рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рд╣реИ - рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдЦреЗрдВ: рдЧреЛ 2: рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдорд╛рди рдХреЗ рд╕рд╛рде рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╢реВрдиреНрдп рдорд╛рди #35966 ред

рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рдирдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ ( var zero T рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрдпрд╛рди рдирд╣реАрдВ) рдЬреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛ред

рд╢реВрдиреНрдп рдорд╛рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдвреЗрд░ рдпрд╛ рдвреЗрд░ рдкрд░ рдЬрдЧрд╣ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдЪрд░рдг рдореЗрдВ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП enum Option рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рд╢реВрдиреНрдп рдорд╛рди рдХреЛрдИ рд╕реНрдерд╛рди рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдФрд░ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХ рдРрдб рдПрдирдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╢реВрдиреНрдп рдорд╛рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдвреЗрд░ рдпрд╛ рдвреЗрд░ рдкрд░ рдЬрдЧрд╣ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ?

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЬреНрдпрд╛рджрд╛ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВред

C++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореМрдЬреВрджрд╛ asn1.ObjectIdentifier рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдПрдХ []int рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ ASN.1 рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдк-рдУрдЖрдИрдбреА рдордирдорд╛рдиреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдПрдХ INTEGER рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП *big.Int )ред рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ ObjectIdentifier рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдпрджрд┐ int рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдерд╛, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗред

type SignedInteger interface {
    type int, int32, int64, *big.Int
}
type ObjectIdentifier(type T SignedInteger) []T
// type ObjectIdentifier(type T SignedInteger=int) []T  // `int` would be the default instantiation type.

// New code with generic awareness would compile in go2.
var oid1 ObjectIdentifier(int) = ObjectIdentifier(int){1, 2, 3}

// But existing code would fail to compile:
var oid1 ObjectIdentifier = ObjectIdentifier{1, 2, 3}

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд asn1.ObjectIdentifier рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдПрд╕рдПрди.1 рдЕрдиреБрдкрд╛рд▓рди рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдпрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬрд╝реЗрдмрд▓ рдкрд░рд┐рдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реАрдорд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ ?:

type Ordable(type T, S) interface {
    type S, type T
}

рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдХрдВрдбреАрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХреИрд╕реЗ рдХрд░реЗрдВред
рдХреНрдпрд╛ рд╣рдо рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

type Vector(type T) struct {
    vec []T
}

func (v Vector(T)) Sum() T where T: Summable {
      //
}

func (v Vector(T)) First()  (T, bool) {
     //
}

Sum рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЬрдм рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ T Summable рд╣реЛ, рдЕрдиреНрдпрдерд╛ рд╣рдо рд╡реЗрдХреНрдЯрд░ рдкрд░ Sum рдкрд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд╣рд╛рдп @ рд▓реЗрдХреНрд╕реЙрдп

рдЖрдк рдмрд╕ https://go2goplay.golang.org/p/pRznN30Qu8V рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

type Addable interface {
    type int, uint
}

type SummableVector(type T Addable) Vector(T)

func (v SummableVector(T)) Sum() T {
    var r T
    for _, i := range v.vec {
        r = r + i
    }
    return r
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ where рдХреНрд▓реЙрдЬ рдЧреЛ-рд▓рд╛рдЗрдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

type Vector(type T) struct {
    vec []T
}

func (v Vector(T Summable)) Sum() T {
      //
}

func (v Vector(T)) First()  (T, bool) {
     //
}

рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдзрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

@ sebastien-rosset рд╣рдордиреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдЕрд▓рдЧ рдХреНрдпреЛрдВ рд╣реЛрдВрдЧреЗред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдХреЗрдЬ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдХреЗрд╡рд▓ рдирдП рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рдареАрдХ рд╣реИред

@ рд╕рд┐рдШреЛрдпрд╛

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬрд╝реЗрдмрд▓ рдкрд░рд┐рдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реАрдорд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рдкреНрд░рд╢реНрди рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред

рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ (https://blog.golang.org/generics-next-step) рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЧреЛрд▓рд╛рдВрдЧ-рдирдЯреНрд╕ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкрд░ рд╣реЛрддреА рд╣реИ, рди рдХрд┐ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдкрд░ред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрдврд╝рддрд╛ рд░рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ 800 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЛрдЭрд┐рд▓ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдХреА рдЕрдиреНрдп рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рдЯрд┐рдкреНрдкрдгреА рд╕реВрддреНрд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ред рдзрдиреНрдпрд╡рд╛рджред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХрд╛ рдЧреЛ рдЯрд╛рдЗрдо рдкреЙрдбрдХрд╛рд╕реНрдЯ рд╕реБрдирд╛, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдг рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдкрд░ @griesemer рд╕реЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд╣рд▓реА рдмрд╛рд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд┐рд▓рд╛ рдерд╛, рдЕрд░реНрдерд╛рдд "рдкрд╛рд░реНрд╕рд░ рдкрд░ рдЕрдирдмрд╛рдЙрдВрдб рд▓реБрдХрд╣реЗрдб" рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП? рд╡рд╣рд╛рдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдБред рдореИрдВ

@ianlancetaylor

рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЧреЛрд▓рд╛рдВрдЧ-рдирдЯреНрд╕ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкрд░ рд╣реЛрддреА рд╣реИ, рди рдХрд┐ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдкрд░

рд╣рд╛рд▓ рдХреЗ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ [1] рдореЗрдВ, @ddevault рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ Google рд╕рдореВрд╣ (рдЬрд╣рд╛рдВ рд╡рд╣ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рд╣реИ) рдХреЛ Google рдЦрд╛рддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рд╕рдореВрд╣реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рддреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ Google рдЦрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЙрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреА рд╣рд░ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ), рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрджрд┐ рд╣рдо рдПрдХ рдЕрдзрд┐рдХ рдиреНрдпрд╛рдпрдкреВрд░реНрдг рдЧреЛрд▓рдВрдЧ рд╕рдореБрджрд╛рдп рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд░ рд╣рдо рдПрдХ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рдХрдХреНрд╖ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

рдореБрдЭреЗ Google рд╕рдореВрд╣реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдерд╛, рдФрд░ рдЕрдЧрд░ рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдореЗрд░реА рдХреНрд╖рдорд╛рдпрд╛рдЪрдирд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВред рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрд╛ рд╣реИ, рдФрд░ рдореИрдВ рднреА рдХрд╛рдлреА рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ (рдЫрд╣ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЧреЛрд▓рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж) рдХрд┐ рдЬреЗрдирд░рд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реА рдирд┐рдЬреА рд░рд╛рдп рд╣реИ, рдФрд░ рд╣рдореЗрдВ рд╡рд╣ рднрд╛рд╖рд╛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ-рдХрд╛рдлреА рд╣реИ!

рдЪреАрдпрд░реНрд╕!

[1] https://drewdevault.com/2020/08/01/pkg-go-dev-sucks.html

@purpleidea рдХрд┐рд╕реА рднреА Google рд╕рдореВрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк Google рдЦрд╛рддреЗ рдХреЗ рдмрд┐рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рднрд╛рдЧ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

@ianlancetaylor

рдХрд┐рд╕реА рднреА Google рд╕рдореВрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк Google рдЦрд╛рддреЗ рдХреЗ рдмрд┐рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рднрд╛рдЧ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм рдореИрдВ рдЬрд╛рддрд╛ рд╣реВрдБ:

https://groups.google.com/forum/#!forum/golang -nuts

рдПрдХ рдирд┐рдЬреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ (рдЕрдкрдиреЗ Google рдЦрд╛рддреЗ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ рд╣реИ), рдФрд░ "рдирдпрд╛ рд╡рд┐рд╖рдп" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдпрд╣ рдореБрдЭреЗ рдПрдХ Google рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ Google рдЦрд╛рддреЗ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реВрдВ?

@purpleidea [email protected] рдкрд░ рдПрдХ рдИ-рдореЗрд▓ рд▓рд┐рдЦрдХрд░ред рдпрд╣ рдПрдХ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рд╣реИред рдХреЗрд╡рд▓ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП Google рдЦрд╛рддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬреЛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ - рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдПрдХ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдИ-рдореЗрд▓ рдкрддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╕рдореВрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЬреАрдореЗрд▓ рдЦрд╛рддреЗ рд╕реЗ рдореЗрд▓ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд▓рд┐рдВрдЧ рд▓рд┐рд╕реНрдЯ рдХреНрдпрд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА рдЖрдк рдХрд┐рд╕реА рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рджрд░реНрдкрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://www.mail-archive.com/[email protected]/

рдпрд╣ рд╕рдм рдмрдврд╝рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд▓реЛрдЧ рдЗрд╕рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
Google рд╕рдореВрд╣ рдкрд░ рдереНрд░реЗрдб (рдЬреЛ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ)ред рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ
рдПрдХ рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рдЖрдИрдбреА рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдЦреЛрдЬрдиреЗ рдФрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рдиред

тАФрд╕рд╛рдореА

рд╕реВрд░реНрдп рдкрд░, 2 рдЕрдЧрд╕реНрдд, 2020, 19:24 рдмрдЬреЗ, рдЕрд╣рдордж рдбрдмреНрд▓реНрдпреВ рдиреЗ рд▓рд┐рдЦрд╛:
>
>

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд▓рд┐рдВрдЧ рд▓рд┐рд╕реНрдЯ рдХреНрдпрд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА рдЖрдк рдХрд┐рд╕реА рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рджрд░реНрдкрдг рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
https://www.mail-archive.com/[email protected]/

тАФ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/15292#issuecomment-667738419 , рдпрд╛
рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд
https://github.com/notifications/unsubscribe-auth/AAD5EPNQTEUF5SPT6GMM4JLR6XYUBANCNFSM4CA35RXQ
.

--
рд╕реИрдо рд╡реНрд╣рд╛рдЗрдЯрдб

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдореИрдВ

@Imperatorn рд╡рд╣рд╛рдБ рд░рд╣реЗ рд╣реИрдВ, рдЙрдирдХреА рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ рд╡рд░реНрдЧрд╛рдХрд╛рд░ рдХреЛрд╖реНрдардХ [ ] рдЪреБрдирд╛ рдЧрдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдЧрд╛ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░/рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рд┐рдЦрддреЗ рд╕рдордп "рдЯрд╛рдЗрдк" рд╢рдмреНрдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЙрдкрдирд╛рдо "рдХреЛрдИ рднреА" рднреА рд╣реИред

рдирд╡реАрдирддрдо рдЬреЗрдирд░рд┐рдХ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдпрд╣рд╛рдБ рд╣реИ ред
рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рднреА рджреЗрдЦреЗрдВ: рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ред рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ (https://blog.golang.org/generics-next-step) рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЧреЛрд▓рд╛рдВрдЧ-рдирдЯреНрд╕ рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдкрд░ рд╣реЛрддреА рд╣реИ, рди рдХрд┐ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдкрд░ред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкрдврд╝рддрд╛ рд░рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ 800 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЛрдЭрд┐рд▓ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдХреА рдЕрдиреНрдп рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рдЯрд┐рдкреНрдкрдгреА рд╕реВрддреНрд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ред рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕ рдкрд░, рдЬрдмрдХрд┐ рдореИрдВ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЧреЛ рдЯреАрдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рдПрдХ рдореБрджреНрджреЗ рд╕реЗ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреА рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд┐рдЯрд╣рдм рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рджрд╕реНрдп рд╣реИрдВ рдЬреЛ рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдкрд░ рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд┐рдЯрд╣рдм рдХреА рдирдИ рдЪрд░реНрдЪрд╛ рд╕реБрд╡рд┐рдзрд╛ рдПрдХ рдЕрдЪреНрдЫреА рдлрд┐рдЯ рд╣реЛрдЧреА? рдЗрд╕рдореЗрдВ рдереНрд░реЗрдбрд┐рдВрдЧ рд╣реИ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ред

@toolbox рддрд░реНрдХ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдРрд╕реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЬреАрдердм рдЦрд╛рддрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдПрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ)ред рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдФрд░ рд╡рд╣рд╛рдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ golang-nuts рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@Merovius рдЧрд┐рдЯрд╣рдм рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдЙрди рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд┐рдирдореЗрдВ рдореБрдЭреЗ рд░реВрдЪрд┐ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ Google рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП?

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВред рдкрд╕рдВрджреАрджрд╛ рдордВрдЪ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд┐рд░ рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЪрд░реНрдЪрд╛ рдпрд╣рд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдореБрджреНрджрд╛ рдХрд╛рдлреА рд╢реЛрд░рдЧреБрд▓ рд╡рд╛рд▓рд╛ рд╣реИред

@toolbox рддрд░реНрдХ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдРрд╕реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЬреАрдердм рдЦрд╛рддрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдПрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ)ред рд╡рд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдФрд░ рднрд╛рдЧ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЧреЛрд▓рд╛рдВрдЧ-рдирдЯреНрд╕ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдирд┐рд╢рд╛рди рдЦреЛ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЧреЛрд▓рд╛рдВрдЧ-рдирдЯреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЧрд┐рдЯрд╣рдм рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, (рдЬреИрд╕рд╛ рдХрд┐ рдЕрдм рдЙрд▓реНрдЯрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ) рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЧрд┐рдЯрд╣рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдордВрдЪ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВред рдкрд╕рдВрджреАрджрд╛ рдордВрдЪ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд┐рд░ рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЪрд░реНрдЪрд╛ рдпрд╣рд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдореБрджреНрджрд╛ рдХрд╛рдлреА рд╢реЛрд░рдЧреБрд▓ рд╡рд╛рд▓рд╛ рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдмреЗрддрд╣рд╛рд╢рд╛ рдСрдл-рд╡рд┐рд╖рдп рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд┐рдбрдВрдмрдирд╛ рджреЗрдЦреЗрдВрдЧреЗред

@keean @Merovius @tooolbox рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓реЛрдЧред

FYI рдХрд░реЗрдВ: рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рдореБрджреНрджрд╛ рд╣реИ, #37469 рджреЗрдЦреЗрдВред

рдирдорд╕реНрддреЗ,

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧреЛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рднрд╛рд╖рд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╢рд╛рдирджрд╛рд░ рд╣реИред рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдореЗрд░реЗ рд▓рд┐рдП, рдкрдардиреАрдпрддрд╛ рд░рд╣реА рд╣реИред рдореИрдВ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрднреА рднреА рдЦреЛрдЬ рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдг рдореЗрдВ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЕрдм рддрдХ, рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ, рдХреБрд░рдХреБрд░рд╛ рдФрд░ рдмрд┐рдВрджреБ рдкрд░ рдЖ рдЧрдпрд╛ рд╣реИред

рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдореИрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдореЗрд░реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдХреИрдирд┐рдВрдЧ рд╕реЗ, [T Constraint] рдореЗрд░реЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд░реНрдг рд╕реЗрдЯ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ . рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЧреЛ рдХреЗ рдмрд╣реБ-рд╡рд╛рдкрд╕реА рдкреНрд░рддрд┐рдорд╛рди рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг C++ рд╢реИрд▓реА F<T Constraint> рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рднреА рдЧреИрд░-рдЕрд╕реАрд╕реА рдкрд╛рддреНрд░ рдПрдХ рдкреВрд░реНрдг рдХрд╛рдо рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрднрд╛рд░реА рд╣реВрдВ рдХрд┐ рдЖрдкрдиреЗ рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред

рдХреГрдкрдпрд╛ рдПрдХ рд╡рд░реНрдг рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрд┐рдЯрд╡рд╛рдИ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкрд╛рдиреА рдХреЛ рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ F<<T Constraint>> рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдИ рднреА рдкреНрд░рддреАрдХ рд╕рдВрдпреЛрдЬрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрдВрдЦ-рд╕реНрдХреИрдирд┐рдВрдЧ рдХрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд╛рдпрд░рдХреЛрдбрд╛ рдФрд░ рдЗрдУрд╕реЗрд╡рдХрд╛ рдЬреИрд╕реЗ рдлрд╝реЙрдиреНрдЯ рд▓рд┐рдЧрдЪрд░ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Map[T Constraint] рдФрд░ map[string]T рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ [] рдХреЗ рджреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рдмрд╕ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдЕрд╡рд╕реНрдерд╛ рдХреЛ рддреЗрдЬ рдХрд░ рджреЗрдЧрд╛ред

рдиреЛрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди map[T1]T2 рдФрд░ Map[T1 Constraint] рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реНрд╡ рдореЗрдВ рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдмрд╛рдзрд╛ рд╣реИред

рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдЬреИрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕реБрдирдХрд░ рд╣рдореЗрдВ рдЦреБрд╢реА рд╣реБрдИред рднрд╛рд╡рдирд╛рдУрдВ рдФрд░ рд╡рд░реАрдпрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рд╣рдордд рд╣реЛрдиреЗ рдФрд░ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рджред

@ianlancetaylor рдХрд╛рдлреА рдореЗрд▓рд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдирд╛рдЗрдЯрдкрд┐рдХреНрд╕ рд╕реБрдирдХрд░ рдердХ рдЧрдП рд╣реИрдВ :) рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореЗрд░рд╛ рдорддрд▓рдм рд╕реНрдХреИрдирд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдВрддрд░ рдХрд░рдирд╛ рдерд╛ред

рднрд▓реЗ рд╣реА, рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред рд╢реБрдХреНрд░рд┐рдпрд╛ред

reflect.MakeFunc рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдк рдЧреЛ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдкреНрд░рджрд░реНрд╢рди рдЬреАрдд рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред

@ рдЬреВрд▓рд┐рдпреЛ-рдЧреБрдПрд░рд╛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ "рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░реЗрдВ" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдЖрдк рдХреБрдЫ рд╣рдж рддрдХ рддрд░реНрдХ рдФрд░ рд╡рд╛рдкрд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдорд╛рдк рд╕рдХрддреЗ рд╣реИрдВ: https://go2goplay.golang.org/p/RwU11S4gC59

package main

import (
    "fmt"
)

func Call[In, Out any](f func(In) Out, v In) Out {
    return f(v)
}

func main() {
    triple := func(i int) int {
        return 3 * i
    }
    fmt.Println(Call(triple, 23))
}

рдпрд╣ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рджреЛрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реНрдерд┐рд░ рд╣реЛред

@ рдЬреВрд▓рд┐рдпреЛ-рдЧреБрдПрд░рд╛ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ "рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░реЗрдВ" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдЖрдк рдХреБрдЫ рд╣рдж рддрдХ рддрд░реНрдХ рдФрд░ рд╡рд╛рдкрд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдорд╛рдк рд╕рдХрддреЗ рд╣реИрдВ: https://go2goplay.golang.org/p/RwU11S4gC59

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд (рдЗрд╕реА рддрд░рд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕рд░рдгреА рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ред MakeFunc)ред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдлрд╝рдВрдХреНрд╢рди рд░реИрдкрд░ (рдЯреВрд▓ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

lkarlslund picture lkarlslund  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jayhuang75 picture jayhuang75  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mingrammer picture mingrammer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

michaelsafyan picture michaelsafyan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

go101 picture go101  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ