рдпрд╣ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд┐рднреЗрджрд┐рдд рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐:
рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЖрд░реНрдореНрд╕ рдХреЗ рдЕрдВрджрд░, рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдЙрд╕ рд╡реИрд░рд┐рдПрдВрдЯ рдХрд╛ рд╣реЛ рдЬрд┐рд╕рдХрд╛ рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдУрдкрди рд╕реЛрд░реНрд╕ рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рдЕрддреАрдд рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред рдкрд┐рдЫрд▓реА рдЖрдо рд╕рд╣рдорддрд┐ рдпрд╣ рд░рд╣реА рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫрд╛рдБрдЯ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдЬреЛ рдорд┐рд▓рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╕рдВрдХрд▓рдХ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рднрд░ рджрд┐рдпрд╛ рд╣реИред рдПрдХ рдирдП рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд▓рд╛рдн рд╣реИред
рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдзрд┐рдХ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рд╕реНрддрд╛рд╡ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреНрдпрд╛ рд╣реИ? рдареАрдХ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? (рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ "рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░" рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рднреА рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВ)ред рд╕реМрджреЗрдмрд╛рдЬреА рдХреНрдпрд╛ рд╣реИрдВ?
рдкрд┐рдЫрд▓реА рдХреБрдЫ рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП https://www.reddit.com/r/golang/comments/46bd5h/ama_we_are_the_go_contributors_ask_us_anything/d03t6ji/?st=ixp2gf04&sh=7d6920db рджреЗрдЦреЗрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Go1 рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдФрд░ рдЗрд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЧреЛ 2 рдХреЗ рдмрдбрд╝реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВред
рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рд▓ рдпрд╛ рдЙрд╕рд╕реЗ рднреА рдЬреНрдпрд╛рджрд╛ рд╕рдордп рд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдПрдХ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдорд┐рд▓рд╛ рд╣реИ, рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
"рдкрд╕рдВрдж рдкреНрд░рдХрд╛рд░" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдпреЛрдЧ рдкреНрд░рдХрд╛рд░" рд╕реЗ рдмреЗрд╣рддрд░ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдИрдПрдордПрдорд╡реАред
рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ "|" рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдСрдкрд░реЗрдЯрд░ред
type: type1 | type2 ...
рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдзрд╛рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред NS
рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ
рдореВрд▓реНрдп рдЬреЛ рдЗрд╕реЗ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, "рд╢реВрдиреНрдп" рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рдирд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
type maybeInt nil | int
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд░рдЦрддрд╛ рд╣реИ
рдЗрд╕рдХреЗ рд╕рднреА рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ, рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░
рдирд╛рдо рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ред
рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдХрд╛ рд╡рд┐рд╖рдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдгред рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдореЗрдВ, рд╕реНрд╡рд┐рдЪ рдХреА рдкрд╣рд▓реА рднреБрдЬрд╛ рдЬреЛ
рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ
рдпреЛрдЧред
рдХрд┐рд╕реА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдпрджрд┐ рдорд╛рди рдЕрдзрд┐рдХ рдореЗрдВ рдлрд╝рд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ, рдлрд┐рд░ рдкрд╣рд▓реЗ рдХреЛ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
var x int|float64 = 13
рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ int рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди
var x int|float64 = 3.13
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдлреНрд▓реЛрдЯ64 рд╡рд╛рд▓рд╛ рдорд╛рди рд╣реЛрдЧрд╛ред
рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдореВрд▓реНрдпред рдПрдХ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрддред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ
рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреИрд░-рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдпрд╛рдж рд░рдЦреЗрдВред
рд╕рдо-рдСрдл-рд╕реНрдЯреНрд░рдХреНрдЪрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЙрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП structs рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдЗрдЯреНрд╕ред
@rogpeppe рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░реЗрдЧрд╛? рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛) рдкрд░ case
рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рдЬреЛ рдпреЛрдЧ рдХрд╛ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдЧреИрд░-рд╡рд┐рд╕реНрддреГрдд рд╕реНрд╡рд┐рдЪ рд╣реЛрдирд╛ рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА?
рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ
type T int | interface{}
рдФрд░ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ:
switch t := t.(type) {
case int:
// ...
рдФрд░ t рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ int рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ case interface{}
?
рдпрд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?
type T interface{} | nil
рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЕрдЧрд░ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ
var t T = nil
рдЯреА рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдпрд╛ рд╡рд╣ рдирд┐рд░реНрдорд╛рдг рд╡рд░реНрдЬрд┐рдд рд╣реИ? рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдкреНрд░рд╢реНрди type T []int | nil
рд▓рд┐рдП рдЙрдарддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛
рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдорд┐рд▓рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреИрд░-рд╡рд┐рд╕реНрддреГрдд рд╕реНрд╡рд┐рдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ - рд╣рдо
рдХрд╣реАрдВ рдФрд░ рдердХрд╛рд╡рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдмрд╛рдд рдЬреЛ рд╢рд╛рдпрдж
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЪреНрдЫрд╛ рд╣реЛ: рдпрджрд┐ рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реИ, рддреЛ рд╣рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ
рдЗрд╕реЗ рдПрдХ рд╕рдорд╛рдкреНрддрд┐ рдХрдерди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рддреНрд░реБрдЯрд┐ рд╣реИ рддреЛ рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
func addOne(x int|float64) int|float64 {
switch x := x.(type) {
case int:
return x + 1
case float64:
return x + 1
}
}
рдФрд░ рдЖрдк рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдорд▓рд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВред
рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ
рдЯрд╛рдЗрдк рдЯреА рдЗрдВрдЯ | рдЗрдВрдЯрд░рдлреЗрд╕{}
рдФрд░ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ:
рд╕реНрд╡рд┐рдЪ рдЯреА: = рдЯреАред (рдкреНрд░рдХрд╛рд░) {
рдХреЗрд╕ рдЗрдВрдЯ:
//...
рдФрд░ t рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ int рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ рдХреЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╣реИ?
t рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ {} рдЬрд┐рд╕рдореЗрдВ рдПрдХ int рд╣реЛред рдЯреА рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ
рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реА рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓
рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рдЧрдгрд┐рдд рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддрд░рд╣ {} рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ {} рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЗрдВрдЯ рд╣реЛред
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдПрдХ рдареЛрд╕ рдорд┐рд▓рддрд╛ рд╣реИ
рдЧрддрд┐рд╢реАрд▓ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣реЛрдирд╛ рдареАрдХ рд░рд╣реЗрдЧрд╛:
type R io.Reader | io.ReadCloser
рдЯрд╛рдЗрдк рдЯреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ {} | рд╢реВрдиреНрдп? рдЕрдЧрд░ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ
рд╡рд░ рдЯреА рдЯреА = рд╢реВрдиреНрдп
рдЯреА рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдпрд╛ рд╡рд╣ рдирд┐рд░реНрдорд╛рдг рд╡рд░реНрдЬрд┐рдд рд╣реИ? рдЯрд╛рдЗрдк рдЯреА []int | . рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╢реНрди рдЙрдарддрд╛ рд╣реИ рд╢реВрдиреНрдп, рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдкрдХреЛ рдкрд╣рд▓рд╛ рдЖрдЗрдЯрдо рдорд┐рд▓рддрд╛ рд╣реИ
рдпреЛрдЧ рдореЗрдВ рдХрд┐ рдореВрд▓реНрдп рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
рдЖрдкрдХреЛ рд╢реВрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд┐рд▓реЗрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕{} | рд╢реВрдиреНрдп рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдмреЗрдорд╛рдиреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {}
рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
[]int | . рдХреЗ рд▓рд┐рдП nil, рдПрдХ nil []int рдПрдХ nil рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП
([]int|nil)(nil)
рдХрд╛ рдареЛрд╕ рдореВрд▓реНрдп []int(nil)
рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдХрд┐рдП nil
ред
[]int | nil
рдорд╛рдорд▓рд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ nil
рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ "рд╢реВрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди" рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
type T []int | nil
var x T = nil
рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ x
nil рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, nil []int
ред
рд╡рд╣ рдорд╛рди рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП nil []int
рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛:
var y T = []int(nil) // y != x
рдХреНрдпрд╛ рдпреЛрдЧ рд╣рдореЗрд╢рд╛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рд╣реЛрдиреЗ рдкрд░ рднреА рд╢реВрдиреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА? рдЕрдиреНрдпрдерд╛ var x int64 | float64
рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░, рдЕрдиреНрдп рдирд┐рдпрдореЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛, рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ var x interface{} | int
рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЬреИрд╕рд╛ рдХрд┐ @bcmills рдмрддрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдпреЛрдЧ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗред рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рди рд╣реЛрдиреЗ рдкрд░ рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рдЦрд╛рд▓реА default:
рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ, "рдХрд┐рд╕реА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдпрджрд┐ рдорд╛рди рдЕрдзрд┐рдХ рдореЗрдВ рдлрд╝рд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ, рдлрд┐рд░ рдкрд╣рд▓реЗ рдХреЛ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред"
рдХреЗ рд╕рд╛рде:
type T []int | nil
var x T = nil
x рдореЗрдВ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ []int рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ nil []int рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ []int рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп []int (рд╢реВрдиреНрдп) рдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред
рдХреНрдпрд╛ рдпреЛрдЧ рд╣рдореЗрд╢рд╛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рд╣реЛрдиреЗ рдкрд░ рднреА рд╢реВрдиреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА? рдЕрдиреНрдпрдерд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ var x int64 | рдлреНрд▓реЛрдЯ64 рд╣реЛ?
рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ "рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ
рдпреЛрдЧред", рддреЛ рдЙрддреНрддрд░ int64(0) рд╣реИред
рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░, рдЕрдиреНрдп рдирд┐рдпрдореЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛, рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ var x рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} | рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред NS? рдЬреИрд╕рд╛ рдХрд┐ @bcmills рдмрддрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд░рд╛рд╢рд┐ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдирд╣реАрдВ, рдпрд╣ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдЧрд╛ред рд╡рд╣ рдкреНрд░рдХрд╛рд░ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} | рд╢реВрдиреНрдп) рдмреЗрдорд╛рдиреА рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рддрддреНрд╡ рджреВрд╕рд░реЗ рдХрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдпреЛрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИред
рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реБрдЭрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЙрд╕ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдСрд▓-рдмрд╛рдЗрдЯреНрд╕-рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдЕрд▓рдЧ рдмрдирд╛ рджреЗрдЧрд╛ред рдЧреЛ рдореЗрдВ рд╣рд░ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ред рдпрд╛ рд╢рд╛рдпрдж рд╣рдо рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдПрдХ рдЕрдкрд╡рд╛рдж рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдорд╛рди рд╕реВрдЪреАрдмрджреНрдз рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ nil
рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдкрд╣рд▓рд╛ рдкреНрд░рдХрд╛рд░ рд╕реВрдЪреАрдмрджреНрдз рд╣реИред
рддреЛ (stuff) | nil
рдХреЗрд╡рд▓ рддрднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм (рд╕рд╛рдорд╛рди) рдореЗрдВ рдХреБрдЫ рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ nil | (stuff)
рдЕрд░реНрде рдХреБрдЫ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рди рдореЗрдВ рдХреБрдЫ рднреА рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд╢реВрдиреНрдп рдХреНрдпрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ?
@ianlancetaylor рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдХрдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдПрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ (рдмрдВрдж) рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк C . рдореЗрдВ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ
struct {
int which;
union {
A a;
B b;
C c;
} summands;
}
рдпрджрд┐ which
рд╕рдВрдШ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ 0 = a, 1 = b, 2 = c, рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рд╢реВрдиреНрдп рд╣реЛрддреА рд╣реИред рдФрд░ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд╣реАрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЬрд╣рд╛рдВ рднреА рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдШ рдХреЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рджреЗрдЧрд╛, рдЬреЛ рдХрд┐ рджрд┐рд▓рдЪрд╕реНрдк рднреА рд╣реИред
рдХреНрдпрд╛ рд╕рднреА рд╢реВрдиреНрдп рдорд╛рди рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдЬреЛ рдкреНрд░рдХрд╛рд░ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛:
type A = B|C
struct A {
choice byte // value 0 or 1
value ?// (thing big enough to store B | C)
}
[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ]
рд╕реЙрд░реА @jimmyfrasche рдиреЗ рдореБрдЭреЗ рдкрдВрдЪ рдорд╛рд░ рджрд┐рдпрд╛ред
рдХреНрдпрд╛ рд╢реВрдиреНрдп рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
type S int | string | struct{}
var None struct{}
?
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рднреНрд░рдо рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ, рдХрдо рд╕реЗ рдХрдо)
рдпрд╛ рдФрд░ рдЕрдЪреНрдЫрд╛
type (
None struct{}
S int | string | None
)
рдЗрд╕ рддрд░рд╣ рдЖрдк None
рдкрд░ рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ None{}
рд╕рд╛рде рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
@jimmyfrasche struct{}
рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ nil
ред рдпрд╣ рдПрдХ рдорд╛рдореВрд▓реА рд╡рд┐рд╡рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ (?) рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рдХреЛ рдЕрд▓рдЧ рдХрд░ рджреЗрдЧрд╛ред
@bcmills рдЕрдиреНрдпрдерд╛ рджрд╛рд╡рд╛ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ
@rogpeppe рдпрд╣ рдХреНрдпрд╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ?
// r is an io.Reader interface value holding a type that also implements io.Closer
var v io.ReadCloser | io.Reader = r
switch v.(type) {
case io.ReadCloser: fmt.Println("ReadCloser")
case io.Reader: fmt.Println("Reader")
}
рдореИрдВ "рдкрд╛рдардХ" рдорд╛рдиреВрдВрдЧрд╛
@jimmyfrasche рдореИрдВ рдорд╛рди ReadCloser
, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
(рдФрд░ рдореИрдВ рдЙрди рд░рдХрдо рдХреА рднреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рдирдореЗрдВ рдирд┐рдпрдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЯреИрдЧ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рдореЗрдВ рд▓реБрдХрдЕрдк рдУрд╡рд░рд╣реЗрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред)
@bcmills рдпрд╣ рд╡рд╣ https://play.golang.org/p/PzmWCYex6R
@ianlancetaylor рдпрд╣ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБ рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░рд╛ "рдмреЗрд╡рдХреВрдл рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рд╕реБрдЭрд╛рд╡ рд╕реНрд╡рдпрдВ рднреА рдмреЗрд╡рдХреВрдл рд╣реИред рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рд╕реВрдЪрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЬрдм рдЙрдкрдпреБрдХреНрдд рд╣реЛ, рддреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдЯреИрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рдЯреИрдЧ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп рд╣реЛред
рджрд┐рдпрд╛ рдЧрдпрд╛:
var x int | nil = nil
x рдХрд╛ рд░рдирдЯрд╛рдЗрдо рдорд╛рди рд╕рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред x рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдпрд╛ рдХрдирд╡рд░реНрдЯ рдХрд░рддреЗ рд╕рдордп
рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЯреИрдЧ рдХреЛ рдПрдХ рдЫреЛрдЯреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреЗрддред
рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗрд╡рд▓ рддрднреА рджреА рдЬрд╛рдП рдЬрдм рдпрд╣ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╣реЛ, рд▓реЗрдХрд┐рди
рдЬреЛ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ:
var t nil | int
var u float64 | t
@jimmyfrasche рдореИрдВ ReadCloser рдорд╛рдиреВрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
рд╣рд╛рдВред
@bcmills рдпрд╣ рд╡рд╣ https://play.golang.org/p/PzmWCYex6R
рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд░реАрдбрдХреНрд▓реЛрдЬрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП "рдпрд╣ [...] рдорд╛рдиреНрдп рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛"
рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣, рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрд╕рдореЗрдВ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдареЛрд╕ рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЬрдм рдПрдХ рдпреЛрдЧ рдореЗрдВ рдХрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ - рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдорд╛рди рдХреЛ рдШреЛрд╖рд┐рдд рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╛рдиреА, рдЬрдм рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ (I1 | I2) рдХреЛ рдХреБрдЫ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ I1 рдФрд░ I2 рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рддреЛ рдмрд╛рдж рдореЗрдВ рдпрд╣ рдмрддрд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рдорд╛рди рдбрд╛рд▓рд╛ рдерд╛ рд╡рд╣ рдЙрд╕ рд╕рдордп I1 рдпрд╛ I2 рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ io.ReadCloser | . рд╣реИ io.Reader рдЬрдм рдЖрдк рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ io.Reader рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ io.ReadCloser рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЕрдирдмреЙрдХреНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд░реАрдмреЙрдХреНрд╕ рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░реА рддрд░рдл рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ io.Reader | io.ReadCloser рдпрд╣ рдпрд╛ рддреЛ рдХрднреА рднреА io.ReadCloser рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдпреЛрдЧ рдореЗрдВ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдорд┐рд▓рд╛рди" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@rogpeppe рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ, рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдпреБрдХреНрдд) рдкрд░ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ред рджреВрд╕рд░рд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп рдЕрдзрд┐рдХ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкрдардиреАрдпрддрд╛/рд╕рдордЭ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рдореБрдЦ рд▓рд╛рдн рд╣реИ?
(рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдмрд╕ рдЕрдкрдиреЗ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдФрд░ рдЕрд░реНрдердкреВрд░реНрдг рдЬрдЯрд┐рд▓рддрд╛ "рдпрдереЛрдЪрд┐рдд рдЫреЛрдЯрд╛" рд╣реИ - рдЬреЛ рдХреБрдЫ рднреА рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рдХ рд╣реЛрдиреЗ рдХрд╛ рд▓рд╛рдн рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрд▓реНрджреА рдкрдХрдбрд╝реЗрдВред)
@griesemer рд╣рд╛рдБ, рдпрд╣ рд╕рд╣реА рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪреИрдирд▓реЛрдВ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрдардиреАрдпрддрд╛ рдФрд░ рд╢реБрджреНрдзрддрд╛ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рдЙрдкрд▓рдмреНрдз рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирд┐рд░реНрдпрд╛рдд рди рдХреА рдЧрдИ рд╡рд┐рдзрд┐ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд╛-рдЕрдзреВрд░рд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ a) рдПрдореНрдмреЗрдбрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╣рд╛рд░реНрдп рдФрд░ b) рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдХрдард┐рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╡рд┐рдзрд┐ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИред
@jimmyfrasche
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ io.ReadCloser | . рд╣реИ io.Reader рдЬрдм рдЖрдк рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ io.Reader рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ io.ReadCloser рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЕрдирдмреЙрдХреНрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд░реАрдмреЙрдХреНрд╕ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ io.Reader рд╣реЛрддрд╛ рд╣реИ (рдпрд╛ рд╢реВрдиреНрдп, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА io.Reader рднреА рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рджреЛ рд╡рд┐рдХрд▓реНрдк рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВ - рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдПрдХ "рд╕рдорд╛рд╡реЗрд╢реА рдпрд╛" рд╣реИ рди рдХрд┐ "рдЕрдирдиреНрдп рдпрд╛"ред
рджреВрд╕рд░реА рддрд░рдл рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ io.Reader | io.ReadCloser рдпрд╣ рдпрд╛ рддреЛ рдХрднреА рднреА io.ReadCloser рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдпреЛрдЧ рдореЗрдВ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдорд┐рд▓рд╛рди" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ "рджреВрд╕рд░реЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЬрд╛рдХрд░", рдЖрдкрдХрд╛ рдорддрд▓рдм рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реИ, рддреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ:
"рдХрд┐рд╕реА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдпрджрд┐ рдорд╛рди рдЕрдзрд┐рдХ рдореЗрдВ рдлрд╝рд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ, рдлрд┐рд░ рдкрд╣рд▓реЗ рдХреЛ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред"
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ io.ReadCloser рдПрдХ io.Reader рдФрд░ рдПрдХ io.ReadCloser рджреЛрдиреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ io.Reader рдЪреБрдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдкреНрд░рдХрд╛рд░ io.Reader рдФрд░ рдкреНрд░рдХрд╛рд░ io.Reader | . рдХреЗ рдмреАрдЪ рдХреЛрдИ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ io.ReadCloser, рдХреНрдпреЛрдВрдХрд┐ io.Reader io.Reader рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рдзрд╛рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ {} рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдпреЛрдЧреНрдпрддрд╛рдПрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдЬреЛрдбрд╝рддреА рд╣реИрдВред
@rogpeppe рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдкрд╕рдВрдж рд╣реИрдВред рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдФрд░ рд╢реВрдиреНрдп рдорд╛рди рд╕рдмрд╕реЗ рдмрд╛рдПрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд░рд▓ рд╣реИред рдмрд╣реБрдд рдЬрд╛рдУред
рдореИрдВ рдЬрд┐рд╕ рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рд╡рд╣ рдПрдХ рдРрд╕рд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдпреЛрдЧ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рд▓рд┐рдП рдмреЙрдХреНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдЗрдП, рдлрд┐рд▓рд╣рд╛рд▓, рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдХрд╣реЗрдВ рдХрд┐ рдЖрд░рд╕реА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ io.ReadCloser рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд░ рддреБрдо рдпрд╣ рдХрд░рддреЗ рд╣реЛ
var v io.ReadCloser | io.Reader = RC{}
рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ
var r io.Reader = RC{}
var v io.ReadCloser | io.Reader = r
рдХреЗрд╡рд▓ рд╕рдордЭрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ io.Reader рдХреЗ рд░реВрдк рдореЗрдВ v store r рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рдЖрдк v рдкрд░ рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рдХрд┐ рдЬрдм рдЖрдк io.Reader рдХреЗрд╕ рдХреЛ рд╣рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирд╣реАрдВ рд╣реИ рдЖрдИрдУ.рд░реАрдбрдХреНрд▓реЛрдЬрд░ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
switch v := v.(type) {
case io.ReadCloser: useReadCloser(v)
case io.Reader:
if rc, ok := v.(io.ReadCloser); ok {
useReadCloser(rc)
} else {
useReader(v)
}
}
рдЕрдм, рдПрдХ рд╕рдордЭ рд╣реИ рдЬрд┐рд╕рдореЗрдВ io.ReadCloser <: io.Reader, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рд╣реИ рдФрд░ рдЧреЛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрд░рдорд╢рдГ рдП (), рдмреА (), рдФрд░ рд╕реА () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдП, рдмреА, рдФрд░ рд╕реА рддреАрди рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдФрд░ рддреАрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдПрдмреАрд╕реА рд╣реИред A, B, рдФрд░ C рдЕрд╕рдВрдпреБрдХреНрдд рд╣реИрдВ рдЗрд╕рд▓рд┐рдП A | рдмреА | рд╕реА рдФрд░ рдЗрд╕рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд╕рднреА рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ
var c C = ABC{}
var v A | B | C = c
рдЗрд╕реЗ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдкрд░ v рдХреНрдпрд╛ рд╣реИред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд░рд╛рд╢рд┐ рдХреЛ рдЕрдирдмреЙрдХреНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпрджрд┐ рдСрд░реНрдбрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдирдмреЙрдХреНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдмрдВрдз рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдИ рднреА рд╕рд╛рд░рд╛рдВрд╢ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
рдПрдХрдорд╛рддреНрд░ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдХ рдпреЛрдЧ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рд▓рдЧрддрд╛ рд╣реИред
рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ (рдЬреИрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЬрд╕реНрдЯ рд╡реА рдХреЛ рдЯрд╛рдЗрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реВрдВред
@jimmyfrasche рдЖрджреЗрд╢рд┐рдд рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ? рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдмреЙрдХреНрд╕ structs рдХреЗ рд╕рд╛рде рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ:
type ReadCloser struct { io.ReadCloser }
type Reader struct { io.Reader }
var v ReadCloser | Reader = Reader{r}
@bcmills рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рдФрд░
рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдкрд╖реНрдЯ рдмреЙрдХреНрд╕ рд╕рдВрд░рдЪрдирд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╢рдХреНрддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рдЕрд╕рдВрдмрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдлреБрдЯрдиреЛрдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯрдкреНрд░рдж рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрджрдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд░рд▓ рд╣реИ рдФрд░ рдЧреЛ рдХреЗ рджрд░реНрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реЛрдиреЗ рджреЗрддрд╛ рд╣реИред
рд╕рднреА рдЧрд╛рд░рдВрдЯрд┐рдпрд╛рдВ рдЬреЛ рдЖрдк рдПрдХ рд░рд╛рд╢рд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдЧрд╛рд░рдВрдЯреА рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдПрдХ рд╕рдЦреНрддреА рд╕реЗ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдП | рдмреА | рд╕реА рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдерд┐рд░ рдХреНрдпрд╛ рд╣реИ
рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕реМрдВрдкрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдХрдВрдХреНрд░реАрдЯ рдХреЗ рдПрдХрд▓ рдореВрд▓реНрдп рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ
рдкреНрд░рдХрд╛рд░ - рдкреНрд░рддрд┐рдмрдВрдз рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рди рдП, рдмреА рдФрд░ рд╕реА рдореЗрдВ рд╕реЗ рдПрдХ (рдХрдо рд╕реЗ рдХрдо) рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред
рдЕрдВрдд рдореЗрдВ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рд╣реИред
рдпрд╣реА рд╣реИ, рдпрджрд┐ рдХрд┐рд╕реА рдорд╛рди рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ-рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде, рд╣рдо рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рд╕рджрд╕реНрдп рд░рд╣рд╛ рд╣реИ
"рдЪреБрдирд╛ рд╣реБрдЖ" - рд╣рдо рдХреЗрд╡рд▓ рдорд╛рди рдХреЛ рд╣реА рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВред рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬрдм рдЖрдк рдПрдХ io.Reader рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП {}, рдЖрдк рд╕реНрдерд┐рд░ io.Reader рдкреНрд░рдХрд╛рд░ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдорд╛рди рд╣реА рд╣реЛрддрд╛ рд╣реИ
рдЬреЛ io.Reader рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ
рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:
var c C = ABC{}
var v A | B | C = c
рдП, рдмреА рдФрд░ рд╕реА рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╡реА рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рд╕рдлрд▓ рд╣реЛрдЧрд╛ред рдпрд╣ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред
@rogpeppe рд╡реЗ рд╢рдмреНрджрд╛рд░реНрде рдЬреЛ рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдпреЛрдЧ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдм рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рдЧрддрд┐!
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ type U I | *T
рдЬрд╣рд╛рдВ I
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ *T
рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ I
ред
рджрд┐рдпрд╛ рдЧрдпрд╛
var i I = new(T)
var u U = i
u
рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ *T
, рдФрд░ in
var u U = new(T)
рдЖрдк рдЙрд╕ *T
рдХреЛ I
рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╡реЛ рд╕рд╣реА рд╣реИ?
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╡реИрдз рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рд╕реЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдпреЛрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рдорд┐рд▓рд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рдЦреЛрдЬ рдХрд░рдиреА рд╣реЛрдЧреАред
рдпрд╣ var v uint8 | int32 | int64 = i
рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рднреА рд╣реЛрдЧрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдмрд╕ рд╣рдореЗрд╢рд╛ рдЙрди рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдЬреЛ рднреА i
, рднрд▓реЗ рд╣реА i
рдПрдХ int64
рдЬреЛ uint8
рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рдЧрддрд┐!
рд╡рд╛рд╣!
рдЖрдк рдЙрд╕ * рдЯреА рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЗ рд╕рд╛рде I рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╡реЛ рд╕рд╣реА рд╣реИ?
рд╣рд╛рдВред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╡реИрдз рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рд╕реЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдпреЛрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рдорд┐рд▓рд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рдЦреЛрдЬ рдХрд░рдиреА рд╣реЛрдЧреАред
рд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ (рдмреЗрд╢рдХ рд╕рдВрдХрд▓рдХ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЪреБрдирдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреЛрдИ рдЦреЛрдЬ рдирд╣реАрдВ рд╣реИ)ред
рдпрд╣ var v uint8 | . рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рднреА рд╣реЛрдЧрд╛ int32 | int64 = i рдЬреЛ, рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рдореЗрд╢рд╛ рдЙрди рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдЬреЛ рднреА рд╣реЛ, рдореИрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рдореИрдВ рдПрдХ int64 рдерд╛ рдЬреЛ uint8 рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред
рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рддрдХ рдореИрдВ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реВрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред
рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рддрдХ рдореИрдВ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реВрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред
рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ, рдирд┐рдпрдо рдХреЗ рдХрд╛рд░рдг рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЗрдЬрд╛рдЬрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИред рдирд┐рдпрдо рд╡рд╣реА рд░рд╣рддрд╛ рд╣реИред
рддреЛ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рд╕реЗ I | *T
рдкреНрд░рдХрд╛рд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╡рд╣реА рд╣реИ рдЬреИрд╕реЗ I
рдФрд░ io.ReadCloser | io.Reader
рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ io.Reader
рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реИ?
рдпреЗ рд╕рд╣реА рд╣реИред рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдореЗрд░реЗ рд╕реБрдЭрд╛рдП рдЧрдП рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдХрд┐ рд╕рдВрдХрд▓рдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдорд╛рди рдпрд╛ рд╕рдорд╛рди рдирд┐рдпрдо int|int
рдЬреИрд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рд╕реЛрдЪрд╛: рдпрд╣ рд╢рд╛рдпрдж unintuitive рд╣реИ рдХрд┐ int|byte
рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ byte|int
, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╢рд╛рдпрдж рдареАрдХ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╡реИрдз рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рд╕реЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдпреЛрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рдорд┐рд▓рд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рдЦреЛрдЬ рдХрд░рдиреА рд╣реЛрдЧреАред
рд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ (рдмреЗрд╢рдХ рд╕рдВрдХрд▓рдХ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЪреБрдирдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреЛрдИ рдЦреЛрдЬ рдирд╣реАрдВ рд╣реИ)ред
рдореИрдВ рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрдврд╝рд╛ (рдЬреЛ рдХрд┐ рдЬреЛ рдЗрд░рд╛рджрд╛ рдерд╛ рдЙрд╕рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) I рдФрд░ T-рдЙрдкрдХрд░рдг- I рдХреЗ рд╕рдВрдШ U рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред
1a) U u = t
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░, рдЯреИрдЧ рдХреЛ T рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рдЪрдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо T рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдЧ рдПрдХ T рд╣реЛрддрд╛ рд╣реИред
1b) U u = i
(i рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ T рд╣реИ) рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░, рдЯреИрдЧ I рдкрд░ рд╕реЗрдЯ рд╣реИред рдмрд╛рдж рдореЗрдВ рдЪрдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо T рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдЧ рдПрдХ I рд╣реИ рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдЪреЗрдХ рд╣реИ (рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ T I рдФрд░ T рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ) рдпреВ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ) рдПрдХ рдЯреА рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред
2a) 1a . рдХреА рддрд░рд╣
2b) U u = i
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░ (i рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ T рд╣реИ), рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рди (i) рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ T рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ T рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ I рдФрд░ T рднреА U рдХрд╛ рд╕рджрд╕реНрдп рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реИ, рдЯреИрдЧ рдЯреА рдкрд░ рд╕реЗрдЯ рд╣реИред рдмрд╛рдж рдореЗрдВ рдЪрдпрди рд╕реАрдзреЗ рдЯреА рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрдм T, V, W рд╕рднреА I рдФрд░ U = *T | *V | *W | I
, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ U u = i
рд▓рд┐рдП 3 рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореВрд▓ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдирд╣реАрдВ рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рдпрд╣ рдерд╛?
рдореИрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИрдХрд░реА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдПрдХ "рдЕрдЪреНрдЫрд╛" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдмрд┐рдЯ рдмреИрдВрдЧрд┐рдВрдЧ рдХрд░реЗрдЧрд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ 4 рдпрд╛ рдЙрд╕рд╕реЗ рдХрдо рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдШ рд╣реИ рдЬрд╣рд╛рдВ рд╕рднреА рд╕рдВрджрд░реНрдн 4-рдмрд╛рдЗрдЯ рдЧрдардмрдВрдзрди рд╣реИрдВ, рддреЛ рдЯреИрдЧ рдХреЛ рдирд┐рдЪрд▓реЗ 2 рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рдореВрд▓реНрдп рдХреЗ рдмрд┐рдЯреНрд╕ред рдмрджрд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╕рдВрдШ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛ рдкрддрд╛ рд▓реЗрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреИрдЧ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ "рдкреБрд░рд╛рдиреЗ" рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рдпрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 50-рдИрд╢-рдмрд┐рдЯ рдПрдбреНрд░реЗрд╕ рд╕реНрдкреЗрд╕ рдерд╛ рдФрд░ рд╣рдо NaN рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд▓реЗрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рдереЗ, рддреЛ рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдбрдмрд▓реНрд╕ рдХреЛ 64-рдмрд┐рдЯ рдпреВрдирд┐рдпрди рдореЗрдВ рдердкреНрдкрдбрд╝ рдорд╛рд░ рд╕рдХрддреЗ рдереЗ, рдФрд░ рдХреБрдЫ рдмрд┐рдЯ рдлрд╝рд┐рдбрд▓рд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд▓рд╛рдЧрддред
рджреЛрдиреЛрдВ рдЙрдк-рд╕реБрдЭрд╛рд╡ рд╕реНрдереВрд▓ рд╣реИрдВ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдореЗрдВ рдХрдЯреНрдЯрд░ рд╕рдорд░реНрдердХреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА (?) рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреАред
рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдШ рдХреЗ рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХрд╛ рдкрддрд╛ рд▓реЗрдирд╛ рдареАрдХ рдирд╣реАрдВ рд╣реИ
рд╕рд╣реАред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдирддреАрдЬрд╛ рдЖрдЬ рднреА рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд╣реИ рдирд╛?
рдпреВ рдпреВ = рдЖрдИ (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЯреА рд╣реИ) рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░, рдЯреИрдЧ I рдкрд░ рд╕реЗрдЯ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд░реВрдХреНрд╕ рд╣реИ - рдХреЛрдИ рдЯреИрдЧ I рдирд╣реАрдВ рд╣реИред
рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ рдФрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде, рдЗрд╕рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ (рд╡рд╣ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЗрд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИ)ред рдЖрдк рдЬрд┐рд╕ "рдЯреИрдЧ" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдареАрдХ рдЙрд╕реА рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ (рдФрд░ рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА) рдЯрд╛рдЗрдк рдЯреИрдЧ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЧрддрд┐рд╢реАрд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реЛрддрд╛ рд╣реИ рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░, рди рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд┐рдХрд▓реНрдк "рдЪреБрдирд╛" рдЧрдпрд╛ рдерд╛ рдЬрдм рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореВрд▓ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдирд╣реАрдВ рдереЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рдпрд╣ рдерд╛?
рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@ dr2chase рдореЗрд░реА рд╕рдордЭ рдЕрдм рддрдХ рдпрд╣ рд╣реИ рдХрд┐, рдпрджрд┐ рдХрд┐рд╕реА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ (рд╡рд┐рдзрд┐ рд╕реЗрдЯреЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рд╡рд╛рд▓реЗ) рд▓реЗрдХрд┐рди рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрднреА рднреА рд╣реИрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реА-рд╢реИрд▓реА рдХреЗ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рд╕рдВрдШ рдХреА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╣ рдкрддрд╛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ (рдФрд░ рдЖрдХрд╛рд░) рдмрди рд╕рдХрддрд╛ рд╣реИ рдпреЗ рдкрддрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдпреЛрдЧ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рд╕реНрд╡рдпрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ? рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪрдпрдирд┐рдд/рдЬреЛрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд╣реА рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдХрд╣рд╛/рдирд┐рд╣рд┐рдд рд╣реИ рдЬрдм рд╕рдВрдШ рдХреЛ рдПрдХ рдореВрд▓реНрдп рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдиреНрдпрдерд╛ рд╣рдо int8 рдмрдирд╛рдо int16 рдмрдирд╛рдо int32, рдЖрджрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд╛рдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, int8 | uint8
ред
рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ?
рдпрд╣ рдирд┐рд░реНрдгрдп рдХреА рдмрд╛рдд рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ - рд╕реНрдерд┐рд░ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдирд╣реАрдВ рд╣реИред
рдЕрдиреНрдпрдерд╛ рд╣рдо int8 рдмрдирд╛рдо int16 рдмрдирд╛рдо int32, рдЖрджрд┐ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд╛рдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, int8 | uint8.
рдпрд╣рд╛рдБ рдЖрдкрдХреА рдХреНрдпрд╛ рдЪрд┐рдВрддрд╛ рд╣реИ?
рдЖрдк рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдордХрдХреНрд╖ рд╣реИ, рдмрд╕ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЕрднреА рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИ, рдлрд┐рд░ рднреА рдмреЗрдЪрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред
рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЖрдк рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ред
рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ, рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ
union {
T0
T1
//...
Tn
}
рд╕рдВрдШ рдореЗрдВ рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ (T0, T1, ..., Tn) рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЛрдИ рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд (рдирд╛рдорд┐рдд) рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рдПрдХ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реИрдз рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╕рдВрдШ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдХрд┐ type S struct { S }
рдЕрдорд╛рдиреНрдп рд╣реИред
рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди-рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣рд░ рд╕рдордп рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЦрд╛рд▓реА рд╕рдВрдШ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдЕрджреНрд╡рд┐рддреАрдп рд╣реИред рдПрдХ рдЧреИрд░-рд░рд┐рдХреНрдд рд╕рдВрдШ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╕рдВрдШ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИред
рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди, U
, рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд▓рд┐рдП U{}
рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ U
рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдФрд░ v
рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдорд╛рди рд╣реИ, рддреЛ T
, U{v}
v
рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рдВрдШ рдореВрд▓реНрдп рдмрдирд╛рддрд╛ рд╣реИ T
ред рдпрджрд┐ v
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЬреЛ U
рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдореВрд▓реНрдп U
рдХреЛ рджреВрд╕рд░реЗ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ V
рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ V(U{})
рдпрджрд┐ U
рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реЗрдЯ рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реИ V
рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реЗрдЯред рдЕрд░реНрдерд╛рддреН, рдЖрджреЗрд╢ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП, U
рдореЗрдВ V
рдХреЗ рд╕рдорд╛рди рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ U
рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рдЬреЛ V
рдмрд▓реНрдХрд┐ V
рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ U
ред
рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд (рдирд╛рдорд╛рдВрдХрд┐рдд) рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдорд╛рди, T
, рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ U
рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ U
рдПрдХ рдЪрд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдбрд╛рдпрдирд╛рдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ T
рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрдЧрдд рдорд╛рди рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ:
==
рдЧрд▓рдд рд╣реИ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ !=
рд╕рддреНрдп рд╣реИред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрдЧрдд рдорд╛рди рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВредрд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕рдХреЗ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрднрд┐рдХрдерди рдзрд╛рд░рдг рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдореБрдЦрд░ рдкреНрд░рдХрд╛рд░ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрднрд┐рдХрдерди рдзрд╛рд░рдг рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЙрд╕рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрджрд┐ рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЕрднрд┐рдХрдерди рд╣рдореЗрд╢рд╛ рд╣реЛрддрд╛ рд╣реИ)ред
рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдпрд╛ рддреЛ рд╕рдВрдкреВрд░реНрдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рд╕рд╣рд┐рдд, рдпрд╛ рдЙрдирдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рдкреИрдХреЗрдЬ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╕рдВрдШ рдореВрд▓реНрдп рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:
union{...}
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреЛ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдЕрдЪреНрдЫреЗ рдЧреБрдгреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╕рдВрдпреЛрдЧ рд╕реЗ рдпрд╣ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рд╕рдВрдШ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдХреБрдЫ рдЕрдЬреАрдм рдпреВрдирд┐рдпрдиреЛрдВ рдЬреИрд╕реЗ union{}
рдФрд░ union{ int }
ред рдкрд╣рд▓рд╛ рдХрдИ рдЕрд░реНрдереЛрдВ рдореЗрдВ struct{}
(рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдФрд░ рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, type Id union { int }
рдмрд╣реБрдд рд╣рдж рддрдХ type Id struct { int }
рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдг idValue.int
рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рдВрдмрджреНрдз рд░реВрдкрд╛рдВрддрд░рдг рдереЛрдбрд╝рд╛ рдХрдареЛрд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛ рдпрджрд┐ рдПрдХ рд╕рдВрдШ рдХреЛ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдХреЛрдб рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред
рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреА рдХрдореА рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдФрд░ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдорд┐рд▓рд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред
рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╡реИрдз рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХреЛ рд▓реЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдШ рдкрд░ рд╣реА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЧрд▓рддреА рд╕реЗ рдЕрд╡рд╛рдВрдЫрд┐рдд рддрд░реАрдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдЪрд╛рд░ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╕рд░рд▓, рд╕реНрдкрд╖реНрдЯ рд░реИрдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдкрд░ U
рдЬрд┐рд╕рдХреЗ рд╕рднреА рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ fmt.Stringer
:
func (u U) String() string {
return u.(fmt.Stringer).String()
}
рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд░реЗрдбрд┐рдЯ рдереНрд░реЗрдб рдореЗрдВ, rsc рдиреЗ рдХрд╣рд╛:
рдпреЛрдЧ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ {X; Y } рдпреЛрдЧ {Y; рдПрдХреНрд╕ }ред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд░рдХрдо рдЖрдорддреМрд░ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛
type (
Undefined = struct{}
UndefinedOrInt union { Undefined; int }
)
рдмрдирд╛рдо
type (
Illegal = struct{}
IntOrIllegal union { int; Illegal }
)
UndefinedOrInt
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рдЬрдм рдпрд╣ рд╣реЛрдЧрд╛, рддреЛ рдпрд╣ int
рдорд╛рди рд╣реЛрдЧрд╛ред рдпрд╣ *int
рд╕рдорд╛рди рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ (1 + int) рдХреЛ рдЕрдм рдЧреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рдорд╛рди рднреА рд╕рдорд╛рди рд╣реИред
рджреВрд╕рд░реА рдУрд░, IntOrIllegal
, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ int 0 рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЕрд╡реИрдз рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА *int
рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рдорд╛рди рдЗрд░рд╛рджреЗ рдХрд╛ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ new(int)
ред
рдпрд╣ рдирдХрд╛рд░рд╛рддреНрдордХ рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдмреВрд▓ рдлрд╝реАрд▓реНрдб рдХреЛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд░рдХрдо рдХреЗ рджреЛрдиреЛрдВ рд╢реВрдиреНрдп рдорд╛рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдФрд░ рд╕рд╛рд░реНрдердХ рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдЪреБрди рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдпреЛрдЧ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдПрдХ рджрд┐рди рдереЗ (рдкреНрд░рддреНрдпреЗрдХ рджрд┐рди рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд struct{}
), рдЬреЛ рднреА рдкрд╣рд▓реЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИ рд╡рд╣ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рдкрд╣рд▓рд╛ рджрд┐рди рд╣реИ, iota
-рд╕реНрдЯрд╛рдЗрд▓ рдПрдирдо рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред
рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдпрд╛ рднреЗрджрднрд╛рд╡/рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрдШ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╢реВрдиреНрдп рдорд╛рди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рд╕реА рдирд┐рдХрдЯрддрдо рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рдорд╛рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдореГрддрд┐ рд╣реИ-рд╢рд╛рдпрдж рд╣реА рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реАрдбред рдЬрд╛рд╡рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╣реИ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рдХреА рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдРрд╕реА рдХреЛрдИ рднрд╛рд╖рд╛ рд╣реИ? рд╡рд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
рдпрджрд┐ "рдпреЛрдЧ" рдФрд░ "рд╕рдВрдШ" рдХреА рдЧрдгрд┐рддреАрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рдЕрдВрддрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдФрд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рд╕рдВрд╕реНрдХрд░рдг")ред
рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП: рд╕рдВрдШ c/c++ рд╢реБрджреНрдзрддрд╛рд╡рд╛рджрд┐рдпреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡реЗрд░рд┐рдПрдВрдЯ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ COBRA рдФрд░ COM рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЬрд╣рд╛рдВ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рд╕рдВрдШ рдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЗрдЯ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╕рдВрдЬреНрдЮрд╛ рд╣реИред рдореБрдЭреЗ рдХреАрд╡рд░реНрдб _pick_ рдкрд╕рдВрдж рд╣реИред рд▓рд┐рдореНрдмреЛ рдиреЗ _pick_ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕реАрдорд┐рдд рд╕реЗрдЯ рд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрд░рд╛рджреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдирд╛рдо/рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдЪреБрдирдирд╛ рдареАрдХ рд░рд╣реЗрдЧрд╛ред
рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдХреЛрдИ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗрдЯ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред
рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдкреНрд░рдХрд╛рд░ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░рдХрдо рдпрд╛рддреНрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрджреЗрд╢ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ (рдП + рдмреА = рдмреА + рдП)ред рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░ рднреА рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рдорд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ (рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ), рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рд╛рдпрдж рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
@jimmyfrasche
рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ 'рдкрд┐рдХ' рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рдХрдореА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ 'рдкрд┐рдХ' рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╣рд╛рди рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд░рд╛ рджреЗрдЧрд╛ - рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рдЖрдк рдПрдХ рдРрд╕реЗ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдпрд╛ рддреЛ рдПрдХ io.Reader рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ StringReader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ 'рдкрд┐рдХ' рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░, рдпрджрд┐ рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ 2 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рджрд╕реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдПрдХ рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд▓рдЧреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдкрдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдореБрдЭреЗ рдЬреЛ рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░реЙрд╕ рд╕реЗрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реЛрдВрдЧреЗ рдЬрд╣рд╛рдВ рдХреЛрдИ рднреА рддрд░реАрдХрд╛ рд╕рднреА рд╕рджрд╕реНрдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧрд╛ (рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡реИрд╕реЗ рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ)ред рдФрд░ рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╕реНрд╡рд┐рдЪ + рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗрд╕ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред
@rogpeppe @jimmyfrasche рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдореБрдЭреЗ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдиреБрдХрд╕рд╛рди рд╣реИ: рдпрд╣ рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЧреЛ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрддрд╛ рд╣реИред рдХреНрд╖рддрд┐рдкреВрд░реНрддрд┐ рд▓рд╛рдн рдХреНрдпрд╛ рд╣реИ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ?
@ianlancetaylor рд░реЙрдмрд░реНрдЯ рдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИ: https://github.com/golang/go/issues/19412#issuecomment -288608089
@ianlancetaylor
рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рдЧреЛ рдХрд╛ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢ рд╣реИред Json.Token рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐, рджреВрд╕рд░реА рдУрд░, рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ
type Token Delim | bool | float64 | Number | string | nil
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреБрд░рдВрдд рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдФрд░ рдЯреВрд▓реАрдВрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╕реНрд╡рд┐рдЪ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдПрдХ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдЪрд┐рдкрдХрд╛рдиреЗ рд╕реЗ рднреА рд░реЛрдХреЗрдЧрд╛ред
рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рдЧреЛ рдХрд╛ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢ рд╣реИред
рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдХреЗ рдФрд╕рдд-рдХреЗрд╡рд▓ рдЬреНрдЮрд╛рди рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдкрдардиреАрдпрддрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ [рдирдИ рдЬреЛрдбрд╝реА рдЧрдИ] рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реИред
@cznic
рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред
рд╣рд░ рдмрд╛рд░ рдирд╣реАрдВред рдпрджрд┐ рдЖрдк "рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛" рдХреЛ "рдХреЛрдб рдореЗрдВ рдЦрд░рд╛рдм- рдпрд╛ рдЕрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ" рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╢реБрджреНрдз рдЬреАрдд рд╣реЛ рд╕рдХрддреА рд╣реИред (рдЕрд░реНрдерд╛рдд рд╡реИрд╢реНрд╡рд┐рдХ рдЬреНрдЮрд╛рди рд╕реНрдерд╛рдиреАрдп рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╡рд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред)
рдпрджрд┐ рдмреЗрд╣рддрд░ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд▓рд╛рдн рд╣реИ, рддреЛ рд╣рдо рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдмрд╣реБрдд рд╕рдорд╛рди рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣
//vet:types Delim | bool | float64 | Number | string | nil
type Token interface{}
рдЕрдм, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрдВрднреАрд░ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрдВрднреАрд░ рд╣реВрдВ: рдпрджрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдЬрдЯрд┐рд▓ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?
рдХрдИ, рд╢рд╛рдпрдж рд╕рднреА, cmd/vet рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣рдореЗрдВ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЛ рд╕рдВрдХрд▓рдХ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЗ рдмрдЬрд╛рдп рднрд╛рд╖рд╛ рдкрдХреНрд╖ рдкрд░ рдХреНрдпреЛрдВ рдЖрддреА рд╣реИ?
@ianlancetaylor рдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдлрд┐рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХреА: https://github.com/BurntSushi/go-sumtype
@ianlancetaylor рдЬрд╣рд╛рдБ рддрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЙрдЪрд┐рдд рд╣реИ, рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ - рдпрд╛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдзрдХреЗрд▓ рд░рд╣рд╛ рд╣реВрдБред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд░ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдореЗрд░реА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рд╕рдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЕрдЪреНрдЫреА рдЪреАрдЬреЗрдВ рдЕрдЪреНрдЫреА рд╣реИрдВ рдФрд░ рдмреБрд░реА рдЪреАрдЬреЗрдВ рдмреБрд░реА рд╣реИрдВ"ред рдореИрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛- рдЗрд╕рдХреА рд╕реАрдорд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВ, рдЗрд╕рдХреЗ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рд╣реИрдВ, рдкреЗрд╢реЗрд╡рд░ рдХреНрдпрд╛ рд╣реИрдВ, рд╡рд┐рдкрдХреНрд╖ рдХреНрдпрд╛ рд╣реИрдВ-рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдХреИрд╕реЗ рдлрд┐рдЯ рд╣реЛрдЧрд╛ (рдпрд╛ рдирд╣реАрдВ! ) рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛/рд╕рдХрддреА рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЕрдм рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдпреЛрдЧ рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗред рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╡реЗ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВ (рднрд▓реЗ рд╣реА рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмреБрд░рд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ), рд▓реЗрдХрд┐рди рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдареЛрд╕ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рддрд░реНрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реВрдВ, рдХрдо рд╕реЗ рдХрдоред
рдпрджрд┐ рдмреЗрд╣рддрд░ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд▓рд╛рдн рд╣реИ, рддреЛ рд╣рдо рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдмрд╣реБрдд рд╕рдорд╛рди рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдЕрднреА рднреА рд╕реАрдЦрдиреЗ-рд╕рд┐рдЦрд╛рдиреЗ-рдирдИ-рдЪреАрдЬреЛрдВ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рдХреЛрдб рдХреЛ рдбреАрдмрдЧ/рд╕рдордЭрдиреЗ/рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рдЬрд╛рджреВ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрдирд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдорд╛рдирд╕рд┐рдХ рдХрд░ рд╣реИ, рдЪрд╛рд╣реЗ рд╣рдо рдЗрд╕реЗ рдЧреЛ-рднрд╛рд╖рд╛ рдмрдЬрдЯ рдпрд╛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЧреИрд░-рднрд╛рд╖рд╛ рдмрдЬрдЯ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред рдЕрдЧрд░ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рдЬрд╛рджреВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЕрдзрд┐рдХ рдорд╣рдВрдЧреА рд╣реЛрддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬрдм рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рднрд╛рд╖рд╛ рд╕реАрдЦреА рд╣реИред
@cznic
рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рдЖрдкрдХреА рд╡рд░реНрддрдорд╛рди рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рддрдм рд╕рдордЭ рдкрд╛рдПрдЧрд╛ рдХрд┐ рдПрдХ рдЪреИрдирд▓ рдХреНрдпрд╛ рд╣реИ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИред рдлрд┐рд░ рднреА рдпреЗ рдЪреАрдЬреЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред рдФрд░ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдХреЛ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╛рдардХ рдХреЛ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@ianlancetaylor
рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдзрд┐рдХ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИред рд╕рдВрдХрд▓рди рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдирд╣реАрдВред рдпрд╣ рди рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рддреБрд░рдВрдд рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛ рджреЗрдЧрд╛, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдордЭрдирд╛ рднреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдФрд░ рд▓рд┐рдЦрдирд╛ рднреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдм рдШрдмрд░рд╛рд╣рдЯ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдРрд╕рд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЙрдиреНрд╣реЗрдВ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА - рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рднреА рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╕рдордп рд╣реЛрдЧрд╛, рдмрд┐рдирд╛ рдЕрдЬреНрдЮрд╛рдд рджреНрд╡рд╛рд░рд╛ рднрд╛рд░рд┐рдд рдХрд┐рдП . рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ (рднрд▓реЗ рд╣реА рд╡реЗ рдкреНрд░рдердо-рдкрдХреНрд╖ рд╣реЛрдВ) рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдХреНрд▓реАрдирд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╕рдВрд░рдЪрдирд╛рд╣реАрди рд╣реИрдВ, рдФрд░ рдЧрдбрд╝рдмрдбрд╝ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
@ianlancetaylor
рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЗ рдмрдЬрд╛рдп рднрд╛рд╖рд╛ рдкрдХреНрд╖ рдкрд░ рдХреНрдпреЛрдВ рдЖрддреА рд╣реИ?
рдЖрдк рдЙрд╕реА рдкреНрд░рд╢реНрди рдХреЛ рдЯреНрдпреВрд░рд┐рдВрдЧ-рдкреВрд░реНрдг рдХреЛрд░ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рддрд░реНрдХрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЧреЛ "рдЯреНрдпреВрд░рд┐рдВрдЧ рдЯреИрд░рдкрд┐рдЯ" рдмрдиреЗрдВред рджреВрд╕рд░реА рдУрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп "рдПрдХреНрд╕рдЯреЗрдВрд╢рди" рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд╕реНрдЯ, C++ рдФрд░ GNU C рдореЗрдВ "рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ"ред)
рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдХреЗ рдмрдЬрд╛рдп рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд░рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдВрдЧрддрддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдЕрд╡рдЧрдд рдирд╣реАрдВ рд╣реИрдВред (рдХреНрдпрд╛ "рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реБрд╡рд┐рдзрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИред)
рдЧреЛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ vet
рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд░рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рдЧреЛ 1 рд╕рдВрдЧрддрддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред
рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ vet
рдореЗрдВ рди рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг
switch x := somepkg.SomeFunc().(type) {
тАж
}
рдХреНрдпрд╛ рдореБрдЭреЗ рдкреИрдХреЗрдЬ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдкрд╛рд░ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреА рдЬреЛ рдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ vet
рдЗрддрдирд╛ рдЧрд╣рд░рд╛ рдПрдХ рд╕рдВрдХреНрд░рдордгреАрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕реЗ рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
@ dr2chase рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рд╕рд╣реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИрдВ? рдЬрд╛рджреВ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдпрд╣ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЬрд╛рджреВ рдХреА рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрдирд╣реАрдВ рдмрджрд▓рддреА рдХрд┐ рдХреЛрдб рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@рдмреАрд╕реАрдорд┐рд▓реНрд╕
рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЗ рдмрдЬрд╛рдп рднрд╛рд╖рд╛ рдкрдХреНрд╖ рдкрд░ рдХреНрдпреЛрдВ рдЖрддреА рд╣реИ?
рдЖрдк рдЙрд╕реА рдкреНрд░рд╢реНрди рдХреЛ рдЯреНрдпреВрд░рд┐рдВрдЧ-рдкреВрд░реНрдг рдХреЛрд░ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ....
рдореИрдВ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред рдпрджрд┐ рдЪрд░реНрдЪрд╛ рдХреЗ рддрд╣рдд рдлреАрдЪрд░ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддрд░реНрдХ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
(рдФрд░, рд╣рд╛рдБ, рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЖрдпрд╛рддрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред)
рдореИрдВ рдпрд╣ рджрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рддрд░реНрдХ рдирд┐рд░реНрдгрд╛рдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рдмрд╣реБрдд рд╣реА рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рднрд╛рд╖рд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИред рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЖрдкрдХреЛ рдордЬрдмреВрдд рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдореЗрд░реЗ рдирдЬрд░рд┐рдП рд╕реЗ рд╡реЗ рдордЬрдмреВрдд рддрд░реНрдХ рдЕрднреА рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрдП рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдордиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЛрдЪрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди рд╣реИ (https://golang.org/doc/faq#variant_types)ред
@ianlancetaylor
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ? "рдпреЛрдЧ рдХрд╛ рд╢реВрдиреНрдп-рдорд╛рди рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп-рдорд╛рди рд╣реИ" рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛ @jimmyfrasche рдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ (https://github.com/golang/go/issues/19412#issuecomment-289319916) рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдЧрд╛ред
@urandom рдореИрдВ рдПрдХ рд▓рдВрдмреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ
рдореЗрд░реЗ рдкреНрд░рддрд┐рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рдкреНрд░рддрд┐рдкреНрд░рд╕реНрддрд╛рд╡ред (рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреИрд╕рд╛ рд╣реА рд╣реИ)ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рджреВрд╕рд░реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ:
рд╕рдВрдШ рдХреЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ "рдлрд╝реАрд▓реНрдб рдирд╛рдо" рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрд╛рдж "рдЯреИрдЧ рдирд╛рдо" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
union { //or whatever
None, invalid struct{} //None is zero value
Good, Bad int
Err error //okay because it's explicitly named
}
рдЕрднреА рднреА рдХреЛрдИ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рдЯреИрдЧ рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рд░рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред
рдпреВрдирд┐рдпрди рдорд╛рдиреЛрдВ рдореЗрдВ рдбрд╛рдпрдирд╛рдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рд╣реЛрддрд╛ рд╣реИред
рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдп рдирд┐рд░реНрдорд╛рдг: U{v}
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдорд╛рдиреНрдп рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЗрд╕реЗ U{Tag: v}
ред
рдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрдЧрддрддрд╛ рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред
рдПрдХ рд╕рдВрдШ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдВрдЧрдд рд╕рдВрдШ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╛рдВрдЫрд┐рдд рдЯреИрдЧ рдирд╛рдо рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: v.Good = 1
рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рдХреЛ рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЯреИрдЧ рдЕрднрд┐рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
g := v.[Tag] //may panic
g, ok := v.[Tag] //no panic but could return zero-value, false
v.Tag rhs рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред
рдЯреИрдЧ рд╕реНрд╡рд┐рдЪ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреА рддрд░рд╣ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ switch v.[type]
рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреЗрд╕ рдпреВрдирд┐рдпрди рдХреЗ рдЯреИрдЧ рд╣реЛрддреЗ рд╣реИрдВред
рдбрд╛рдпрдиреЗрдорд┐рдХ рдЯреИрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЯрд╛рдЗрдк рдПрд╕реЗрд░реНрд╢рди рд╣реЛрд▓реНрдб рдХрд░реЗрдВред рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдХреБрдЫ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди a, b рджрд┐рдП рдЧрдП рд╣реИрдВ, a == b рдпрджрд┐ рдЙрдирдХреЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рд╕рдорд╛рди рд╣реИред
рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рд╣реИ, рдПрдХ рдЯреИрдЧ рдЕрднрд┐рдХрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдЯреИрдЧ рдирд╛рдо рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЙрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реЗрдЯ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдШ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдорд┐рд╢реНрд░рд┐рдд рдирд┐рд░реНрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдЯреИрдЧ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрди рдХрд╛ рдЯреИрдЧ рд╕реНрд╡рд┐рдЪ рдбрд┐рдлреЙрд▓реНрдЯ рдХреЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рдХрднреА рднреА рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕рднреА рдЯреИрдЧ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рд╣реИред
рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЛ рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╣реИрдВрдбрд▓ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдИ: рдиреЗрд╕реНрдЯреЗрдб рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред рджрд┐рдпрд╛ рдЧрдпрд╛
type U union {
A union {
A1 T1
A2 T2
}
B union {
B1 T3
B2 T4
}
}
var u U
u рдХрд╛ рдорд╛рди рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ A рд╣реИ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ A1 рдХреЗ рд╕рд╛рде рдЕрдирд╛рдо рд╕рдВрдШ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди T1 рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИред
u.B.B2 = returnsSomeT3()
рдЖрдкрдХреЛ рд╢реВрдиреНрдп рдорд╛рди рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рдПрдХ рдореЗрдореЛрд░реА рд▓реЛрдХреЗрд╢рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдкрд░рдВрддреБ
v := u.[A].[A2]
рдШрдмрд░рд╛рдиреЗ рдХреА рджреЛ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреИрдЧ рджреЛ рд╕рдВрдШ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЯреИрдЧ рдЕрднрд┐рдХрдерди рдХрд╛ 2 рдореВрд▓реНрдпрд╡рд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдЯреИрдЧ рд╕реНрд╡рд┐рдЪ рдХреНрд▓реАрдирд░ рд╣реЛрдВрдЧреЗред
рд╕рдВрдкрд╛рджрд┐рдд 2: рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЛрдВ рдкрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред
рджрд┐рдпрд╛ рдЧрдпрд╛
type U union {
Exported, unexported int
}
var u U
u.(int)
рдЬреИрд╕рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИред рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░, рд╡рд╣ рд╣рдореЗрд╢рд╛ рд░рд╣реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ u
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рддреЛ u.(int)
рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рдХреЗ unexported
рдХреЗ рд▓реАрдХ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдШрдмрд░рд╛рдПрдЧрд╛ред рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЗ рд▓рд┐рдПред
@ianlancetaylor рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдорджрдж рдХрд░реЗрдЧреА:
рдХреБрдЫ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП go/ast
) рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдмрдбрд╝реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭреЗ рдмрд┐рдирд╛ рдЗрди рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдЕрдзрд┐рдХ рднреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ, рдХрднреА-рдХрднреА рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ go/ast.Node
), рджреВрд╕рд░реА рдмрд╛рд░ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ (рдЬреИрд╕реЗ go/ast.Object.Decl
)ред
рдкреНрд░реЛрдЯреЛрдмрдл oneof
рдлреАрдЪрд░ рдХреЛ рдЧреЛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдПрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдмрджрд▓реЗ рдореЗрдВ oneof рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЕрдХреНрд╖рд░ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдХрдард┐рди рд╣реИ:
&sppb.Mutation{
Operation: &sppb.Mutation_Delete_{
Delete: &sppb.Mutation_Delete{
Table: m.table,
KeySet: keySetProto,
},
},
}
рдХреБрдЫ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рднреА рдирд╣реАрдВ) oneofs рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрднреА-рдХрднреА рдПрдХ "рд╢рд╛рдпрдж" рдкреНрд░рдХрд╛рд░ рд╡рд╣реА рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдХрд┐рд╕реА рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдИ Google API рд╕рдВрд╕рд╛рдзрди рдЕрджреНрдпрддрди рд╕рдВрдЪрд╛рд▓рди рд╕рдВрд╕рд╛рдзрди рдХреЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЧреЛ рдореЗрдВ рдЗрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП "рд╢рд╛рдпрдж" рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрди рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Google рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ ObjectAttrs рд╕рдВрд╕рд╛рдзрди рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
type ObjectAttrs struct {
ContentType string
...
}
рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
type ObjectAttrsToUpdate struct {
ContentType optional.String
...
}
рдЬрд╣рд╛рдВ optional.String
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ ( Godoc ):
// String is either a string or nil.
type String interface{}
рдпрд╣ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдФрд░ рдЯрд╛рдЗрдк рдХрд░рдирд╛-рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рджреЛрдиреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ ObjectAttrsToUpdate
рд╢рд╛рдмреНрджрд┐рдХ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдмрд┐рд▓реНрдХреБрд▓ ObjectAttrs
рд╢рд╛рдмреНрджрд┐рдХ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдХрд╛рд╢ рд╣рдо рд▓рд┐рдЦ рдкрд╛рддреЗ
type ObjectAttrsToUpdate struct {
ContentType string | nil
...
}
рдХрдИ рдлрд╝рдВрдХреНрд╢рди xor рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде (T, error)
рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ (T рдЕрд░реНрдердкреВрд░реНрдг рд╣реИ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рд╢реВрдиреНрдп рд╣реИ)ред рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ T | error
рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝реЗрдЧреА, рдФрд░ рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рд╣реЛрдВрдЧреЗред рднрд▓реЗ рд╣реА рд╣рдо (рд╕рдВрдЧрддрддрд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ) рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЙрд╕ рдорд╛рди рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд┐рд╕реА рдЪреИрдирд▓ рдкрд░ рд▓рд┐рдЦрдирд╛ред
рдПрдХ go vet
рдПрдиреЛрдЯреЗрд╢рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╣рд╛рдВ рдПрдХ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рддреЛ рд╣рдо рдмрд╣реБрдд рдХреБрдЫ рджреЗрдЦрддреЗ
chan *Response | error
рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХрдИ рдмрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИред
@ianlancetaylor рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдЖрдк рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреЛ 1 рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЙрди рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдФрд░ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рдерд╛:
(рдиреАрдЪреЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛/рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдирд╡реАрдирддрдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╕рд╛рде рд╣реА рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХреЛрдб рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реА рдХреЛрдб рдХреА рддрд░рд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдереНрд░реЗрдб рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред)
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЖрдИрдУрдЯрд╛, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВред
рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордХрдХреНрд╖ рд╣реИрдВ:
type Stoplight union {
Green, Yellow, Red struct {}
}
func (s Stoplight) String() string {
switch s.[type] {
case Green: return "green" //etc
}
}
рддрдерд╛
type Stoplight int
const (
Green Stoplight = iota
Yellow
Red
)
func (s Stoplight) String() string {
switch s {
case Green: return "green" //etc
}
}
рд╕рдВрдХрд▓рдХ рд╕рдВрднрд╡рддрдГ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдХреЛрдб рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдЧрд╛ред
рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, int рдХреЛ рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдИрдУрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреАрд▓рд╛/рд▓рд╛рд▓ рдХреНрдпрд╛ рд╣реИ рдпрд╛ рд╕реНрдЯреЙрдкрд▓рд╛рдЗрдЯ рдорд╛рди рдХреЛ -42 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ- рдпреЗ рд╕рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреМрд░рд╛рди рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдЖрдк рдПрдХ (рдорд╛рди) рд╕реНрд╡рд┐рдЪ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреАрд▓реА рд░реЛрд╢рдиреА рдХреЗ рд▓рд┐рдП рдЦрд╛рддреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЯреИрдЧ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдмреЗрд╢рдХ, рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдЖрдИрдУрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордХрдХреНрд╖ рд╣реИрдВ
type MaybeInt64 union {
None struct{}
Int64 int64
}
рддрдерд╛
type MaybeInt64 *int64
рд╕реВрдЪрдХ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИред рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд┐рдЯ (рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╢рдмреНрдж рдЖрдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдорд╛рди рдХрд╛ рдЖрдХрд╛рд░ рд╕рдВрднрд╡рддрдГ https://golang.org/pkg/database/sql/ рдЬреИрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ред
рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд░рд╛рджреЗ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╕рдордХрдХреНрд╖ рд╣реИрдВ
type AB union {
A A
B B
}
рддрдерд╛
type AB interface {
secret()
}
func (A) secret() {}
func (B) secret() {}
рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдП рдФрд░ рдмреА рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ- рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ json.Token рдЙрджрд╛рд╣рд░рдг @urandom рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдпрд╣ рджреЗрдЦрдирд╛ рд╡рд╛рдХрдИ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдк рдПрдмреА рдпреВрдирд┐рдпрди рдмрдирд╛рдо рдПрдмреА рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдХреНрдпрд╛ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд░рд┐рднрд╛рд╖рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ (рдореБрдЭреЗ рдХреБрдЫ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рд░ рдЧреЛ/рдПрд╕реНрдЯ рд╕реНрд░реЛрдд рдХреЛ рдкрдврд╝рдирд╛ рдкрдбрд╝рд╛ рд╣реИ)ред
рдПрдмреА рд╕рдВрдШ рдХрднреА рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд╛рд╣рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ (рдЗрд╕реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдХреЗ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рдирд┐рд░реНрдорд╛рдг рдЕрдзрд┐рдХ рдирд╛рдЬреБрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдмреЗрд╢рдХ, рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдУрд╡рд░рд▓реИрдк рдмрд╣реБрдд рдЕрдзрд┐рдХ рдУрд╡рд░рд▓реИрдк рд╣реЛред
рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдШ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд▓рд╛рдн рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЦреНрдд рд╕рдВрдХрд▓рди рд╕рдордп рдХреА рдЬрд╛рдБрдЪ рд╣реИред рдЖрдк рдЬреЛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рдЖрдк рдЬреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдордЬрдмреВрдд рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рддрдмреНрджреАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдХреЛрдб рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ, рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЛ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЧрд▓рдд рд╣реИрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо, рдорд╣рддреНрд╡рдкреВрд░реНрдг рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд▓рд╛рдн рд╣реИрдВред
рдЖрдИрдУрдЯрд╛ рдФрд░ рдкреЙрдЗрдВрдЯрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдХреНрд▓рдВрдХреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг "рдПрдХ рдЕрдирдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб рдореЗрдердб рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕" рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ map[string]interface{}
рдФрд░ (рдЧреИрд░-рдЦрд╛рд▓реА) рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде func рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдзрд┐ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдард┐рди рдФрд░ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред
рдЙрди рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рддреЛ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдирдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ (рджрд░реНрджрдирд╛рдХ, рдФрд░ рд╡рд┐рд░реЛрдз рдХреЗ рддрд╣рдд) рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдореИрдВ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдмрд╛рд░ рдПрдХ рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЛ рдореЗрдВ рднреА рдЕрдиреБрдорд╛рдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдмрд┐рдирд╛ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЧреЛ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ рдЬреЛ рджрд┐рдЦрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ рд╡реЛ рд╣реИред
@jimmyfrasche
рдореБрдЭреЗ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рдХрд┐ рд╕рдВрдШ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рдлрд╝реАрд▓реНрдб рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд╛рдо рдХреЗрд╡рд▓ рддрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╕рдВрдШ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЕрд░реНрдерд╣реАрди рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдирд╛рдо рд░рдЦрдирд╛ рдмреЗрдорд╛рдиреА рд╣реИ, рдФрд░ рднреНрд░рдо рдФрд░ рдЕрдзрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЖрдкрдХрд╛ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
union {
struct{}
int
err
}
рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рдЕрджреНрд╡рд┐рддреАрдп рдЗрдВрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдШ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдРрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЬреИрд╕реЗ v.struct{} = struct{}
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпреВрдирд┐рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдФрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЪреНрдЪреЗ рдврд╛рдВрдЪреЗ, рдпреВрдирд┐рдпрдиреЛрдВ рдФрд░ funcs рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдпреВрдирд┐рдпрди рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдВрддрд░рд┐рдХ рд╕рдВрдШ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреНрдп рд╕рджрд╕реНрдп рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред
рдЕрдм, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
[union|sum|pick|oneof] {
type1
package1.type2
....
}
рдЙрдкрд░реЛрдХреНрдд рдЕрдзрд┐рдХ рдЬрд╛рдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИред
рджреВрд╕рд░реА рдУрд░, type1 | package1.type2
рдЖрдкрдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ '|' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИред рдкреНрд░рддреАрдХ, рдЬрд┐рд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ OR рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЧреВрдврд╝ рд╣реБрдП рдмрд┐рдирд╛ рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
@urandom рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ "рдЯреИрдЧ рдирд╛рдо" рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ interface{}
рдореЗрдВ рдЧрд┐рд░рдиреЗ рджреЗрдВред рд╡реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдмрдирдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рдЪреАрдЬ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЯреИрдЧ рдирд╛рдо рдЙрдиреНрд╣реЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рд░рдЦрддреЗ рд╣реИрдВред
рдЯреИрдЧ рдирд╛рдо рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рд╕рдорд╕реНрдпрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд░рдореНрдордд рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рд╡реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд╣реБрдд рдХрдо рдЬрд╛рджреБрдИ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдм рдХреБрдЫ рд╢рд╛рдирджрд╛рд░ рдврдВрдЧ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рджреЗрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдФрд░ рдЯрд╛рдЗрдк рдЕрдХреНрд╖рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд┐ рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЯреИрдЧ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрд┐рддрдиреА рд╕рдлрд▓рддрд╛рдПрдБ рдпрд╛ рдЕрд╕рдлрд▓рддрд╛рдПрдБ рд╣реБрдИ рд╣реИрдВ, рдпрд╣ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (1 рд╕рдлрд▓рддрд╛ N рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЛ рд░рджреНрдж рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд)
type Counter union {
Successes, Failures uint
}
рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП
type (
Success uint
Failures uint
Counter Successes | Failures
)
рдФрд░ рдХрд╛рдо рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣реЗ рд╣реИрдВ c = Successes(1)
рдХреЗ рдмрдЬрд╛рдп c.Successes = 1
ред рдЖрдкрдХреЛ рдЬреНрдпрд╛рджрд╛ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рдпрд╛ рджреВрд░рд╕реНрде рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
type Failure union {
Local, Remote error
}
рддреНрд░реБрдЯрд┐ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЛ рдЗрд╕рдХреЗ рдЯреИрдЧ рдирд╛рдо рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рдХреБрдЫ рднреА рд╣реЛред рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЖрдкрдХреЛ type Local { error }
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рд░рд┐рдореЛрдЯ рдХреЗ рд▓рд┐рдП рднреА, рднрд▓реЗ рд╣реА рдЖрдк рд╕реАрдзреЗ рдпреЛрдЧ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред
рдЯреИрдЧ рдирд╛рдо рд╕рдВрдШ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖ рди рддреЛ рдЙрдкрдирд╛рдо рдФрд░ рди рд╣реА рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрдИ "рдЯреИрдЧ" рд╣реЛрдирд╛ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИ: рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ (рдЬрд┐рд╕реЗ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ) рдХрд░рддрд╛ рд╣реИред
рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдЯреИрдЧ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдореЛрдбрд╝ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрд▓рдЧ рдЯреИрдЧ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рд╣реЛрдиреЗ рд╕реЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ-рдкрдВрдХреНрддрд┐ рдЖрд╡рд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЭрд╛ рдкрджреНрдзрддрд┐ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд┐рддрдиреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рдерд╛, рддрдм рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрддрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рддреЗрдЬреА рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЧреЛ рдореЗрдВ рд░рдХрдо рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред
рдЙрд╕ рдкрд░ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдХ рдЙрджрд╛рд╣рд░рдг @rogpeppe io.Reader | io.ReadCloser
ред рдЯреИрдЧ рдХреЗ рдмрд┐рдирд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛, рдпрд╣ io.Reader
рдЬреИрд╕рд╛ рд╣реА рд╣реИред
рдЖрдк рдПрдХ ReadCloser рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд░реАрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдП рдЦреЛ рджреЗрддреЗ рд╣реИрдВ | рдмреА рдХрд╛ рдЕрд░реНрде рд╣реИ рдП рдпрд╛ рдмреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ред
рдпрджрд┐ рдЖрдкрдХреЛ рдХрднреА-рдХрднреА io.ReadCloser
рдХреЛ io.Reader
рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдЖрдкрдХреЛ рд░реИрдкрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ type Reader struct { io.Reader }
рдЖрджрд┐ рдФрд░ рдкреНрд░рдХрд╛рд░ Reader | ReadCloser
ред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рд░рдХрдо рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЖрдкрдХреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЙрди рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЦреЛрдЬрдХрд░реНрддрд╛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ: рд╡реЗ "рдП рдпрд╛ рдмреА" рдирд╣реАрдВ рд╣реИрдВ: рд╡реЗ "рдП рдпрд╛ рдмреА рдпрд╛ рдХрднреА-рдХрднреА рдЬреЛ рднреА рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ" рд╣реИрдВред
рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдпрджрд┐ рд╡реЗ рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рд╕реЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж рдЕрдЪрд╛рдирдХ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рдереЗ, рддрд╛рдХрд┐ рдП рдХреЛ рдХрднреА рднреА рдмреА рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХреЗред
рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЦреЛрдЬ рдХреАред рдЗрд╕рд╕реЗ рдХреЛрдИ рдЦреБрд╢ рдирд╣реАрдВ рдерд╛! рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ a = b
рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдП рдФрд░ рдмреА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдореИрдВ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реВрдВред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд┐рдпрдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдереЗ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЯрд╛рдЗрдк рдЕрд╕рд╛рдЗрдирд┐рдмрд┐рд▓рд┐рдЯреА рдЪрд▓рди рдореЗрдВ рдЖрддреА рд╣реИред рдмрд╣реБрдд рдЬрд╛рджреВ рд╣реИред
рдЖрдк рдЯреИрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣ рд╕рдм рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
union { R io.Reader | RC io.ReadCloser }
рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд░реАрдбрдХреНрд▓реЛрдЬрд░ рдХреЛ рдПрдХ рдкрд╛рдардХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдП рдпрджрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреЛрдИ рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдЯреИрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдЯреИрдЧ рд╣реИ рдпрд╛ рджреВрд╕рд░рд╛ред
рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐, рдпрджрд┐ рдЖрдкрдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕реЗ рдПрдХ io.Reader рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдХреЛрдИ chan рд░рд┐рд╕реАрд╡ рдпрд╛ func рдХреЙрд▓ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ io.ReadCloser рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЙрдЪрд┐рдд рдЯреИрдЧ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ io рдкрд░ assert рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХрд░реАрдм рдкрдврд╝реЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЖрд╢рдп рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИтАФрдареАрдХ рд╡рд╣реА рдЬреЛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХреЛрдб рдореЗрдВ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдЧ рдЕрднрд┐рдХрдерди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдХрдердиреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ io.Reader рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЯреИрдЧ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ рдЦрд┐рд▓реМрдирд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ рдмрд┐рдирд╛ рдпреВрдирд┐рдпрдиреЛрдВ/рд░рд╛рд╢рд┐/рдЖрджрд┐ рдХреЗ рдЧреЛ рдореЗрдВ рд▓рд┐рдкреНрдпрдВрддрд░рдгред рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рджреЗрдЦрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред
рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд╛рд▓рди рдлреИрд╢рди рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХреБрдЫ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдмреБрд▓реЗрдЯ рдмрд┐рдВрджреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рд▓рд┐рдкреНрдпрдВрддрд░рдг рдореЗрдВ рдХрд╛рдлреА рдХреБрдЫ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯ рдХреЗ рд╕рд╛рде рдХрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реА рд▓рд┐рдЦрддрд╛ рд╣реВрдВред
рд╕рдВрдШ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЬрд╛рдУ:
type fail union { //zero value: (Local, nil)
Local, Remote error
}
func (f fail) Error() string {
//Could panic if local/remote nil, but assuming
//it will be constructed purposefully
return f.(error).Error()
}
type U union { //zero value: (A, "")
A, B, C string
D, E int
F fail
}
//in a different package
func create() pkg.U {
return pkg.U{D: 7}
}
func process(u pkg.U) {
switch u := u.[type] {
case A:
handleA(u) //undefined here, just doing something with unboxed value
case B:
handleB(u)
case C:
handleC(u)
case D:
handleD(u)
case E:
handleE(u)
case F:
switch u := u.[type] {
case Local:
log.Fatal(u)
case Remote:
log.Printf("remote error %s", u)
retry()
}
}
}
рд╡рд░реНрддрдорд╛рди рдЧреЛ рдореЗрдВ рдЕрдиреВрджрд┐рдд:
(рд▓рд┐рдкреНрдпрдВрддрд░рдг рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреЛрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)
const ( //simulates tags, namespaced so other packages can see them without overlap
Fail_Local = iota
Fail_Remote
)
//since there are only two tags with a single type this can
//be represented precisely and safely
//the error method on the full version of fail can be
//put more succinctly with type embedding in this case
type fail struct { //zero value (Fail_Local, nil) :)
remote bool
error
}
// e, ok := f.[Local]
func (f *fail) TagAssertLocal2() (error, bool) { //same for TagAssertRemote2
if !f.remote {
return nil, false
}
return f.error, true
}
// e := f.[Local]
func (f *fail) TagAssertLocal() error { //same for TagAssertRemote
if !f.remote {
panic("invalid tag assert")
}
return f.error
}
// f.Local = err
func (f *fail) SetLocal(err error) { //same for SetRemote
f.remote = false
f.error = err
}
// simulate tag switch
func (f *fail) TagSwitch() int {
if f.remote {
return Fail_Remote
}
return Fail_Local
}
// f.(someType) needs to be written as f.TypeAssert().(someType)
func (f *fail) TypeAssert() interface{} {
return f.error
}
const (
U_A = iota
U_B
// ...
U_F
)
type U struct { //zero value (U_A, "", 0, fail{}) :(
kind int //more than two types, need an int
s string //these would all occupy the same space
i int
f fail
}
//s, ok := u.[A]
func (u *U) TagAssertA2() (string, bool) { //similar for B, etc.
if u.kind == U_A {
return u.s, true
}
return "", false
}
//s := u.[A]
func (u *U) TagAssertA() string { //similar for B, etc.
if u.kind != U_A {
panic("invalid tag assert")
}
return u.s
}
// u.A = s
func (u *U) SetA(s string) { //similar for B, etc.
//if there were any pointers or reference types
//in the union, they'd have to be nil'd out here,
//since the space isn't shared
u.kind = U_A
u.s = s
}
// special case of u.F.Local = err
func (u *U) SetF_Local(err error) { //same for SetF_Remote
u.kind = U_F
u.f.SetLocal(err)
}
func (u *U) TagSwitch() int {
return u.kind
}
func (u *U) TypeAssert() interface{} {
switch u.kind {
case U_A, U_B, U_C:
return u.s
case U_D, U_E:
return u.i
}
return u.f
}
//in a different package
func create() pkg.U {
var u pkg.U
u.SetD(7)
return u
}
func process(u pkg.U) {
switch u.TagSwitch() {
case U_A:
handleA(u.TagAssertA())
case U_B:
handleB(u.TagAssertB())
case U_C:
handleC(u.TagAssertC())
case U_D:
handleD(u.TagAssertD())
case U_E:
handleE(u.TagAssertE())
case U_F:
switch u := u.TagAssertF(); u.TagSwitch() {
case Fail_Local:
log.Fatal(u.TagAssertLocal())
case Fail_Remote:
log.Printf("remote error %s", u.TagAssertRemote())
}
}
}
@jimmyfrasche
рдЪреВрдВрдХрд┐ рд╕рдВрдШ рдореЗрдВ рдРрд╕реЗ рдЯреИрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдирд┐рдореНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛:
func process(u pkg.U) {
switch v := u {
case A:
handleA(v) //undefined here, just doing something with unboxed value
case B:
handleB(v)
case C:
handleC(v)
case D:
handleD(v)
case E:
handleE(v)
case F:
switch w := v {
case Local:
log.Fatal(w)
case Remote:
log.Printf("remote error %s", w)
retry()
}
}
}
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЬрдм рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рдВрдШ int, рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдкрд░рд┐рдорд┐рдд 'рдорд╛рди' рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕реЗ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреВрд░реНрд╡ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ, рдФрд░ рд╕реНрд╡рд┐рдЪ рд╕реНрд╡рдпрдВ рд╕рдВрдкреВрд░реНрдг рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдорд╛рдирд╕рд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╕рд╛рде рд╣реА, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд, рдХреНрдпрд╛ рдРрд╕рд╛ рдХреЛрдб рдорд╛рдиреНрдп рд╣реЛрдЧрд╛:
type Foo union {
// Completely different types, no ambiguity
A string
B int
}
func Bar(f Foo) {
switch v := f {
....
}
}
....
func main() {
// No need for Bar(Foo{A: "hello world"})
Bar("hello world")
Bar(1)
}
@urandom рдореИрдВрдиреЗ рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рдореМрдЬреВрджрд╛ рдЧреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдкрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪреБрдирд╛ рд╣реИред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
var i someInterface = someValue //where someValue implements someInterface.
var j someInterface = i //this assignment is different from the last one.
рдпрд╣ рдареАрдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЕрдиреБрдмрдВрдз рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдиреЗ рддрдХ someValue
рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред
рдЬрдм рдЖрдк рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рдЯреИрдЧ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрднреА-рдХрднреА рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдЬрд┐рдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗрд╡рд▓ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реА рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рдпрд╣ рдЖрдкрдХреЛ рдХрднреА-рдХрднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реА рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рдХрднреА-рдХрднреА рдПрдХ рдХрджрдо рдЫреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдореЗрдВ рдХреЛрдИ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдПрдХ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рднреА рд╕рднреА рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрдиреЗ Foo/Bar рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрджрд┐ C int
рдХреЛ Foo
C int
рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ Bar(1)
рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди Bar("hello world")
ред рдпрд╣ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдордЭрдирд╛ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рд╡реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рд╡реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ-рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдкрд░ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдЖрд╕рд╛рди рдлрд╝реНрд▓реЛрдЪрд╛рд░реНрдЯ рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рд▓реЗрдВ!
рдХрд╛рд╢ рдореЗрд░реЗ рдкрд╛рд╕ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рдирд╛рдо рд╣реЛрддрд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЯреИрдЧ рд╣реИрдВред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд▓реЗрдмрд▓ рдХрд╣рд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЧреЛ рдХреЗ рдкрд╛рд╕ рднреА рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдлрд╝реАрд▓реНрдб рдХрд╣рдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рдмрд╛рдЗрдХ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рддрд╛рдЬрд╛ рдХреЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдорд╛рдпрдиреЗ рдореЗрдВ, рдЯреИрдЧ рдХреА рдЧрдИ рдпреВрдирд┐рдпрдиреЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИрдВред рд╡реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛, рдЖрдкрдХрд╛ рдлреВ/рдмрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдпрд╣ рдХрд╣рдиреЗ рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛:
type Foo struct {
A string
B int
}
func Bar(f Foo) {...}
func main() {
Bar("hello world") //same as Bar(Foo{A: "hello world", B: 0})
Bar(1) //same as Bar(Foo{A: "", B: 1})
}
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ Bar(Foo{1})
рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рдЬрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП &Foo{"hello world"}
рд▓рд┐рдП рд╕рдордЧреНрд░ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпреВрдирд┐рдпрдиреЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╕рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЯреИрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ "рдлрд╝реАрд▓реНрдб" рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реЗрдЯ рд╣реИред
switch v := u.[type] {...
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП switch v := i.(type) {...
рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЕрднреА рднреА рд╕рдВрдШ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдФрд░ рджрд╛рд╡реЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реНрдкреЙрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣ u.[union]
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрддрдирд╛ рднрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред
рдЖрдк рдПрдХ рд╣реА рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ .(type)
рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕реЗ рд╕рд╣реА рдард╣рд░рд╛рддрд╛ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВред
рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдкреАрдЫреЗ рдореЗрд░рд╛ рдпрд╣реА рддрд░реНрдХ рдерд╛ред
@jimmyfrasche
рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдмрд╛рдж рднреА рд╕реНрд╡рд┐рдЪ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде, switch v := i.(type) {...
рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреАрдмрджреНрдз рд╣реИ, рдФрд░ .(type)
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рдВрдШ рдХреЗ рд╕рд╛рде, рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдиред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓рд╛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдореВрд▓реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдЗрдВрдЯ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд╣рд╛рдВ рдорд╛рдорд▓реЗ рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг switch v := u {...
ред рдЙрд╕ рд╕реЗ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдШ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ switch v := u { ...
, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдорд▓реЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрдирдЯреНрд╕ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реИрдВред
@urandom рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдмрд┐рдирд╛ рд▓реЗрдмрд▓ рдХреЗ рдПрдХ рд╣реЛрд▓реНрдбрдУрд╡рд░ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрдм рдкреНрд░рдХрд╛рд░ рдерд╛ред рдореИрдВрдиреЗ рдмрд┐рдирд╛ рд╕реЛрдЪреЗ-рд╕рдордЭреЗ рдЖрдВрдЦ рдореВрдВрджрдХрд░ рдЗрд╕реЗ рдХреЙрдкреА рдХрд░ рд▓рд┐рдпрд╛ред рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
switch u {...
рдХрд╛рдо рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди switch v := u {...
рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ switch v := f(); v {...
рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рдЬреЛ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ - рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐ рдЬрд┐рд╕рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛)ред
рдпрджрд┐ union
рдХреАрд╡рд░реНрдб рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ pick
рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ switch u.[pick] {...
рдпрд╛ switch v := u.[pick] {...
рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдорд░реВрдкрддрд╛ рд░рдЦрддрд╛ рд╣реИ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рднреНрд░рдо рдЦреЛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ int рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддрдм рднреА рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреИрдЧ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдореЗрдВ рдЪрдпрди рдХрд╛ рдирд┐рд╣рд┐рдд рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЯреИрдЧ рдлрд╝реАрд▓реНрдб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдлрд╝реАрд▓реНрдб рдореБрдЦрд░ рд╣реЛрдирд╛ рдФрд░ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рд┐рдЪ рд╣реЛрдирд╛ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЬреАрдм рдЪреБрдирдиреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
[рджреЗрд░реА рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ - рдореИрдВ рдЫреБрдЯреНрдЯреА рдкрд░ рдерд╛]
@ianlancetaylor рдиреЗ рд▓рд┐рдЦрд╛:
рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдореБрдЭреЗ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдиреБрдХрд╕рд╛рди рд╣реИ: рдпрд╣ рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЧреЛ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрддрд╛ рд╣реИред рдХреНрд╖рддрд┐рдкреВрд░реНрддрд┐ рд▓рд╛рдн рдХреНрдпрд╛ рд╣реИ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ?
рджреЛ рдореБрдЦреНрдп рдлрд╛рдпрджреЗ рд╣реИрдВ рдЬреЛ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдкрд╣рд▓рд╛ рднрд╛рд╖рд╛ рд▓рд╛рдн рд╣реИ; рджреВрд╕рд░рд╛ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рд╣реИред
рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдПрдХ рд╕рдорд╡рд░реНрддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рдЬрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рд╕рдВрдмрджреНрдз рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрдкрди-рдПрдВрдбреЗрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдХреНрд╕рд░ рд▓реЛрдЧ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдиреА рд▓рд╛рдЧрддреЛрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред
рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬреНрдЮрд╛рдд рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА рдкреЙрдЗрдВрдЯрд░реНрд╕ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЙрдирдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрдкрди-рдПрдВрдбреЗрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЬреАрд╕реА рджрдмрд╛рд╡ рд╕реЗ рд░рд╛рд╣рдд рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдХреИрд╢ рдЗрд▓рд╛рдХреЗ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рджрд░реНрдж рдЬреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдЧреЛрдбреЛрдХред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ast.Spec
рд▓реЗрдВ: https://golang.org/pkg/go/ast/#Spec
рдХрдИ рдкреИрдХреЗрдЬ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдирд╛рдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдпрд╛ рдирд╛рдо рдкреНрд░рддреНрдпрдп рдпрд╛ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗред
рдпрджрд┐ рднрд╛рд╖рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬрд╛рдирддреА рд╣реИ, рддреЛ рдЗрд╕реЗ godoc
рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ iotas рдХреЗ рд╕рд╛рде рдПрдирдо рдкреНрд░рдХрд╛рд░ред рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд▓реЗрдирдЯреЗрдХреНрд╕реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рднреА рдЬреБрдбрд╝ рд╕рдХрддреЗ рдереЗред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг: https://github.com/mvdan/sh/commit/ebbfda50dfe167bee741460a4491ffec1006bdef
@mvdan рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ Go1 рдореЗрдВ рдХрд╣рд╛рдиреА рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдмрд┐рдВрджреБ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдХреНрдпрд╛ рдЖрдк рдХреЗрд╡рд▓ godoc рдкреГрд╖реНрда рдХреЗ рднреАрддрд░ рдЕрдиреНрдп рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред
рдореЗрд░рд╛ рдорддрд▓рдм рдЧреЙрдбреЛрдХ рдореЗрдВ рдореМрдЬреВрджрд╛ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдерд╛ред
(рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдирд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдордп рдЗрд╕рдХрд╛ рд╢рд┐рдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ)ред
рдореИрдВ рдЗрд╕ (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд▓рдВрдмреЗ) рдзрд╛рдЧреЗ рдХреЛ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╣реИ - рдКрдкрд░ рджреЗрдЦреЗрдВред
@Merovius рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ https://github.com/golang/go/issues/19814#issuecomment -298833986 рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдПрд╕рдЯреА рд╕рд╛рдорд╛рди рдПрдирдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЧреЛ рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдореБрдЭреЗ рдЕрднреА рддрдХ рдЦреБрдж рдХреЛ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдлрд┐рдЯ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛрдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВред
рджреВрд╕рд░рд╛, рдЖрдкрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреНрд░рдорд┐рдХ рдХреЛрдб рдорд░рдореНрдордд рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╢рдмреНрдж рдЬреЛрдбрд╝рдирд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред
рдЖрдЗрдП рдиреЛрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрдПрд╕рдЯреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдиреЛрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдПрдПрд╕рдЯреА рдХреЛ рдмрд╛рд╣рд░реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдПрдПрд╕рдЯреА рдЪрд▓рддрд╛ рд╣реИред
рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ:
рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЖрдзрд╛рд░рд┐рдд рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ 2.1.1 рдорд╛рдорд▓рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрд┐рддрдирд╛ рдХреБрдЫ рднреА рд╕рдВрдпреЛрдЧ рд╣реИред рдХреНрд░рдорд┐рдХ рдХреЛрдб рд╕реБрдзрд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдПрд╕рдЯреА рдХреЛ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреЗрдиреА рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдПрдХ рд╕рдВрдкреВрд░реНрдгрддрд╛ рд▓рд┐рдВрдЯрд░ рдорджрдж рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд▓рд┐рдВрдЯрд░ рд╕рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдмрддрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╛ рддреЛ рдЖрдкрдХреЗ рд░реЗрдкреЛ рдореЗрдВ рд╕реНрд░реЛрдд рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ рд╕реНрд░реЛрдд рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдПрд╕рдЯреА рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рджрдпрд╛ рдкрд░ рд╣реИрдВ рдЬреЛ рд╕рдВрдкреВрд░реНрдгрддрд╛ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЯреИрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдПрдХ рдПрдХрд▓ рдердХрд╛рд╡рдЯ рд▓рд┐рдВрдЯрд░ рд╣реЛ рдЬрд┐рд╕ рдкрд░ рдкреВрд░рд╛ рд╕рдореБрджрд╛рдп рд╕рд╣рдордд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдпреЛрдЧ-рдЖрдзрд╛рд░рд┐рдд рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рдЕрднреА рднреА рд╡рд░реНрдЬрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдгрддрд╛ рд▓рд┐рдВрдЯрд░ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рди рддреЛ 2.2 рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдПрдХ рд╕рд░рд▓, рдПрдПрд╕рдЯреА-рдЖрд╕рдиреНрди, рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ: рдЯреЛрдХрдиред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдПрдХ рд╕рд░рд▓ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдХреНрд╕рд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред *
рдЬреИрд╕реЗ рдЯреЛрдХрди рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рдЬреБрдбрд╝рд╛ рд╣реИ рдФрд░ Var
рдЬреИрд╕реЗ рдЯреЛрдХрди рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдирд╛рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдФрд░ рдЯреЛрдХрди рдЬреИрд╕реЗ Val
рдЬреЛ рдПрдХ рдлреНрд▓реЛрдЯ64 рдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ .
рдЖрдк рдЗрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдердХрд╛рдК рд╣реЛрдЧрд╛ред рдЖрдк рд╢рд╛рдпрдж рдРрд╕рд╛ рдХреБрдЫ рдХрд░реЗрдВрдЧреЗ, рдпрджреНрдпрдкрд┐:
package token
type Type int
const (
Times Type = iota
// ...
Var
Val
)
type Value struct {
Type
Name string // only valid if Type == Var
Number float64 // only valid if Type == Val
}
рдЖрдИрдУрдЯрд╛-рдЖрдзрд╛рд░рд┐рдд рдПрдирдо рдкрд░ рдПрдХ рдердХрд╛рд╡рдЯ рд▓рд┐рдВрдЯрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрд╡реИрдз рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рдХреЛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрдм рдЯрд╛рдЗрдк == рдЯрд╛рдЗрдореНрд╕ рдпрд╛ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЯрд╛рдЗрдк == рд╡рд╛рд░ред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдЯреЛрдХрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдмрдврд╝рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдмрджрддрд░ рд╣реЛрддрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдк рдпрд╣рд╛рдВ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдирд╛, Valid() error
, рдЬреЛ рд╕рднреА рдмрд╛рдзрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╕рдордЭрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрди рд╕рднреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реЛрдЧреАред рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреЛрдХрди рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдПрд╕рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рд╛ рд╡рд╣ рдЕрднреА рднреА рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдЯреВрд▓реАрдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
@jimmyfrasche
рджреВрд╕рд░рд╛, рдЖрдкрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреНрд░рдорд┐рдХ рдХреЛрдб рдорд░рдореНрдордд рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╢рдмреНрдж рдЬреЛрдбрд╝рдирд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ред
рдирд╣реАрдВ, рдпрд╣ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЙрди рджреЛрдиреЛрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рдорд░рдореНрдордд рдореЙрдбрд▓ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП: 1. рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ, 2. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рд╕рдВрд░рдЪрдирд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП: 1. рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧ рдирд┐рдХрд╛рд▓реЗрдВ, 2. рдлрд╝реАрд▓реНрдб рдирд┐рдХрд╛рд▓реЗрдВ)ред рд╕рдо рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреЗрд╕ рдЬреЛрдбрд╝рдирд╛ рдХреНрд░рдорд┐рдХ рдорд░рдореНрдордд рдореЙрдбрд▓ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░
рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬрд┐рд╕реЗ рдиреНрдпреВрдирддрдо рд░реБрдХрд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред
рдмрд┐рд▓реНрдХреБрд▓ред рд╕рдо рдкреНрд░рдХрд╛рд░, рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рд╣рд░ рдХрд╛рд░рдг рд╕реЗ рд▓реЛрдЧ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрд░рдорд┐рдХ рдХреЛрдб рдорд░рдореНрдордд рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реИрдВред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЖрдзрд╛рд░рд┐рдд рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ 2.1.1 рдорд╛рдорд▓рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдирд╣реАрдВ, рдпрд╣ 1.2 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЕрдкрд░рд┐рдЪрд┐рдд рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИред рдореИрдВ рд╢рд╛рдпрдж рдШрдмрд░рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реВрдВ) рдФрд░ 2.1 рдХреЗ рдкреВрд░реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреАред рдмрд╛рдХреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рдЙрдиреНрдирдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдореБрджреНрджрд╛ рд╣реИ; рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЛрдИ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ lib рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рддрдм рддрдХ рдЧрд▓рдд рд╣реИ рдЬрдм рддрдХ рд╡рд╣ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред
рдПрдПрд╕рдЯреА рдХреЛ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреЗрдиреА рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯрдХреНрдХрд░ рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рд╕реЗ рдпрд╣ рдХреИрд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, "рдпрд╣ рдирдпрд╛ рд╡реНрдпрд╛рдХрд░рдг рдЕрднреА рддрдХ рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ" рдареАрдХ рд╣реИред рдЬреИрд╕реЗ "рдпрджрд┐ рдЖрдк рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЛ рдЗрд╕ рдирдП рд╡реНрдпрд╛рдХрд░рдг рдкрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛" рдареАрдХ рд╣реИред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд░рдорд┐рдХ рдорд░рдореНрдордд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдФрд░ рдХрджрдо рдЬреЛрдбрд╝рддрд╛ рд╣реИ: рдП) рдПрдПрд╕рдЯреА рдкреИрдХреЗрдЬ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдирдпрд╛ рдиреЛрдб рдЬреЛрдбрд╝реЗрдВред b) рдирдП рдиреЛрдб рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП AST рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдВред рдЧ) рдирдП рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рд╣рд╛рдБ, рдирдпрд╛ рдиреЛрдб рдХреЗрд╡рд▓ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛, a) рдФрд░ b) рдХреЗ рдмрд╛рдж; рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╣рд░ рдЪрд░рдг рдореЗрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реБрдХрд╛рд╡рдЯ рдХреЗ, рд╕рдм рдХреБрдЫ рдЕрднреА рднреА рд╕рдВрдХрд▓рд┐рдд рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдзреАрд░реЗ-рдзреАрд░реЗ рдХреЛрдб рдХреА рдорд░рдореНрдордд рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдХреЛрдИ рд╕рдВрдкреВрд░реНрдг рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдпреЛрдЬрдирд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЖрдк рд╢рд╛рдпрдж рдЕрднреА рднреА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд░рд┐рд╡рд░реНрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рддреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рдЕрднреА рднреА рдРрд╕реЗ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛)ред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо a) рдПрдХ рдХреНрд░рдорд┐рдХ рдЕрдкрдЧреНрд░реЗрдб рдкрде рд╣реИ рдФрд░ b) рдпрд╣ рдирд┐рд░реНрдгрдп рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рдЯреВрд▓ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рддреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЯреВрд▓ рдХреЗ рд▓реЗрдЦрдХ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рд╡реЗ рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЬреНрдЮрд╛рдд рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред
рдПрдХ рд╕рдВрдкреВрд░реНрдгрддрд╛ рд▓рд┐рдВрдЯрд░ рдорджрдж рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд▓рд┐рдВрдЯрд░ рд╕рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдмрддрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рдХреНрдпреЛрдВ? рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рд╕реНрд╡рд┐рдЪрд▓рд┐рдВрдЯ тДв рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рдХреЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░-рд╕реНрд╡рд┐рдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдирд╛ рдареАрдХ рд╣реИ; рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдк рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╡реИрд╕реЗ рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рд╛рдВ, рдЗрд╕ рдирд┐рдпрдо рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рд╢рд╛рдпрдж рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдореЗрдВ "рд╣рд░ рдкреНрд░рдХрд╛рд░-рд╕реНрд╡рд┐рдЪ рдХреЛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рд╡рд╣ рдЦрд╛рд▓реА рд╣реЛ" рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рдкрд░ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдФрд░ рдордЬрдмреВрд░ рджреЛрдиреЛрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЕрдЬреНрдЮрд╛рдд рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдкрд░ рдЙрдирдХреЗ рдХреЛрдб рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдк рдЗрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдердХрд╛рдК рд╣реЛрдЧрд╛ред
рд╕рд┐рдХреЛрдбрд╝рдирд╛ рдпрд╣ рдПрдХ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдХрдо рд╣реА рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред рдореБрдЭреЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред
рдФрд░ рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдкреВрд░реНрдг рдЬрд╛рдВрдЪ рдзрд╛рд░рдгрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред "рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░" рдХрд╣рдиреЗ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдХреЛрдИ рдордЬрдмреВрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИред
@Merovius рдореБрдЭреЗ рдХреНрд░рдорд┐рдХ рдХреЛрдб рдорд░рдореНрдордд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдФрд░ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдмреАрдЪ рдореЗрдВ:
рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдкреВрд░реНрдг рдЬрд╛рдБрдЪ рдзрд╛рд░рдгрд╛ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдмрд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдкреВрд░реНрдгрддрд╛ рдЬрд╛рдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдареАрдХ рд╣реИ, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрд╕реЗ "рдХреБрдЫ рдФрд░, рдЬреЛ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдорд▓реЗ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╕рдВрдкреВрд░реНрдг рдмрдирд╛рддрд╛ рд╣реИ)ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рд╕реНрд╡рд┐рдЪрд▓рд┐рдВрдЯ тДв рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ-рдХреЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░-рд╕реНрд╡рд┐рдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдирд╛ рдареАрдХ рд╣реИ; рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдк рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╡реИрд╕реЗ рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рд╛рдВ, рдЗрд╕ рдирд┐рдпрдо рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рдПрдирдо, рдпрд╣ рдЖрдкрдХреЛ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЬреНрдЮрд╛рдд рдорд╛рдорд▓реЗ рд╕реЗ рдЪреВрдХ рдЧрдП рд╣реИрдВ, рдмрд╕ рдЖрдкрдиреЗ рдЕрдЬреНрдЮрд╛рдд рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рдмрд╛рд╡рдЬреВрдж рдЗрд╕рдХреЗ рд╢реЛрд░-рд╢рд░рд╛рдмрд╛ рдирдЬрд░ рдЖ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:
switch {
case n < 0:
case n == 0:
case n > 0:
}
рдпрд╣ рд╕рдВрдкреВрд░реНрдг рд╣реИ рдпрджрд┐ n рдЕрднрд┐рдиреНрди рд╣реИ (рдлреНрд▓реЛрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ n != n
рдЧреБрдо рд╣реИ) рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдПрдиреНрдХреЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рд┐рдП:
switch {
case p[0](a, b):
case p[1](a, b):
//...
case p[N](a, b):
}
рднрд▓реЗ рд╣реА p[i]
a
рдФрд░ b
рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рд╕рдордХрдХреНрд╖ рд╕рдВрдмрдВрдз рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрд╡рд┐рдЪ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдорд╛рдорд▓рд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЗрд╕реЗ рдПрдХ рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореМрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛, рд╕реНрд░реЛрдд рдореЗрдВ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди, рд╢реНрд╡реЗрддрд╕реВрдЪреА рдореЗрдВ egrep -v
рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдпрд╛ рд╕реНрд╡рд┐рдЪ рдкрд░ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬрд┐рд╕рдХрд╛ рдЭреВрдард╛ рдЕрд░реНрде рд╣реИ рдХрд┐ p[i]
рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред
рдХрд┐рд╕реА рднреА рджрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ рд▓рд┐рдЯрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ "рд╣рдореЗрд╢рд╛ рд╕рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдВ" рдорд╛рд░реНрдЧ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЧреЛ-рдХреЙрд░реНрдкрд╕ рдкрд░ рдЪрд▓рд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдХрд┐рддрдирд╛ рд╢реЛрд░ рдФрд░/рдпрд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреЛрдХрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
//Type defined as before
type SimpleToken { Type }
type StringToken { Type; Value string }
type NumberToken { Type; Value float64 }
type Interface interface {
//some method common to all these types, maybe just token() Interface
}
рдпрд╣ рдПрдХ рдЕрд╡реИрдз рдЯреЛрдХрди рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рджрд┐рд▓рд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдорд╛рди рджреЛрдиреЛрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ StringToken
рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬреЛ SimpleToken
рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд┐рдкрд░реАрддред
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рддрд┐ рдЯреЛрдХрди рдПрдХ рдкреНрд░рдХрд╛рд░ ( type Plus struct{}
, type Mul struct{}
, рдЖрджрд┐) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рдмрд╣реБрдд рдХрд╛рдо рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ)ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯреЛрдХрди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдЯреЛрдХрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ "рдкрджрд╛рдиреБрдХреНрд░рдо" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЛрдХрди рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЖрджрд┐)
type SimpleToken int //implements token.Interface
const (
Plus SimpleToken = iota
// ...
}
type NumericToken interface {
Interface
Value() float64
nt() NumericToken
}
type IntToken struct { //implements NumericToken, and a FloatToken
type StringToken interface { // for Var and Func and Const, etc.
Interface
Value() string
st() StringToken
}
рднрд▓реЗ рд╣реА, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ рдЕрдкрдиреЗ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдбрд┐рдлрд░реЗрдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдпрд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рддреЛ рдЙрдкрдпреБрдХреНрдд рд▓рд┐рдВрдЯрд░ рдФрд░ рдЧреЛрдбреЛрдХ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рдЬреАрдд рдЕрд╡реИрдз рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдЖрд╡рдВрдЯрди рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдорд╛рддреНрд░рд╛ (рдХреАрдмреЛрд░реНрдб рдЕрд░реНрде рдореЗрдВ) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬреЛ рдорд╣рддреНрд╡рд╣реАрди рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИред
рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдкреВрд░реНрдгрддрд╛ рдЬрд╛рдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдареАрдХ рд╣реИ, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрд╕реЗ "рдХреБрдЫ рдФрд░, рдЬреЛ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдорд▓реЗ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╕рдВрдкреВрд░реНрдг рдмрдирд╛рддрд╛ рд╣реИ)ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рддреЛ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рд╣рдо рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рд╕рдВрдкреВрд░реНрдг рдЬрд╛рдБрдЪ рдореЗрдВ рдпрд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ :)
рдпрд╣ рдЖрдкрдХреЛ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рдХрд┐ рдЖрдк рдПрдХ рдЬреНрдЮрд╛рдд рдорд╛рдорд▓реЗ рд╕реЗ рдЪреВрдХ рдЧрдП, рдмрд╕ рдЖрдкрдиреЗ рдЕрдЬреНрдЮрд╛рдд рдорд╛рдорд▓реЗ рдХреЛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рд╛ред
рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐, рд╕рдВрдХрд▓рдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдВрдкреВрд░реНрдг-рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдореБрдЭреЗ рдХреМрди рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
рд▓реЗрдХрд┐рди, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдкрд╣рд▓реЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред
рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдП) рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рд╕реА рднреА рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдФрд░ рдмреА) рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред
рдореИрдВ 100% рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдПрдХ рдЙрдкрдХрд░рдг рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддреЗ рд╣реБрдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдк 90% рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЙрдкрдХрд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИ рдХрдВрдкрд╛рдЗрд▓рд░, рд╕рд╣реА рдПрдиреЛрдЯреЗрд╢рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛рдиреА рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ)ред рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ, рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмрд╛рд╡рдЬреВрдж рдЗрд╕рдХреЗ рд╢реЛрд░-рд╢рд░рд╛рдмрд╛ рдирдЬрд░ рдЖ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдЪрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЖрдк рдЬрд┐рди рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЙрдкрдХрд░рдг рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рдФрд░ рд╕реНрд╡рд┐рдЪ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреЛрдХрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
рдорд╛рд░реНрдХрд░-рд╡рд┐рдзрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдЖрдкрдХреЛ рдЯрд╛рдЗрдк-рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рдореБрдлреНрдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдорд╛рд░реНрдХрд░-рд╡рд┐рдзрд┐ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ; рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╕рдВрд░рдЪрдирд╛ {} рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдЗрд╕реЗ рд╡рд╣ рдорд╛рд░реНрдХрд░ рд╡рд┐рдзрд┐ рджреЗрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ, рд╢реВрдиреНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рдФрд░ рдЖрдкрдХреА рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рддрд┐ рд╡рд┐рдХрд▓реНрдк рдХрдо рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдПред
рднрд▓реЗ рд╣реА, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ рдЕрдкрдиреЗ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╕рдореНрдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
рд╣рд╛рдВред рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдЧрдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реНрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдЪрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рд╕рдЪ рд╣реИред
рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрд╛ рдФрд░ рдЗрд╕реЗ stdlib рдкрд░ рдЪрд▓рд╛рдпрд╛ред рдХрд┐рд╕реА рднреА рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдЬрд╛рдБрдЪ рдореЗрдВ 1956 рд╣рд┐рдЯ рдереЗ, рдЗрд╕реЗ switch {
рдлреЙрд░реНрдо рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЙрд╕ рдЧрд┐рдирддреА рдХреЛ рдШрдЯрд╛рдХрд░ 1677 рдХрд░ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рд╛рд░реНрдердХ рд╣реИ рдпрд╛ рдирд╣реАрдВред
https://github.com/jimmyfrasche/switchlint
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░ рдХреА рдХрд╛рдлреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдкрд░рд┐рд╖реНрдХреГрдд рдирд╣реАрдВ рд╣реИред рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
(рдмрд╛рдХреА рдХрд╛ рдЬрд╡рд╛рдм рдореИрдВ рдмрд╛рдж рдореЗрдВ рджреВрдВрдЧрд╛)
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЧрд▓рдд рдорд╛рд░реНрдХрдЕрдк рдкреНрд░рд╛рд░реВрдк
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рдХрд╛ рдПрдХ (рдХрд╛рдлреА рдкрдХреНрд╖рдкрд╛рддрдкреВрд░реНрдг) рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ (рдФрд░ рдореЗрд░рд╛ рджреВрд╕рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ narcissistically рдорд╛рдирддреЗ рд╣реБрдП)
рдкреЗрд╢реЗрд╡рд░реЛрдВ
рджреЛрд╖
1 + 1 + тЛп + 1
рд╡реИрдХрд▓реНрдкрд┐рдХ
1 + 1 + тЛп + 1
. рдлреЙрд░реНрдо рдХреЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП iota "enum"рдзреНрдпрд╛рди рджрд┐рдП рдмрдЧреИрд░
рдзреАрд░реЗ-рдзреАрд░реЗ рдорд░рдореНрдордд рдХреЗ рд▓рд┐рдП, рдФрд░ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдердХрд╛рд╡рдЯ рдЬрд╛рдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ "рдЕрдирд╛рд╡рд╢реНрдпрдХ" рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓рд╛ рдХреЗрд╡рд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░реВрдлрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ, рднрд▓реЗ рд╣реА рдЖрдк рдЕрдиреНрдпрдерд╛ рд╕рдм рдХреБрдЫ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реЛрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЪ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВрдЯреЗрдирд░ рд╕реЗ рдПрдХ рдШреЛрд╖рдгрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ "рдЕрд░реЗ рд╣рдо рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рджрд╕реНрдп рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ" рдФрд░ рдлрд┐рд░ рдПрдХ рд╕реНрд╡рд┐рдЪрд▓рд┐рдВрдЯ рдЯреВрд▓ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдХреЛ рдвреВрдВрдв рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдСрдкреНрдЯ рдЖрдЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреА рддрд░рд╣ рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред
рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╕рдордп рдЬреЛ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕реА рднреА рдЬреНрдЮрд╛рдд рдорд╛рдорд▓реЗ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЕрд╕рдореНрдмрджреНрдз рдХрд░реЗрдВред рдпрд╛ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ "рдЕрдирд╛рд╡рд╢реНрдпрдХ" рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдЬреНрдЮрд╛рдд рд╣реИ рдФрд░ рдЕрдЬреНрдЮрд╛рдд рдХреЗ рдЦрд┐рд▓рд╛рдл рднрд╡рд┐рд╖реНрдп-рдкреНрд░рдорд╛рдгрд┐рдд рд╣реИрдВред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд▓рд┐рдВрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдкреВрд░реНрдгрддрд╛ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯ-рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡реЗ рдХрд┐рд╕реА рднреА рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реЛрдВред
@Merovius рдЖрдкрдХреА betterSumType() BetterSumType
рдЪрд╛рд▓ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ
func CallBeforeSwitches(b BetterSumType) (BetterSumType, bool) {
if b == nil {
return nil, false
}
b = b.betterSumType()
if b == nil {
return nil, false
}
return b, true
}
рдФрд░ рд▓рд┐рдВрдЯ рднреА рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирджрдВрдб рдХреНрдпрд╛ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╕рднреА рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реИрдВ?
рдпрд╣ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рддрдм рдХреБрдЫ рднреА рдЦреЗрд▓ рд╣реЛрддрд╛ рд╣реИред рддреЛ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреЛрдИ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдердХрд╛рд╡рдЯ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рд┐рдЪ рдХреЗ рдХреЙрд▓рдЧреНрд░рд╛рдл рдХреЗ рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧреАред рдкреИрдХреЗрдЬ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛, рдЙрд╕рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЙрд╕ рдорд╛рди рдХреЛ рдкреИрдХреЗрдЬ рдХреЗ рдХрд┐рд╕реА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреЗрдЬрдирд╛ рд╕рдВрднрд╡ рд╣реИ; рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рд╕реНрд╡рд┐рдЪ рдПрдХ рдЖрдпрд╛рдд рдЪрдХреНрд░ рдмрдирд╛рдП рдмрд┐рдирд╛ рд╕рдВрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рдкрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (рдпрд╣ рдкрд┐рдЫрд▓реЗ рдорд╛рдирджрдВрдб рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ)ред
рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдХреЗ рдЖрдпрд╛рддрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрднреА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдореНрдмреЗрдб рди рдХрд░реЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлреИрдВрд╕реА рд▓рд┐рдВрдЯрд░ рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдареАрдХ рд╣реИ рдпрджрд┐ рд╣рдо рдХрднреА рднреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рдорд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рднреА рдПрдореНрдмреЗрдбреЗрдб рдЗрдВрдЯрд░рдлреЗрд╕ рдХрднреА рднреА рдкреИрдХреЗрдЬ рдХреА рдПрдкреАрдЖрдИ рд╕реАрдорд╛ рд╕реЗ "рдмрдЪ" рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╛ рддреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдХрднреА рднреА рдкрд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдпрд╛ рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╕реНрд╡рд┐рдЪ case nil
рднреА рдЬрд╛рдВрдЪрддрд╛ рд╣реИред (рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЖрд╕рд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдкреВрд░реНрд╡ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╢реВрдиреНрдп рд╕рд╣рд┐рдд "рдЯрд╛рдЗрдк рдП рдпрд╛ рдЯрд╛рдЗрдк рдмреА рдпрд╛ рдЯрд╛рдЗрдк рд╕реА" рдпреЛрдЧ рдХреЛ "рд╢реВрдиреНрдп рдпрд╛ рдЯрд╛рдЗрдк рдП рдпрд╛ рдЯрд╛рдЗрдк рдмреА рдпрд╛ рдЯрд╛рдЗрдк рд╕реА" рдпреЛрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ)ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓рд┐рдВрдЯрд░ рд╣реИ, рдЙрди рд╕рднреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рднреА, рдЬреЛ рдЖрдпрд╛рдд рдХреЗ рдХрд┐рд╕реА рднреА рдкреЗрдбрд╝ рдФрд░ рдЙрд╕ рдкреЗрдбрд╝ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЗрди рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдбреА рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдбреА рдХреЗ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд╣реИред рдмрддрд╛ рджреЗрдВ рдХрд┐ рдХрд░рддрд╛ рд╣реИред
рдЕрдм, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ DтА▓ рдореЗрдВ рдПрдХ рдирдИ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ DтА▓ рдЙрд╕ рдкреИрдХреЗрдЬ рдХреЛ D рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рд╢реНрди рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓рд┐рдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрди рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ D рдиреЗ рд╕рдВрдпреЛрдЧ рд╕реЗ рд▓рд┐рдВрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рдореЗрдВрдЯреЗрдирд░ рдЗрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИред D рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ DтА▓ рдХреЗ рд╕рдорд╛рди рд╣реА рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рд▓рд┐рдВрдЯрд░ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ "рдЕрднреА рдпрд╣ 100% рд╕рдВрдкреВрд░реНрдг рд╣реИ" рдЬреЛ рд╣рдорд╛рд░реЗ рдмрд┐рдирд╛ рдХреБрдЫ рднреА рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
"Iota enums" рдХреЗ рд▓рд┐рдП рдПрдХ рдердХрд╛рд╡рдЯ рдЪреЗрдХрд░ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред
рд╕рднреА type t u
рдЬрд╣рд╛рдВ u
рдЕрднрд┐рдиреНрди рд╣реИ рдФрд░ t
рдХрд╛ рдЙрдкрдпреЛрдЧ const
рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рддреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ iota
рдЬреИрд╕реЗ рдХрд┐ рд╢реВрдиреНрдп рдЗрди рд╕реНрдерд┐рд░рд╛рдВрдХреЛрдВ рдореЗрдВ u
рдХрд╛ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:
1 << iota
рдХреЛ рдПрдХ рдкрд╛рд╡рд░рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд░реНрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдкреВрд░рдХред рдлрд┐рд▓рд╣рд╛рд▓, рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛рдХреБрдЫ рдЖрд╢реБрд▓рд┐рдкрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП min(t)
рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП, C
, min(t) <= C
, рдФрд░, рдЗрд╕реА рддрд░рд╣, рдЖрдЗрдП max(t)
рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП, C
, C <= max(t)
ред
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ t
рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
t
рдорд╛рди рд╣рдореЗрд╢рд╛ рдирд╛рдорд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╛ рдХреБрдЫ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ 0, рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЖрдордВрддреНрд░рдг)min(t) <= v <= max(t)
рдмрд╛рд╣рд░ t
, v
рдорд╛рди рдХреА рдХреЛрдИ рдЕрд╕рдорд╛рдирддрд╛ рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИt
рдорд╛рди рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдореЗрдВ рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ +
, /
, рдЖрджрд┐ред рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рддрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдкрд░рд┐рдгрд╛рдо min(t)
рдФрд░ max(t)
рдмреАрдЪ рдХреНрд▓реИрдВрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред t
редt
рдпрд╛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗрд╕ рдХреЗ рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВредрдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЖрдпрд╛рдд рдЯреНрд░реА рдореЗрдВ рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдХреЛрдб рдореЗрдВ рдЗрд╕рдХреЗ рдЕрдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реИред
рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣, рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рдорд╛рди, рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рддреЛ рдЗрд╕реЗ рдЧреЛ 2 рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рд░рдЦреЗрдВ?
рдЙрдкрдирд╛рдо рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдПрдХ рдирдпрд╛ рдХреАрд╡рд░реНрдб рдкреЗрд╢ рди рдХрд░реЗрдВ, рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдорд╛рдореВрд▓реА рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рднреА рд░реЛрдХ рд▓рдЧрддреА рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдпреЛрдЧ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рд░реНрд╢рд▓/рдЕрдирдорд╛рд░реНрд╢рд▓ рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рднреА рдПрдХ рдмрдбрд╝реА рдкрд░реАрдХреНрд╖рд╛ рд╣реЛрдЧреАред
рдЯрд╛рдЗрдк рдПрд▓рд┐рдпрд╛рд╕ рдПрдХ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдерд╛ред рд╕рдо рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╢реЛ рд╕реНрдЯреЙрдкрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИред
@rogpeppe рдХреЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ (рдорд╛рдореВрд▓реА) рдмрд┐рдВрджреБред рдкреИрдХреЗрдЬ рдореЗрдВ http
, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ Handler
рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, HandlerFunc
ред рдЕрднреА, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ http.Handle
рдкрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ HandlerFunc
рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ http.Handle
рдмрдЬрд╛рдп HandlerFunc | Handler
рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ HandlerFunc
рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди/рдХреНрд▓реЛрдЬрд░ рдХреЛ рд╕реАрдзреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдШ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реЗ рдорд╛рдиреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ HandlerFunc
рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ Handler
, Handler
рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред
@griesemer рдПрдирдо рдереНрд░реЗрдб рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ, https://github.com/golang/go/issues/19814#issuecomment -322752526, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╣рд▓реЗ https://github.com/golang/ go/issues/19412#issuecomment -289588569 рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ ("рд╕реНрд╡рд┐рдлреНрдЯ рд╕реНрдЯрд╛рдЗрд▓ рдПрдирдо") рдХреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд┐рддрдирд╛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВ рдЕрдЧрд░ рд╡реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рд╡реЗ рджреЗрдЦреЛ рд╣реЛрдЧрд╛ / рдЗрд╕ рддрд░рд╣ рдПрдХ рдмрд╣реБрдд рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рд▓рдЧрддрд╛ рд╣реИред
рд╡рд╣ рдкреЛрд╕реНрдЯ рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕ рдкреВрд░реЗ рд╕реВрддреНрд░ рдореЗрдВ, рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдпрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рд┐рдореНрдпреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдореНрдмреЗрдб рдХрд░рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд░рдХрд┐рдирд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдмрдЪрд╛рд╡ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрдпрд╛ рд╣реВрдВ: https://play.golang.org/p/FqdKfFojp-
@jimmyfrasche рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ред
рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ: https://play.golang.org/p/p2tFm984S8
@rogpeppe рдЕрдЧрд░ рдЖрдк рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ?
рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдФрд░ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рджреВрд╕рд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рдердХрд╛рд╡рдЯ рдЬрд╛рдБрдЪ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд╣рд░реА рдердХрд╛рд╡рдЯ рдЪреЗрдХрд░ рдЫреЛрдЯрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдкрд┐рдХ рд╡реИрд▓реНрдпреВ рдХреЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡реИрд▓реНрдпреВ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╣реА рдЬрд╛рджреБрдИ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдХреЛрдб рдЬрдирд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рднреА рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд 2: рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдХрд┐ рдЬрдм рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдлрд╝реАрд▓реНрдб рдирд╛рдо рджрд╛рд╡реЗ рдФрд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рд╕рдВрдкрд╛рджрд┐рдд 3: рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд┐рд╣рд┐рдд рдлрд╝реАрд▓реНрдб рдирд╛рдо
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 4: рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ
рдПрдХ рдкрд┐рдХ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдордЧреНрд░ рдкреНрд░рдХрд╛рд░ рд╣реИ:
pick {
A, B S
C, D T
E U "a pick tag"
}
рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ, A
, B
, C
, D
, рдФрд░ E
рдкрд┐рдХ рдФрд░ S
рдХреЗ рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╣реИрдВ T
, рдФрд░ U
рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдлрд╝реАрд▓реНрдб рдирд╛рдо рдирд┐рд░реНрдпрд╛рдд рдпрд╛ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдХреЗрдд рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкрд┐рдХ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рдиреВрдиреА
type p pick {
//...
p *p
}
рдЕрд╡реИрдз
type p pick {
//...
p p
}
рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдкрд┐рдХ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдкрд┐рдХ рдПрдореНрдмреЗрдбреЗрдб рд╣реИ, рддреЛ рдкрд┐рдХ рдкрд░ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рдкрд┐рдХ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реИред (рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИ, *T
рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЬрд╣рд╛рдВ рдирд╛рдо T
)ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
type p pick {
io.Reader
io.Writer
string
}
рддреАрди рдлрд╝реАрд▓реНрдб рд╣реИрдВ Reader
, Writer
, рдФрд░ string
рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рдеред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝реАрд▓реНрдб string
рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдмреНрд░рд╣реНрдорд╛рдВрдб рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛред
рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдлрд╝реАрд▓реНрдб рдФрд░ рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред
рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╕реНрд░реЛрдд рдХреНрд░рдо рдореЗрдВ рдЙрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдФрд░ рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рд╣реА рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдорд╛рдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, a
рдФрд░ b
, рдкрд┐рдХ рд╡реИрд▓реНрдпреВ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
a = b
рдЧреИрд░-рдкрд┐рдХ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд┐рдХ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рднреА, рдЕрд╡реИрдз рд╣реИред
рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЗрд╡рд▓ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИред
рд╕рдордЧреНрд░ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рдмрд┐рдирд╛ рдЪрд╛рдмреА рдХреЗ рдЕрдХреНрд╖рд░ рд╣рдореЗрд╢рд╛ рдЕрдорд╛рдиреНрдп рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдХреБрдВрдЬреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреНрдп рд╣реИрдВ
pick{A string; B int}{A: "string"} //value is (B, "string")
pick{A, B int}{B: 1} //value is (B, 1)
pick{A, B string}{} //value is (A, "")
рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:
pick{A int; B string}{A: 1, B: "string"} //a pick can only have one value at a time
pick{A int; B uint}{1} //pick composite literals must be keyed
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ p
рдХрд╛ рдорд╛рди pick {A int; B string}
рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
p.B = "hi"
p
рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЛ B
рдФрд░ B
рдХреЗ рдорд╛рди рдХреЛ "рд╣рд╛рдп" рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рд╡рд░реНрддрдорд╛рди рдбрд╛рдпрдирд╛рдорд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ рдбрд╛рдпрдиреЗрдорд┐рдХ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдореГрддрд┐ рд╕реНрдерд╛рди рдХреЛ рд╢реВрдиреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд┐рдХ рдлрд╝реАрд▓реНрдб рдЕрдкрдбреЗрдЯ рдХреЗ рдкрд┐рдХ рдпрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
type P pick {
A, B image.Point
}
var p P
fmt.Println(P) //{A: {0 0}}
p.A.X = 1 //A is the dynamic field, update
fmt.Println(P) //{A: {1 0}}
p.B.Y = 2 //B is not the dynamic value, create zero image.Point first
fmt.Println(P) //{B: {0 2}}
рдХрд┐рд╕реА рдкрд┐рдХ рдореЗрдВ рд░рдЦреЗ рдЧрдП рдорд╛рди рдХреЛ рдХреЗрд╡рд▓ рдлрд╝реАрд▓реНрдб рдореБрдЦрд░ рдпрд╛ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рд┐рдЪ рджреНрд╡рд╛рд░рд╛ рд╣реА рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
x := p.[X] //panics if X is not the dynamic field of p
x, ok := p.[X] //returns the zero value of X and false if X is not the dynamic field of p
switch v := p.[var] {
case A:
case B, C: // v is only defined in this case if fields B and C have identical type names
case D:
default: // always legal even if all fields are exhaustively listed above
}
рдлрд╝реАрд▓реНрдб рдЕрднрд┐рдХрдерди рдФрд░ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИрдВ, рди рдХрд┐ рдЙрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬрд┐рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реЗ pick
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдирд╛рдо рд╕реЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рди рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдорд╛рдиреНрдп рд╣реИ:
_, ok := externalPackage.ReturnsPick().[Field]
рдпрд╣ рдЕрдорд╛рдиреНрдп рд╣реИ:
_, ok := externalPackage.ReturnsPick().[externalPackage.Field]
рдлрд╝реАрд▓реНрдб рдЕрднрд┐рдХрдерди рдФрд░ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рд┐рдЪ рд╣рдореЗрд╢рд╛ рдбрд╛рдпрдирд╛рдорд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реА рдмрддрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдХрдерди рдФрд░ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рднреА рдкрд┐рдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
//removed, see note at top
//v, ok := p.(fmt.Stringer) //holds if the type of the dynamic field implements fmt.Stringer
//v, ok := p.(int) //holds if the type of the dynamic field is an int
рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рд╣рдореЗрд╢рд╛ рдЧрддрд┐рд╢реАрд▓ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рдпрджрд┐ рдкрд┐рдХ рдХреЛ рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдХрдерди рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдХреЗрд╡рд▓ рдкрд┐рдХ рдХреЗ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣реА рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред [рдЕрднреА рднреА рд╕рдЪ рд╣реИ рд▓реЗрдХрд┐рди рдмреЗрдорд╛рдиреА рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ]
рдпрджрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд┐рдХ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рддреЛ:
==
рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рди ==
!=
рднрд▓реЗ рд╣реА рдорд╛рди ==
редрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ P
рдХрд╛ рдорд╛рди рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ Q
рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХрд╛ рд╕реЗрдЯ рдФрд░ P
рдореЗрдВ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИ рдФрд░ рдЙрдирдХреЗ Q
рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВред
рдпрджрд┐ P
рдФрд░ Q
рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рддреЛ рдЙрди рдлрд╝реАрд▓реНрдб рдХреЛ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрд▓рдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг:
type P pick {A int; B string}
type Q pick {B string; A int; C float64}
//legal
var p P
q := Q(p)
//illegal
var q Q
p := P(Q) //cannot handle field C
рджреЛ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдПрдХ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдИ (рдФрд░ рд╡рд┐рдХреА рдореЗрдВ рдЬреЛрдбрд╝реА) https://gist.github.com/jimmyfrasche/ba2b709cdc390585ba8c43c989797325
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдФрд░: рджрд┐рд▓: @mewmew рдХреЛ рдЬрд┐рд╕рдиреЗ рдЙрд╕ рд╕рд╛рд░ рдкрд░ рдПрдХ рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рдЫреЛрдбрд╝реА
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ T
рд▓рд┐рдП рдХрд╣рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдЬрд┐рд╕реЗ T
рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ T
рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
type T interface{} restrict { string, error }
T
рдирд╛рдордХ рдПрдХ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдПрдХрдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ string
рдпрд╛ error
ред рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЕрдм рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдБ
func FindOrFail(m map[int]string, key int) T {
if v, ok := m[key]; ok {
return v
}
return errors.New("no such key")
}
func Lookup() {
v := FindOrFail(m, key)
if err, ok := v.(error); ok {
log.Fatal(err)
}
s := v.(string) // This type assertion must succeed.
}
рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░) рдХреЗ рдХреМрди рд╕реЗ рдкреНрд░рдореБрдЦ рддрддреНрд╡ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ?
s := v.(string) // This type assertion must succeed.
рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ v
рднреА nil
ред рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдирдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╢реВрдиреНрдп рдорд╛рди рднрд╛рд╖рд╛ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рдФрд░ рднреА рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред
рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдлреА рд╣рдж рддрдХ @rogpeppe рдХреЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЗрд╕рдХреЗ рдкрд╛рд╕ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдмрд░рджрд╕реНрддреА рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рдерд╛ ( http.Handler
)ред рдПрдХ рдФрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рднрд┐рдиреНрди рдЯреИрдЧ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рднреЗрджрднрд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧ рднрд┐рдиреНрди рдЯреИрдЧ рдФрд░ рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред
@ianlancetaylor
рдЧреБрдг
рд╡рд┐рдкрдХреНрд╖
A + B + C
рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ 1 + A + B + C
рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ @stevenblenkinsop рдиреЗ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдмрддрд╛рдпрд╛редp
рдпрд╛ *p
рдЪреБрдирдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдЯреНрд░реЗрдб рдСрдл рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдорд┐рд▓ рд╕рдХреЗред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ (рд╕реА рдЕрд░реНрде рдореЗрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗредT
рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ рди рд╕рд┐рд░реНрдл type T restrict {string, error}
)io.Reader
рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ io.Writer
рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ (рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд) рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВредerror
рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреБрдЫ рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП T
рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП)редрдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрд╣ рдкреНрд░рдореБрдЦ рдмрдХреНрд╕реЗ (рдкрд╣рд▓реЗ рджреЛ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ) рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕реЗ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдореЗрдВ рд▓реЗ рдЬрд╛рдКрдВрдЧрд╛ред рдореИрдВ рдмреЗрд╣рддрд░ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред
рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдЯрд╛рдЗрдк рдЕрднрд┐рдХрдерди рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рддреЛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдпрд╛ рддреЛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдореВрд▓реНрдп ( nil
) рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреЗ рд▓рд┐рдП рдореБрдЦрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@jimmyfrasche
рдЖрдкрдХреЗ рдЕрджреНрдпрддрди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ, рдХреНрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рддрддреНрд╡ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ:
type p pick {
A int
B string
}
func Foo(P p) {
}
var P p = 42
var Q p = "foo"
Foo(42)
Foo("foo")
рдРрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдкрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реЛрддреА рд╣реИред
рдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдк
p
рдпрд╛*p
рдЪреБрдирдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдЯреНрд░реЗрдб рдСрдл рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╕реНрдХреЗрд▓рд░ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢рдмреНрдж рдкрдврд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рд╢рдмреНрдж рдПрдХ рд╕реВрдЪрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВ; рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП #8405 рджреЗрдЦреЗрдВред рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдЪрд╛рд░ рд╕рдВрднрд╡рддрдГ рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ p
рдЕрдВрдд рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЧреИрд░-рд╕реНрдерд╛рдиреАрдп рд╣реЛрдирд╛ред
@urandom рдирд╣реАрдВ, рдЖрдкрдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЗрд╕реЗ
var p P = P{A: 42} // p := P{A: 42}
var q P = P{B: "foo")
Foo(P{A: 42}) // or Foo({A: 42}) if types can be elided here
Foo(P{B: "foo"})
рдЙрдиреНрд╣реЗрдВ рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдФрд░ рдлрд┐рд░ рдЖрдк рдПрдХ рдЬреЛрдбрд╝рдиреЗ C uint
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП p
рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ p = 42
?
рдЖрдк рдСрд░реНрдбрд░ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд┐рдпрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд╣рдореЗрд╢рд╛ рдорддрд▓рдм рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╕реЗ рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛрдб рдкрд░ рд╕реВрдХреНрд╖реНрдо рдФрд░ рдирд╛рдЯрдХреАрдп рдкреНрд░рднрд╛рд╡ рдкрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рдХрдореА рдкрд░ рдирд┐рд░реНрднрд░ рд╕рднреА рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕реЗ p = int(42)
рдпрд╛ p = uint(42)
рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╕реМ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╡реЗ рд▓рд╛рдЗрдиреЗрдВ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реИрдВред
рдЖрдкрдХреЛ рдпрд╛ рддреЛ 100% рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдмрд╣реБрдд рдирд╛рдЬреБрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдХреЛрдИ рдЫреВ рди рд╕рдХреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдХрд┐рд╕реА рднреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕реНрдкрд╖реНрдЯ рд▓реЗрдмрд▓ рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдмрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
@ рдЬреЛрд╢реЗрд░рд┐рдпрди рддреЛ рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╢рдмреНрдж-рдЖрдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп iface рдЕрдм рд╣рдореЗрд╢рд╛ (*type, *value)
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд╕рдорд╡рд░реНрддреА рдЬреАрд╕реА рдХреЛ рджреЛрдиреЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рджреВрд╕рд░рд╛ рд╕реВрдЪрдХ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рд╕рдордЭрд╛?
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╕реА рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЬреИрд╕реЗ
struct {
int which;
union {
A a;
B b;
C c;
} summands;
}
GC рдХреЛ which
рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ (рдпрд╛ рдХреБрдЫ рдлреИрдВрд╕реА рд▓реЗрдХрд┐рди рд╕рдордХрдХреНрд╖) рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ summands
рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ?
рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╢рдмреНрдж-рдЖрдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп iface рдЕрдм рд╣рдореЗрд╢рд╛ (* рдкреНрд░рдХрд╛рд░, * рдорд╛рди) рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд╕рдорд╡рд░реНрддреА рдЬреАрд╕реА рдХреЛ рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рджреВрд╕рд░рд╛ рд╕реВрдЪрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВ тАФрдпрд╣ рд╕рд┐рд░реНрдл рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╣реИред
рдпреЗ рд╕рд╣реА рд╣реИред
рдмреЗрд╢рдХ, рдкрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реАрдорд┐рдд рдкреНрд░рдХреГрддрд┐ рдХреБрдЫ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреАред рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрд╢рд╛ рд╕реВрдЪрдХ/рдЧреИрд░-рд╕реВрдЪрдХ рдХрд╛ рдПрдХ рд╕реБрд╕рдВрдЧрдд рдкреИрдЯрд░реНрди рд╣реЛ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрдХреЗрд▓рд░ рдкреНрд░рдХрд╛рд░ рдУрд╡рд░рд▓реИрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝реАрд▓реНрдб рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ "рдкреЙрдЗрдВрдЯрд░, рдиреЙрди-рдкреЙрдЗрдВрдЯрд░" рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП
pick {
a uintptr
b string
c []byte
}
рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
[ word 1 (ptr) ] [ word 2 (non-ptr) ] [ word 3 (non-ptr) ]
[ <nil> ] [ a ] [ ]
[ b.ptr ] [ b.len ] [ ]
[ c.ptr ] [ c.len ] [ c.cap ]
рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдРрд╕реА рдЗрд╖реНрдЯрддрдо рдкреИрдХрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред (рдЯреВрдЯреЗ рд╣реБрдП рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреЗрдж рд╣реИ, рдореИрдВ рдЧрд┐рдЯрд╣рдм рдХреЛ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЖрдкрдХреЛ рдмрд┐рдВрджреБ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИред)
рд╕реНрдерд┐рд░ рд▓реЗрдЖрдЙрдЯ рдХрд░рдиреЗ рдХреА рдпрд╣ рдХреНрд╖рдорддрд╛ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рддрд░реНрдХ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ; рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдлрд╝реНрд▓реИрдЧ рдХрд░рдирд╛ рд╣реИред
@ рдЬреЛрд╢реЗрд░рд┐рдпрди рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ (рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдореИрдВ рд╕рд┐рд░реНрдл рдЧреБрдЧрд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдЕрдЧрд░ рдЬреАрд╕реА рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рд╢реЛрдз рдореМрдЬреВрдж рдерд╛, рддреЛ рджреЗрдЦрд╛ рдХрд┐ рд╣рд╛рдБ рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рджрд┐рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ- рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдиреЗ "рд╕рдВрдЧрд╛рдорд┐рддрд┐" рдХреЛ рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЙрд╕ рджрд┐рди "рдЧреЛ" рдХреЗ рд╕рд╛рде: рдлреЗрд╕рдкрд╛рдо!)
рдпрджрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд▓реЗрдЖрдЙрдЯ рдерд╛, рддреЛ рдХрдо рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред
рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рд╛рд░рд╛рдВрд╢реЛрдВ рдХреЛ "рдХреЙрдореНрдкреИрдХреНрдЯ" рди рдХрд┐рдпрд╛ рдЬрд╛рдП рдпрджрд┐ рдЙрдирдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ (рд╡рд┐рднреЗрджрдХ рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП + 1) рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╕рдВрднрд╡ рд╣реЛ, рдПрдХ рд╕рдВрдХрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрдирд╛, рддрд╛рдХрд┐ рд▓реЗрдЖрдЙрдЯ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХреЗрдВред
рдЕрдЪреНрдЫреЗ рдЖрдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдЦреЛрдирд╛ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ 1 + рдмрд░рд╛рдмрд░ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрдирдореЗрдВ рдХреЛрдИ рдкреЙрдЗрдВрдЯрд░реНрд╕ рди рд╣реЛ, рдлрд┐рд░ рднреА рдЖрд╡рдВрдЯрди рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рд╣рд┐рдд, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдЕрдЪреНрдЫреЗ рдЧреБрдг рд╣реЛрдВрдЧреЗред рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди рд╕рдордп рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдо рд╕реЗ рдХрдо рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдмрддрд╛рддреЗ рд╣реИрдВред
type p pick {
A int
B string
}
рдХреНрдпрд╛ A рдФрд░ B рдХрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ рд╕реЗ рдПрдХ рдкрд┐рдХ рдЪреБрдирддрд╛ рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рдЙрдирдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдореЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдП:
type p pick {
int
string
}
q := p{string: "hello"}
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдлреЙрд░реНрдо рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдиреНрдп рд╣реИред рдПрдХ рдмрд╛рдзрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
@as рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдо рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдпрд╣ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЙрди рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░ рд╕реЗ рд╣реА рд╕реЗрдЯ/рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЛ рд╡рд╣рд╛рдБ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ, рдпрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╣реЛрдВред рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╡рд╣реА рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдмрд╛рдХреА рдЧреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
@ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рдкрдврд╝рд╛ рд╣реИ рдЙрд╕рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред
рдЖрдкрдХрд╛ рдлреЙрд░реНрдореВрд▓реЗрд╢рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд░реНрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рддрд┐рдд рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдХрд╛рд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИрдВред
рдХреНрдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ p
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рд╕реБрд▓рдн рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ рд╣реИ?
рд╡реНрд╣рд╛рдЯ рдЕрдмрд╛рдЙрдЯ
type t struct {}
type P pick {
t
//other stuff
}
?
рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХрд░рдХреЗ рдЖрдк рдЬреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
pick {
unexported Exported
Exported unexported
}
рдпрд╛ рдФрд░ рднреА
pick { Recoverable, Fatal error }
рдпрджрд┐ рдкрд┐рдХ рдлрд╝реАрд▓реНрдбреНрд╕ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдкрд┐рдХ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдлрд╝реАрд▓реНрдб рдЪреБрди рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@jimmyfrasche
рдЧреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ structs рдХреЗ рдЕрдВрджрд░ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреЛрдк рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╡рд╣ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЙрдкрдирд╛рдо рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рд╣рд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрд╣рд╛рд╡рд░рд╛ рдЧреЛ рдореЗрдВ рдЖрдо рд╣реИ рдпрд╛ рдирд╣реАрдВ:
package p
type T struct{
Exported t
}
type t struct{}
рдЫреЛрдЯрд╛ _t_ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдмрдбрд╝реЗ T рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдРрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдкреЛрдЬрд░ рд╣реИред
@рдЬреИрд╕рд╛
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐:
//with the option to have field names
pick { //T is in the namespace of the pick and the type isn't exposed to other packages
T t
//...
}
//without
type T = t //T has to be defined in the outer scope and now t is exposed to other packages
pick {
T
//...
}
рд╕рд╛рде рд╣реА, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рдерд╛, рддреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП []string
рдЖрдкрдХреЛ type Strings = []string
рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╡рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдореЗрдВ
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдФрд░ C++ (рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд░реНрдг рдорд╛рдирдХ) рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ред
рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдердХрд╛рд╡рдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рддреЛ рдореИрдВ рдПрдХ рдЪреЗрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП
рдкреНрд░рджрд░реНрд╢рди рдЬреАрддред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд┐рд╕реА рдкрд┐рдХ рддрддреНрд╡ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛ рдкрддрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рдпрд╣
рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рдХреЗрд╕ рдореЗрдВ рднреА, рдЬреИрд╕рд╛ рдХрд┐ рд╕рд░реНрд╡рд╡рд┐рджрд┐рдд рд╣реИ
рдЬрдВрдЧ рд╕рдореБрджрд╛рдпред) рдпрджрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдиреНрдп рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ,
рддреЛ рдРрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдвреЗрд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ
рдмреБрд░рд╛ рд╣реЛрдЧрд╛ред
рдЕрдЧрд╕реНрдд 18, 2017 12:01 рдкреАрдПрдо, "jimmyfrasche" [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:
@josarian https://github.com/josarian рддреЛ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ
рдХрд╛рд░рдг iface рдЕрдм рд╣рдореЗрд╢рд╛ (*type, *value) рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╣реИ
рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╢рдмреНрдж-рдЖрдХрд╛рд░ рдХрд╛ рдорд╛рди рдЬреИрд╕рд╛ рдХрд┐ рдЧреЛ рдиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛ рддрд╛рдХрд┐
рд╕рдорд╡рд░реНрддреА рдЬреАрд╕реА рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛
рдПрдХ рд╕реВрдЪрдХ рд╣реИтАФрдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рд╕рдордЭрд╛?
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╕реА рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЬреИрд╕реЗ
рд╕рдВрд░рдЪрдирд╛ {
рдЗрдВрдЯ рдЬреЛ;
рд╕рдВрдШ {
рдП рдП;
рдмреА рдмреА;
рд╕реА рд╕реА;
} рд╕рдорди;
}
рдЬреАрд╕реА рдХреЛ рд▓реЙрдХ (рдпрд╛ рдХреБрдЫ рдлреИрдВрд╕реА рд▓реЗрдХрд┐рди рд╕рдордХрдХреНрд╖) рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдорди рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рд╕реВрддреНрд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/19412#issuecomment-323393003 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AGGWB3Ayi31dYwotewcfgmCQL-XVrfxIks5sZbVrgaJpZM4MTmSr
.
@DemiMarie
рдкрд┐рдХ рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛ рдкрддрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рдорд╛рдорд▓реЗ рдореЗрдВ рднреА, рдЬреИрд╕рд╛ рдХрд┐ рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред) рдпрджрд┐ рдЙрд╕реЗ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдиреНрдп рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд╣реА рд╣реЛред
рдпреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╣ рдерд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдВрдкрд╛рджрди рдореЗрдВ рдЦреЛ рдЧрдпрд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдкрд┐рдХ рд╕реЗ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдПрдХ рдкреНрд░рддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рдЪ рдХреНрдпреЛрдВ рд╣реИ, рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
v := pick{ A int; B bool }{A: 5}
p := &v.[A] //(this would be illegal but pretending it's not for a second)
v.B = true
рдпрджрд┐ v
рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдлрд╝реАрд▓реНрдб A
рдФрд░ B
рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд▓реЗ рд▓реЗрдВ рддреЛ p
рдПрдХ int рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ: рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдПрдХ рдмреВрд▓ рдХреЛред рд╕реНрдореГрддрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
@jimmyfrasche
рджреВрд╕рд░рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдкрддрд╛ рдпреЛрдЧреНрдп рд╣реЛ, рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рд╢рдмреНрджрд╛рд░реНрде рд╣реИред рдпрджрд┐ рдорд╛рди рдХреБрдЫ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ
v := pick{ A int; ... }{A: 5}
v2 := v
v2.[A] = 6 // (this would be illegal under the proposal, but would be
// permitted if `v2.[A]` were addressable)
fmt.Println(v.[A]) // would print 6 if the contents of the pick are stored indirectly
рдПрдХ рдЬрдЧрд╣ рдЬрд╣рд╛рдВ pick
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдореВрд▓реНрдп рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреЗрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рдмрдирд╛рдирд╛ рд╣реИ (рдпрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ,
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЙрдлрд╝ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)
@jimmyfrasche
рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╕реНрд░реЛрдд рдХреНрд░рдо рдореЗрдВ рдЙрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдФрд░ рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ v.[A]
рдФрд░ v.(error)
рд╕рд╣реА рдХрд╛рдо рдХрд░реЗрдВред
@stevenblenkinsop рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ "рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдПрдХ рд╕реВрдЪрдХ рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рджрд┐рдпрд╛ рдЧрдпрд╛
var p pick { A error; B int }
рд╢реВрдиреНрдп рдорд╛рди, p
, рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ A
рдФрд░ A
рдХрд╛ рдорд╛рди рд╢реВрдиреНрдп рд╣реИред
рдореИрдВ pick
рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдиреЗ/рдпреБрдХреНрдд рд╣реЛрдиреЗ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХрд╛ рдЬрд┐рдХреНрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореИрдВ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рд▓реЗрдЖрдЙрдЯ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдПрдХ рдЧреИрд░-рдкреЙрдЗрдВрдЯрд░ рдорд╛рди рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ @josarian рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ .
рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, p.B
тАФрдПрдХ рд╕реВрдЪрдХ рдирд╣реАрдВ рд╣реИтАФ p.A
рд╕рд╛рде рдЕрддрд┐рд╡реНрдпрд╛рдкреА рднрдВрдбрд╛рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ (рдпрд╛рдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдПрдХ *int
рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ dereferenced рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ, рдмрд▓реНрдХрд┐ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ int
)ред рдпрджрд┐ p.B
рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдерд╛, рддреЛ pick
рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди new(int)
, рдЬреЛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рд╢реВрдиреНрдп *int
рдХреЛ new(int)
рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХреЗред
@jimmyfrasche
рдореБрдЭреЗ рдорд╛рдл рдХрд░реЗрдВред рдмрд╛рддрдЪреАрдд рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдкрд░, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЖрдк рдЧреИрд░-рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рднрдВрдбрд╛рд░рдг рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрдВрддреНрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрд╕рдВрдЧрдд рд▓реЗрдЖрдЙрдЯ рд╡рд╛рд▓реЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рдиреНрди рднрдВрдбрд╛рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗред рдореЗрд░реА рдкрд┐рдЫрд▓реА рддреАрди рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд░рдЦрддреАрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдУрд╣, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ред рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рддреЛ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреАред
@stevenblenkinsop рдЖрд╣, рдареАрдХ рд╣реИ, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдЕрддрд┐рд╡реНрдпрд╛рдкреА рднрдВрдбрд╛рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╣реИред рдпрд╣ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛: рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рд╣реИрдВред
рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪреБрдирддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмреЛрдирд╕ рд╣реИред
рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рд╕рдорддреБрд▓реНрдп рд╕рдВрд░рдЪрдирд╛ (рдПрдХ рдЯреИрдЧ рдЬреЛрдбрд╝рдХрд░ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рд╕рдХреНрд░рд┐рдп рдХреНрд╖реЗрддреНрд░ рд╣реИ)ред рдпрд╣ рд╣реЛрдЧрд╛
struct {
which_field int // 0 = A, 1 = B
A error
B int
}
рд╢реВрдиреНрдп рдорд╛рди рдЕрднреА рднреА рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ 0 рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХреНрд╖реЗрддреНрд░ рдЦреЗрд▓ рдореЗрдВ рд╣реИред
рдЪреБрдирдиреЗ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ/рд╕реНрд╡рд┐рдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдереА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкрд┐рдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ fmt.Stringer
рд╕рдВрддреБрд╖реНрдЯ рд╣реИ рддреЛ рдЖрдк рдкрд┐рдХ рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
func (p P) String() string {
return p.(fmt.Stringer).String()
}
рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдкрд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рдмрдирд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд┐рдХ P
рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдерд╛ рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ fmt.Stringer
рд╣реИ рддреЛ String
рд╡рд┐рдзрд┐ рдШрдмрд░рд╛рдПрдЧреА рдпрджрд┐ рд╡рд╣ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп nil
ред рдЖрдк рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП nil
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рд╕реНрд╡рдпрдВ рднреА рдирд╣реАрдВред https://play.golang.org/p/HMYglwyVbl рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЪрдпрди рдХреЗ рд╕рд╛рде рд╕рд╛рдордиреЗ рдЖ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдмрдВрдж рдкреНрд░рдХреГрддрд┐ рдПрдХ рдердХрд╛рд╡рдЯ рд▓рд┐рдВрдЯрд░ рдХреЛ рд╣рд░ рдЬрдЧрд╣ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреЗ рд╕рд╛рде) рдФрд░ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛, рдпрджрд┐ рдЖрдк рдкрд┐рдХ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
type Num pick { A int; B float32 }
func (n Num) String() string {
switch v := n.[var] {
case A:
return fmt.Sprint(v)
case B:
return fmt.Sprint(v)
}
}
...
n := Num{A: 5}
s1, ok := p.(fmt.Stringer) // ok == false
var i interface{} = p
s2, ok := i.(fmt.Stringer) // ok == true
рдпрджрд┐ рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдлрд╝реАрд▓реНрдб рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХрд┐рд╕реА рдорд╛рди рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ рд╣реИ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ (рдпрд╛ рдЗрд╕реЗ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдИ рднреА рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рдкрд┐рдХ рдореЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдкрд░ рднрд┐рдиреНрди рдЪрдпрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдкрд┐рдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ , рдФрд░/рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╡реИрд╕реЗ, рдПрдХ рдкрд┐рдХ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдкреИрдХ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕рд╛рдорд╛рдиреНрдп рд╕реБрдкрд░рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдПрдирдкреА-рдкреВрд░реНрдг рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓рд╛рд▓рдЪреА рдЕрдиреБрдорд╛рди рд╣реИрдВ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ рдПрдХ рдкрд┐рдХ рд╡реИрд▓реНрдпреВ рд╣реИ рддреЛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рдкрд┐рдХ рд╡реИрд▓реНрдпреВ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдкрд┐рдХ рд╡реИрд▓реНрдпреВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рд╕реБрд╕рдВрдЧрдд рд╣реИред
рдкрд┐рдХ рд╡реИрд▓реНрдпреВ рдкрд░ рдЯрд╛рдЗрдк рдПрд╕реЗрд╢рдВрд╕ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛
func (p Pick) String() string {
switch v := p.[var] {
case A:
return v.String()
case B:
return v.String()
//etc
}
}
рдмрд╕ рдЖрдЧреЗ рдмрдврд╝реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдЫреЛрдбрд╝реЗред рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рд╡реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВред
рдореИрдВ @ianlancetaylor рдХреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐-рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдХреБрдЫ рдирдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдорд┐рд▓рд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, https://github.com/golang/go/issues/21161# рдореБрджреНрджрд╛ рдЯрд┐рдкреНрдкрдгреА-320294933)ред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ?
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдореБрдЦ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╣рдореЗрдВ рдХрдИ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдФрд░ рдХрдИ рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ - рдЦрд╛рд╕рдХрд░ рдЬрдм рдЙрди рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреЙрд░реНрдо рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдп рд╣реИрдВ
func F(тАж) (T, error) {
тАж
}
рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ, рдЬреИрд╕реЗ io.Reader.Read
рдФрд░ io.Reader.Write
, T
рдХреЗ рд╕рд╛рде error
рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдпрд╛ рддреЛ T
рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ error
рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХрднреА рдирд╣реАрдВред рдПрдкреАрдЖрдИ рдХреА рдкреВрд░реНрд╡ рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ T
рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рдПрдХ рдмрдЧ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рддреНрд░реБрдЯрд┐ io.EOF
); рдмрд╛рдж рдХреА рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп T
рд▓реМрдЯрд╛рдирд╛ рдмрдЧ рд╣реИред
lint
рд╕рд╣рд┐рдд рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЙрдкрдХрд░рдг, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдкрд░ рдорд╛рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рдРрд╕реЗ рдЪреЗрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдордирдорд╛рдиреЗ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдирд╣реАрдВ рдмрдврд╝рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, proto.Marshal
рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп "рдорд╛рди рдФрд░ рддреНрд░реБрдЯрд┐" рд╢реИрд▓реА рд╣реЛрдирд╛ рд╣реИ рдпрджрд┐ рддреНрд░реБрдЯрд┐ RequiredNotSetError
, рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ "рдорд╛рди рдпрд╛ рддреНрд░реБрдЯрд┐" рд╢реИрд▓реА рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдЪреВрдВрдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧрд▓рддреА рд╕реЗ рд░рд┐рдЧреНрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ: рдпрд╛ рддреЛ рдПрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЬрдм рд╣рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдПрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ред рдФрд░ proto.Marshaler
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдорд╛рдорд▓реЗ рдХреЛ рдФрд░ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред
рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╕рдВрдШ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
type PartialMarshal struct {
Data []byte // The marshalled value, ignoring unset required fields.
MissingFields []string
}
func Marshal(pb Message) []byte | PartialMarshal | error
@ianlancetaylor , рдореИрдВ рдХрд╛рдЧрдЬ рдкрд░ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдиреАрдЪреЗ рдХреБрдЫ рдЧрд▓рдд рд╣реИ?
рджрд┐рдпрд╛ рдЧрдпрд╛
var r interface{} restrict { uint, int } = 1
r
рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ int
, рдФрд░
var _ interface{} restrict { uint32, int32 } = 1
рдЕрд╡реИрдз рд╣реИред
рджрд┐рдпрд╛ рдЧрдпрд╛
type R interface{} restrict { struct { n int }, etc }
type S struct { n int }
рддреЛ var _ R = S{}
рдЕрд╡реИрдз рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рджрд┐рдпрд╛
type R interface{} restrict { int, error }
type A interface {
error
foo()
}
type C struct { error }
func (C) foo() {}
var _ R = C{}
рдФрд░ var _ R = A(C{})
рджреЛрдиреЛрдВ рдХрд╛рдиреВрдиреА рд╣реЛрдВрдЧреЗред
рджреЛрдиреЛрдВ
interface{} restrict { io.Reader, io.Writer }
рддрдерд╛
interface{} restrict { io.Reader, io.Writer, *bytes.Buffer }
рд╕рдордХрдХреНрд╖ рд╣реИрдВред
рдЗрд╕реА рддрд░рд╣,
interface{} restrict { error, net.Error }
рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
interface { Error() string }
рджрд┐рдпрд╛ рдЧрдпрд╛
type IO interface{} restrict { io.Reader, io.Writer }
type R interface{} restrict {
interface{} restrict { int, uint },
IO,
}
рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ R
рдмрд░рд╛рдмрд░ рд╣реИ
interface{} restrict { io.Writer, uint, io.Reader, int }
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрдЯреИрд▓рд┐рдХ рдореЗрдВ рдЫреЛрдЯрд╛ рд╕реБрдзрд╛рд░
@jimmyfrasche рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛ рд╡рд╣ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛ред рдпрд╣ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рдерд╛ред рдореБрдЭреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд╡реЗ рдкреНрд░рд╢рдВрд╕рдиреАрдп рд▓рдЧрддреЗ рд╣реИрдВред
@jimmyfrasche рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдореИрдВ рдХреИрд╕реЗ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЧреЛ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкрд┐рдХ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЙрдирдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ "рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЕрд░реНрде рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╢реВрдиреНрдп рдХрд░рдирд╛" рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рд╣реИ, рдмрд╢рд░реНрддреЗ рдЯреИрдЧ рдорд╛рди рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрдВ (рд╢рд╛рдпрдж рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдиреЛрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ; рдпрд╣ рдзрд╛рдЧрд╛ рдЕрдм рддрдХ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ...) рдореБрдЭреЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ (рдХреЛрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрд╡рдВрдЯрди рдирд╣реАрдВ) рднреА рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдпрд╣ рдкрд╕рдВрдж рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИрдВ (рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╛рд▓реЗ рдкрд┐рдХ рдкрд░ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдирд╣реАрдВ)ред
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рдореИрдВ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рд╡рд╣ рд╣реИ рдЯреИрдЧ рдХреЛ рдмрджрд▓рдирд╛: foo.X = 0
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ foo = Foo{X: 0}
; рдХреБрдЫ рдФрд░ рд╡рд░реНрдг, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдЯреИрдЧ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдорд╛рди рдХреЛ рд╢реВрдиреНрдп рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рд╣реИ, рдФрд░ рдореБрдЭреЗ рддрдм рднреА рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА рдпрджрд┐ рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдпрдерд╛рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@ ns-cweber рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдореИрдВ рд╢реВрдиреНрдп рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╢реНрд░реЗрдп рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ред рд╡рд┐рдЪрд╛рд░ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЗрдзрд░-рдЙрдзрд░ рддреИрд░ рд░рд╣реЗ рдереЗ рдФрд░ @rogpeppe рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдереЗ рдЬреЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдЖрдП рдереЗ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╛рдлреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрддрд╛рддреЗ рд╣реИрдВ)ред рдореЗрд░рд╛ рдФрдЪрд┐рддреНрдп рд╡рд╣реА рдерд╛ рдЬреЛ рддреБрдордиреЗ рджрд┐рдпрд╛ рдерд╛ред
рдЬрд╣рд╛рдВ рддрдХ foo.X = 0
рдмрдирд╛рдо foo = Foo{X: 0}
, рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛрдиреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдкрд┐рдХ рдХрд╛ рд╡рд╣ рдХреНрд╖реЗрддреНрд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рддреЛ рдЖрдк foo.X.Y = 0
рдмрдЬрд╛рдп foo = Foo{X: image.Point{X: foo.[X].X, 0}}
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдлреНрдЯ рдкрд┐рдЪ рдХреЛ рдордЬрдмреВрдд рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдЪреАрдЬ рдЬреЛ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреА рд╣реИ-рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдкрд┐рдХ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рджреВрд╕рд░реЗ рджрд┐рди рдореИрдВрдиреЗ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рднрд╛рд╡реЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд░рдореНрдордд рдпреЛрдЧреНрдп рд╣реИ рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдорд░рдореНрдордд рдХреНрдпрд╛ рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбреЗрдб рдкрд┐рдХ рдХреЛ рдирд╛рдо рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдореИрдВ рдЙрд╕ рдкрд░ рдЭреБрдХ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдб рдФрд░ рдлрд╝реАрд▓реНрдб рджреЛрдиреЛрдВ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред
@jimmyfrasche рдореБрдЭреЗ рд╢реВрдиреНрдп-рдореВрд▓реНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЛрдиреЛрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд▓рд┐рдлреНрдЯ рдкрд┐рдЪ рдмрд┐рдВрджреБ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЦреБрдж рдХреЛ foo.XY рд╕реЗрдЯ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛, рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддрдм рднреА рдореИрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рд╕рдиреНрди рд░рд╣реВрдВрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЙрд╕ рдорд╛рдореВрд▓реА рдЖрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рднреАред
рдЕрдВрдд рдореЗрдВ, рдкрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕рд░рд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭреВрдВрдЧрд╛ред рднрд▓реЗ рд╣реА рд╣рдо рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рджреЗрдВ, рд╣рдо рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЬрдЯрд┐рд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрд▓реНрдЯрд╛ рд╕рдЪ рдирд╣реАрдВ рд╣реИред
@ns-cweber
рдореИрдВ рдЦреБрдж рдХреЛ foo.XY рд╕реЗрдЯ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛, рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд┐рдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛
рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдмрд┐рдВрджреБ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рднрд╛рд╖рд╛, рдпрд╛ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЧреЛ рдореЗрдВ рд╕реЗрдлреНрдЯреА рд░реЗрд▓реНрд╕ рд╣реЛрддреА рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕реЗрдлреНрдЯреА рдХреИрдВрдЪреА рдирд╣реАрдВред
рдРрд╕реА рдмрд╣реБрдд рд╕реА рдмрдбрд╝реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреА рд░рдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЬрдм рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди, рдУрд╣, рдпрд╣ "рдореИрдВрдиреЗ bar.X = 0
рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорддрд▓рдм bar.Y = 0
рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ" рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ foo
рдПрдХ рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЗрд╕реА рддрд░рд╣ i.Foo()
, p.Foo()
, рдФрд░ v.Foo()
рд╕рднреА рдПрдХ рдЬреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрдЧрд░ i
рдПрдХ nil
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рддреЛ p
рдПрдХ рд╢реВрдиреНрдп рд╕реВрдЪрдХ рд╣реИ рдФрд░ Foo
рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рджреЛ рдШрдмрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдпрджрд┐ v
рдПрдХ рдореВрд▓реНрдп рд╡рд┐рдзрд┐ рд░рд┐рд╕реАрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (рдХрдо рд╕реЗ рдХрдо рдЖрдордВрддреНрд░рдг рд╕реЗ рд╣реА рдирд╣реАрдВ, рд╡реИрд╕реЗ рднреА) .
-
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдвреАрд▓рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрднреА рдЖрдЧреЗ рдмрдврд╝рдХрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ред
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рдПрдХ рдореВрд▓реНрдпрд╣реАрди рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, database/sql
рдкреИрдХреЗрдЬ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:
type NullString struct {
String string
Valid bool // Valid is true if String is not NULL
}
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ / рдЪрдпрди / рд╕рдВрдШ рдереЗ, рддреЛ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
type NullString pick {
Null struct{}
String string
}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдлрд╛рдпрджреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред
рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ), рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╕рдорд░реНрдерди рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ:
type NullString union {
Null
String string
}
@рдиреАрд▓реНрдб
рдЖрдЦрд┐рд░реА рдмрд┐рдВрджреБ рдХреЛ рдкрд╣рд▓реЗ рдорд╛рд░рдирд╛: рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдЦрд┐рд░реА рдорд┐рдирдЯ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ (рдХрд┐рд╕реА рднреА рдЕрд░реНрде рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ рдЬрд░реВрд░реА рдирд╣реАрдВ), рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реВрдЪрдХ) рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдирд╣реАрдВ рд╣реИ рддреЛ рдкрд┐рдХ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝реАрд▓реНрдб рдмрдирд╛рддрд╛ рд╣реИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рдеред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрдкрджреНрд░рд╡ рдХреЗ "рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░" рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдХрд╛ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
type Null = struct{} //though this puts Null in the same scope as NullString
type NullString pick {
Null
String string
}
рдЕрдкрдиреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрдкрдпреЛрдЧ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдирдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: type Stoplight pick { Stop, Slow, Go struct{} }
ред рдпрд╣ рдПрдХ рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдлреЙрдХреНрд╕-рдПрдирдо рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рд╣реА рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдореБрдЦ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рд╣реИ рдФрд░ рдЖрдк рдЙрди рддреАрди рд╕реВрдЪреАрдмрджреНрдз рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, Stoplight
рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдЬреАрдм рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рддреЗрдЬ рд╣реЛ рдЧрдпрд╛ рд╣реИ:
light := Stoplight{Slow: struct{}{}}
light.Go = struct{}{}
{}
рдпрд╛ _
рдХреЛ struct{}{}
рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣реАрдВ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдорджрдж рдорд┐рд▓реЗрдЧреАред
рдХрдИ рднрд╛рд╖рд╛рдПрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдПрдВ, рд▓реЗрдмрд▓ рдХреЛ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд░рдЦрдХрд░ рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рддреА рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рджреЛ рдкрд┐рдХреНрд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдкрд┐рдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ func рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рднреА, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХрд╛ рдерд╛, рддреЛ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд▓рд┐рдпрд╛, рддреЛ Stoplight
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛
func Stop() Stoplight {
return Stoplight{Stop: struct{}{}}
}
func Slow() Stoplight {
return Stoplight{Slow: struct{}{}}
}
func Go() Stoplight {
return Stoplight{Go: struct{}{}}
}
рдФрд░ рдЖрдкрдХреЗ NullString
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
func Null() NullString {
return NullString{Null: struct{}{}}
}
func String(s string) NullString {
return NullString{String: s}
}
рдпрд╣ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ go generate
рджреВрд░ рд╣реИ рдФрд░ рд╕рдВрднрд╡рдд: рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрдирд▓рд╛рдЗрди рд╣реИред
рдпрд╣ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдЙрд╕рдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╣рд┐рдд рдлрд╝реАрд▓реНрдб рдмрдирд╛рдП рд╣реИрдВ (рдЬрдм рддрдХ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рд╕реЗ рдирд╣реАрдВ рдереЗ) рдпрд╛ рдЗрд╕реЗ рдЙрд╕реА рдкреИрдХреЗрдЬ рдореЗрдВ рджреЛ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдм рдХреБрдЫ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреНрдпрд╛ рд╣реИред
рдЕрдзрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ:
type NullString union {
Null
Value string
}
var _ = NullString{Null}
var _ = NullString{Value: "some value"}
var _ = NullString{Value} // equivalent to NullString{Value: ""}.
рдХрдВрдХреНрд░реАрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рддрддреНрд╡ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдХреБрдВрдЬреА рдирд╣реАрдВ рд╣реИ, рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдХреЗ рдирд╛рдордХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдпрд╣ рдорд┐рд╢реНрд░рд┐рдд рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рддрд░рдл, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдЙрдкрдпреЛрдЧ рд╣реИ рдЬреЛ рд╕рдВрдШ/рдкрд┐рдХ/рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдордЭрджрд╛рд░ рдФрд░ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреБрдВрдЬреА рдХреЗ рд╕рдВрдШ рдкреНрд░рд╛рд░рдВрднрдХрд░реНрддрд╛ рдХреА рдХреЛрдИ рд╕рдордЭрджрд╛рд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИред
@рдиреАрд▓реНрдб
рдпрд╣ рдорд┐рд╢реНрд░рд┐рдд рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
var ns NullString // == NullString{Null: struct{}{}} == NullString{}
ns.String = "" // == NullString{String: ""}
struct{}{}
рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдореИрдВ map[T]struct{}
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВ
var set struct{}
рдХрд╣реАрдВ рдФрд░ theMap[k] = set
, рдЗрд╕реА рддрд░рд╣ рдХреА рдкрд╕рдВрдж рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛
рдЖрдЧреЗ рдмрд╛рдЗрдХрд╢реЗрдбрд┐рдВрдЧ: рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ (рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ) рдХреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ "рдЗрдХрд╛рдИ" рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ "рд╢реВрдиреНрдп"ред
@bcmills рд╕реЙрд░реНрдЯрд╛ ред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЬрдм рдЖрдк рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓реЗрдмрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ, (рдпрджреНрдпрдкрд┐ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп "рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░" рдпрд╛ "рдЯрд╛рдЗрдХреЙрди" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рдХ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП
data Bool = False | True
рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ Bool
рдФрд░ рдПрдХ рд╣реА рджрд╛рдпрд░реЗ рдореЗрдВ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, True
рдФрд░ False
, рдкреНрд░рддреНрдпреЗрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ () -> Bool
ред
рдпрд╣рд╛рдВ ()
рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдЙрдЪреНрдЪрд╛рд░рд┐рдд рдЗрдХрд╛рдИ рд▓рд┐рдЦрддреЗ рд╣реИрдВтАФрд╡рд╣ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ struct{}
ред
рддреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдпреВрдирд┐рдЯ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдХрдиреНрд╡реЗрдВрд╢рди рдЖрдо рддреМрд░ рдкрд░ None
рдЬрдм рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдбреЛрдореЗрди рдХреЗ рдЕрдиреБрд░реВрдк рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдорд╛рди рдХрд┐рд╕реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реЛ рддреЛ Null
рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ред
@рдмреАрд╕реАрдорд┐рд▓реНрд╕
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдореБрдЦ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╣рдореЗрдВ рдХрдИ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдФрд░ рдХрдИ рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ - рдЦрд╛рд╕рдХрд░ рдЬрдм рдЙрди рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдЧреЛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рднрд╛рд╖рд╛рдПрдВ рдХреБрдЫ рдореВрд▓реНрдп рдпрд╛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЧреЛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рд▓реЛрднрди рд╣реЛрдЧрд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЧреЛ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрдИ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдирдпрд╛ рдХреЛрдб рдЯреБрдкрд▓реНрд╕ (рдорд╛рди, рддреНрд░реБрдЯрд┐) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдЦрдВрдбрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдЫ рд▓реЗрдЦрдХ рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рд░рд┐рдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ; рдХреБрдЫ рд▓реЗрдЦрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ; рдХреБрдЫ рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рдПрдкреАрдЖрдИ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдкреБрд░рд╛рдиреЗ рдЧреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдЕрдЯрдХреЗ рд╣реБрдП рд▓реЗрдЦрдХ, рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ, рдирдП рдПрдкреАрдЖрдИ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛрдЧреА, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд▓рд╛рдн рд▓рд╛рдЧрдд рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдиреЗ рд▓рдЧреЗрдВрдЧреЗред
рдпрджрд┐ рдирдпрд╛ рдХреЛрдб рдЯреБрдкрд▓реНрд╕ (рдорд╛рди, рддреНрд░реБрдЯрд┐) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдЦрдВрдбрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рд╣рдо рдЧреЛ 2 рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд╡рд┐рдЦрдВрдбрди рдирд╣реАрдВ: рдЧреЛ 1 (рдорд╛рди, рддреНрд░реБрдЯрд┐) рдПрдкреАрдЖрдИ рдХреЛ рдЧреЛ 2 (рдорд╛рди | рддреНрд░реБрдЯрд┐) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред ) рдПрдкреАрдЖрдИ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЧреЛ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рдЧреЛ 2 рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдЬреЛ рдЕрдм рддрдХ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЧрдП рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ: рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкреБрди: рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдПрдкреАрдЖрдИ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдиреБрд╡рд╛рдж рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЖрджрд┐ред рдЗрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдпрд╣ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдорд╛рдореВрд▓реА рдХреЛрдбрд┐рд╕рд┐рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреАрдЖрдИ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдкреНрд░рд╕реНрддрд╛рд╡ред
рдЗрд░рд╛рджрд╛ рдЧреЛ 1 рдФрд░ рдЧреЛ 2 рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ "рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ" рдЧреЛ 1 рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рдлрдВрд╕ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИред 2 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд╛рдУред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рд░реНрднрд░рддрд╛ A
рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ B
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдФрд░ B
рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдореЗрдВ pick
рдЬреИрд╕реА рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИ, рддреЛ рд╡рд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ A
рдЬрдм рддрдХ рдХрд┐ рдпрд╣ B
рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рди рд╣реЛред A
рдХреЗрд╡рд▓ рд╡рд┐рдХреНрд░реЗрддрд╛ B
рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рдмрдЧ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ ... рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ B
рд╕реАрдзреЗ рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрддрдд:, рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдмрд╣реБрдд рдХрдо рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ, рдФрд░ рдореМрдЬреВрджрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдХрд░рдирд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рднрдВрдЧ рд╣реЛрддрд╛ рд╣реИред рдЖрд╢рдп рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рддреЛ рдореМрдЬреВрджрд╛ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА pick
рдкрд╢реНрдЪ рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛, рддреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреБрд▓ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░реЙрдореИрди рдХреЗ рд░реВрдк рдореЗрдВ):
type ReadResult pick(N int, Err error) {
N
PartialResult struct { N; Err }
Err
}
рд╕рдВрдХрд▓рдХ рдХреЗрд╡рд▓ ReadResult
рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рддрд░рдл рдХреИрд╕реЗ рдЬрд╛рдирд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдПрдкреАрдЖрдИ рдЬреИрд╕реЗ template.Must
рдХреЛ рдХреЗрд╡рд▓ pick
рдмрдЬрд╛рдп рдХрдИ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
type ReadResult pick(N int, Err error) {
case Err == nil:
N
default:
PartialResult struct { N; Err }
case N == 0:
Err
}
рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ (рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕, рдПрдХрд╛рдзрд┐рдХ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ) рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИ - рдмрд╕ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рд╢реВрдиреНрдп рдкрд░ рдорд╛рди рдирд╣реАрдВ рд╣реИред рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рдЬрд╛рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдПрдкреАрдЖрдИ рдПрдХ рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдмрд╛рдз рд░реВрдк рд╕реЗ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕рдВрдХреНрд░рдордг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдорд╛рд░реНрдЧ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдВ рдЬрд╣рд╛рдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рдФрд░ рдЙрддреНрдкрд╛рдж рдкреНрд░рдХрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЙрд▓ рдХрд░рддрд╛ рд╣реЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг, рдХрд┐рд╕реА рднреА рд░рдирдЯрд╛рдЗрдо рдЬрд╛рдБрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЙрддреНрдкрд╛рдж рд╕реНрдерд╛рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рд░ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ
рд╕рдВрд╕реНрдХрд░рдг 1 рд░рдХрдо рдХреЗ рдмрд┐рдирд╛
func Take(i interface{}) error {
switch i.(type) {
case int: //do something
case string:
default: return fmt.Errorf("invalid %T", i)
}
}
func Give() (interface{}, error) {
i := f() //something
if i == nil {
return nil, errors.New("whoops v:)v")
}
return i
}
рд░рд╛рд╢рд┐ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг 2
type Value pick {
I int
S string
}
func TakeSum(v Value) {
// do something
}
// Deprecated: use TakeSum
func Take(i interface{}) error {
switch x := i.(type) {
case int: TakeSum(Value{I: x})
case string: TakeSum(Value{S: x})
default: return fmt.Errorf("invalid %T", i)
}
}
type ErrValue pick {
Value
Err error
}
func GiveSum() ErrValue { //though honestly (Value, error) is fine
return f()
}
// Deprecated: use GiveSum
func Give() (interface{}, error) {
switch v := GiveSum().(var) {
case Value:
switch v := v.(var) {
case I: return v, nil
case S: return v, nil
}
case Err:
return nil, v
}
}
рд╕рдВрд╕реНрдХрд░рдг 3 рдЧрд┐рд╡/рдЯреЗрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛
рд╕рдВрд╕реНрдХрд░рдг 4 рджреЗрдиреЗ/рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рд╡рд╕рдо/рдЯреЗрдХрд╕рдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдЧрд┐рд╡рд╕рдо/рдЯреЗрдХрд╕рдо рдХреЛ рдмрд╕ рдХреЙрд▓ рдХрд░реЗрдВ/рд▓реЗ рд▓реЗрдВ рдФрд░ рдЧрд┐рд╡рд╕рдо/рдЯреЗрдХрд╕рдо рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
рд╕рдВрд╕реНрдХрд░рдг 5 рдЧрд┐рд╡рд╕рдо/рдЯреЗрдХрд╕рдо рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛
рдпрд╣ рд╕реБрдВрджрд░ рдпрд╛ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рди рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╡реНрдпрд╡рдзрд╛рди рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдЫ рднреА рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ (рдЕрдзрд┐рдХрд╛рдВрд╢) рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд░реЗ рд╕рдкрдиреЛрдВ рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
type T1 switch {T2,T3} // only nil, T2 and T3 may be assigned to T1
type T2 struct{}
type U switch {} // only nil may be assigned to U
type V switch{interface{} /* ,... */} // V equivalent to interface{}
type Invalid switch {T2,T2} // only uniquely named types
type T3 switch {int,uint} // switches can contain switches but...
... рдпрд╣ рдПрдХ рд╕реНрд╡рд┐рдЪ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рднреА рд╣реЛрдЧреА, рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ:
var t1 T1
i,ok := t1.(int) // T1 can't be int, only T2 or T3 (but T3 could be int)
switch t := t1.(type) {
case int: // compile error, T1 is just nil, T2 or T3
}
рдФрд░ рдЧреЛ рд╡реЗрдЯ рдЯреА3 рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯ рдирд┐рд░рдВрддрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рд░реНрдк рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рд╕рднреА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП (рд░рдирдЯрд╛рдЗрдо рдкрд░) var x T3 = 32
рд╣реЛрдЧрд╛ var x interface{} = 32
ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкреИрдХреЗрдЬ рдореЗрдВ рдмрд┐рд▓реНрдЯрд┐рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрд╡рд┐рдЪ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдпрд╛ рдЯрдЯреНрдЯреВ рдЬреИрд╕реЗ рдХреБрдЫ рдирд╛рдо рднреА рдЧреНрд░реЛрд╡реА рд╣реЛрдВред
@j7b , @ianlancetaylor рдиреЗ https://github.com/golang/go/issues/19412#issuecomment -323256891 рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛
рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рддрд╛рд░реНрдХрд┐рдХ рдкрд░рд┐рдгрд╛рдо https://github.com/golang/go/issues/19412#issuecomment -325048452 рдкрд░ рд╣реЛрдВрдЧреЗ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрддрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдРрд╕рд╛ рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ + рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЗрдпрд╛рди рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде: рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд┐рдд рдореМрдЬреВрджрд╛ рдЫрджреНрдо-рд░рд╛рд╢рд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдмрд╕ restrict
рд╕реЗ рдирд┐рдкрдЯреЗрдВ)ред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рд╡реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реЛрдВрдЧреЗ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо рд╕рд┐рд░реНрдл рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдВрдЧреЗ рдЬрдм рдЙрдирдХреЗ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдХрд░реАрдм рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд┐рдЯ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЬрд╝реВрдо рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ
рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред
рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИрдВ, рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╡реЗ рдЕрд▓рдЧ рд╣реЛрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрддрдирд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдЬрд┐рддрдирд╛ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рджреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ (рдЬреИрд╕реЗ io.Reader
/ io.Writer
) рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдШ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдХрд┐ рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ interface{}
рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди io.Reader
рдпрд╛ io.Writer
рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрджрд┐ рдпрд╣ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓рд╛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддрдм рддрдХ рдЖрдк рдПрдХ рдЕрд╕рдВрдмрджреНрдз рд╕рдВрдШ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЧрддрд╛ рд╣реИред
рдЯреНрд░реЗрдбрдСрдл рдпрд╣ рд╣реИ рдХрд┐, рдпрджрд┐ рдпреВрдирд┐рдпрди рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реАрдзреЗ рдЙрди рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рд╡реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЧрд╛рд░рдВрдЯреАрдХреГрдд рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдЧреНрд░рд╣рдг рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ pick
рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЗрди рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рднреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдЪреАрдЬрд╝ рдЬреЛрдбрд╝рдирд╛ рдЙрдЪрд┐рдд рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред
@jimmyfrasche type T switch {io.Reader,io.Writer}
рд▓рд┐рдП рдЯреА рдХреЛ рд░реАрдбрд╡рд╛рдЗрдЯрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯреА рдПрдХ io.Reader рдпрд╛ Io.Writer рд╣реИ, рдЖрдкрдХреЛ io.Reader рдпрд╛ io.Writer рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рджрд╛рд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдПрдХ рд░реАрдбрд╡рд╛рдЗрдЯрд░, рдЬреЛ рдЗрд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рджрд╛рд╡рд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рд╕реНрд╡рд┐рдЪрдЯрд╛рдЗрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
@stevenblenkinsop рдЖрдк рдмрд┐рдирд╛ рддрд░реАрдХреЛрдВ рдХреЗ рдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдирд┐рд╣рд┐рдд рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐рдпрд╛рдВ рдФрд░, рдмрд╣реБрдд рдХрдо рдбрд┐рдЧреНрд░реА рдирд┐рд╣рд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо, рд╡рд╣рд╛рдВ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╡реНрдпрд╛рдкрд╛рд░ рд╣реИрдВ)ред
рдФрд░, рджреВрд╕рд░реА рдУрд░, @ianlancetaylor рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛
type IR interface {
Foo()
Bar()
} restrict { A, B, C }
рдЬреЛ рддрдм рддрдХ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛ рдЬрдм рддрдХ A
, B
, рдФрд░ C
рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ Foo
рдФрд░ Bar
рддрд░реАрдХреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЛ рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рд╣реЛрдЧреА рд▓рдЧрднрдЧ nil
рдорд╛рди)ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрдЯреИрд▓рд┐рдХ рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ _рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕_ рдХрд╛ рдХреБрдЫ рд░реВрдк рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред рдпрд╣рд╛рдБ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдБред рдпрд╣ рдПрдХ рдмреАрдЬрдЧрдгрд┐рддреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрди рдбреЛрдореЗрди-рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
//MyGroup can be any of these. It can contain other groups, interfaces, structs, or primitive types
type MyGroup group {
MyOtherGroup
MyInterface
MyStruct
int
string
//..possibly some other types as well
}
//type definitions..
type MyInterface interface{}
type MyStruct struct{}
//etc..
func DoWork(item MyGroup) {
switch t:=item.(type) {
//do work here..
}
}
рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ interface{}
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рд▓рд╛рдн рд╣реИрдВ:
рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ interface{}
рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрдЬреНрдЮрд╛рдд рд╣реЛред рд░рдирдЯрд╛рдЗрдо рд╕рддреНрдпрд╛рдкрди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЬрдм рд╕рдВрдХрд▓рди рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рдФрд░ рдЬреНрдЮрд╛рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП?
@henryas рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рддреБрд▓рдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ (рдЦреБрд▓реЗ) рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛: рдЧреИрд░-рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ (рдпрджрд┐ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рд╕реНрдЯрд┐рд▓реНрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЕрдирдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб рдорд╛рд░реНрдХрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЗ рддрд░реНрдХ рдЙрд╕ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред
рдЧреЛ рдкреНрд░реЛрдЯреЛрдмрдлреНрд╕ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдпрд╣рд╛рдВ рджреА рдЧрдИ рд╣реИ:
рдкреНрд░реЛрдЯреЛ 2 рд╕рд┐рдВрдЯреИрдХреНрд╕ "рд╡реИрдХрд▓реНрдкрд┐рдХ" рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╢реВрдиреНрдп рдорд╛рди рдФрд░ рдПрдХ рдЕрдирд╕реЗрдЯ рдорд╛рди рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, *int
), рдЬрд╣рд╛рдВ рдПрдХ рд╢реВрдиреНрдп рдкреЙрдЗрдВрдЯрд░ рдЕрдирд╕реЗрдЯ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рд╕реЗрдЯ рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрдЪреНрдЫрд╛ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рдФрд░ рдЕрдирд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд┐рдП рдмрд┐рдирд╛ (рдЬрд╣рд╛рдВ рд╢реВрдиреНрдп рдорд╛рди рдареАрдХ рд╣реИ рддреЛ рдареАрдХ рд╣реИ)ред
рдкреНрд░реЛрдЯреЛ рднрд╛рд╖рд╛ "рдПрдХ рдХреЗ рд▓рд┐рдП" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрдЯреЛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ ( рд╕рдХрд▓ рдЙрджрд╛рд╣рд░рдг ):
type Communique_Union interface { isCommunique_Union() }
)type Communique_Number struct { Number int32 }
) рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ isCommunique_Union
рд╡рд┐рдзрд┐ рд╣реИред@henryas рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рддреБрд▓рдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ (рдЦреБрд▓реЗ) рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛: рдЧреИрд░-рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ (рдпрджрд┐ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рд╕реНрдЯрд┐рд▓реНрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЕрдирдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб рдорд╛рд░реНрдХрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЗ рддрд░реНрдХ рдЙрд╕ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдкрдХрд╛ рдорддрд▓рдм рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдбрдореА рдЕрдирдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб рдореЗрдердб рдЬреЛрдбрд╝рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ?
type MyInterface interface {
belongToMyInterface() //dummy method definition
}
type MyObject struct{}
func (MyObject) belongToMyInterface(){} //dummy method
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрдЬрд╛рдп рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд░рд╣ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЦрд╛рд▓реА рддрд░реАрдХреЛрдВ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
_dummy method_ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
interface{}
рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рднреА рдмрджрддрд░ рд╣реИред рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрдкрд▓рдмреНрдз рд╣реИрдВред@ рд╣реЗрдирд░реАрд╕
рдореИрдВ рдЖрдкрдХреЗ рддреАрд╕рд░реЗ рдмрд┐рдВрджреБ рдХреЛ рдПрдХ рдордЬрдмреВрдд рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдпрджрд┐ рд▓реЗрдЦрд╛рдХрд╛рд░ рд╡рд╕реНрддреБ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рд▓реЗрдЦрд╛рдХрд╛рд░ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдирд┐рдЬреА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдХрд╣реАрдВ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИрдВред
рдЧреЛ рдкрд╛рд░реНрд╕рд░ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдореИрдВ рдЙрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдЗрддрдирд╛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред
@as рдореЗрд░рд╛ рдХрд╣рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ _рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рд╡реНрдпреВ_ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрд╡рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдареЛрд╕ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдХреНрд╕рд░ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рдбреЛрдореЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╡рд╕реНрддреБрдПрдВ рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдирд┐рдХрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдпрд╛ рдПрдХ рд╣реА рдбреЛрдореЗрди рдХреЗ рднреАрддрд░ рд░рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЧреЛ рдкрд╛рд░реНрд╕рд░ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЬреНрдпрд╛рджрд╛ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдИ рдЕрдиреНрдп рдбреЛрдореЗрди рджреНрд╡рд╛рд░рд╛ рдЙрдкрднреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рдЬрд╛рддреА рд╣реИред рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдм рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _dummy method_ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕рднреА рдбреЛрдореЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдЖрдк рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЬреБрдбрд╝реА рдХрдИ рдЦрд╛рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрди рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рд╡реЗ рдПрдХ рдЕрд▓рдЧ рдбреЛрдореЗрди/рдкреИрдХреЗрдЬ/рдкрд░рдд рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред
рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдУрдкрди-рд╕рдо-рдереНрд░реВ-рдЗрдВрдЯрд░рдлреЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд░рдХрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рдЙрдЪрд┐рдд рд╣реИред рд╕реНрдкрд╖реНрдЯ рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рдХрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдВрдЧреЗред рдпрд╣ "рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд╛ рджреЗрддрд╛ рд╣реИ" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЕрд▓рдЧ рддрд░реНрдХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ - рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЖрдЬ рднреА рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдЕрднреА рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдмрдВрдж рд░рдХрдо рдХреЗ рджреЛ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рджреЗрдЦрддрд╛ рд╣реВрдВ: рдПрдХ, рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╡рд┐рддрд░рд┐рдд рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдХрдард┐рдирд╛рдИред рдФрд░ рджреВрд╕рд░рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╢рдХреНрддрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо - рдЬрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо, рдореИрдВ рдПрдХ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рднрд╛рд╖рд╛ (рдЬреИрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдпрд╛ рд░рд╕реНрдЯ) рдореЗрдВ рдЬрд╛рддрд╛ рд╣реВрдВред
рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рджреВрд╕рд░рд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд░реАрдпрддрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ, рддреЛ рдХреНрдпрд╛ рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдХреЛ рдЕрдкрд╕рд╛рдЗрдб рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд╕рдВрдж рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдмрд╕ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЖрдк рдмрдВрдж рд░рд╛рд╢рд┐ рдХреЗ рдмрд┐рдирд╛ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдХрдо рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЪ рдирд╣реАрдВ рд╣реИ :)
[1] рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рдВрднрд╡ рд╣реИ , рдЬреИрд╕реЗ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
type Node interface {
node()
}
type Foo struct {
bar.Baz
}
func (foo) node() {}
@рдореЗрд░реЛрд╡рд┐рдпрд╕
рдореИрдВ рдЖрдкрдХреЗ рджреВрд╕рд░реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдореА рдХреЛрдбрд┐рдВрдЧ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛ рд░рд╣реА рд╣реИред рдмреЗрд╢рдХ, рд▓реЛрдЧ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рддрд░реНрдХ рдХреА рдореВрд░реНрдЦрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдЕрднреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рд╣реИ, рддреЛ рдПрдХ рдмрдбрд╝реА рдЦрд╛рдореА рд╣реИред рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЖрдк рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдЙрдЪрд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде, рдкреНрд░рдХрд╛рд░ рдиреЗ рд╕реНрд╡рдпрдВ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рдЖрдкрдХреЗ рджреВрд╕рд░реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред
рдХреНрдпрд╛ рдЖрдк "рд╕рдо рдкреНрд░рдХрд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВ" рдХрдерди рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИрдВ, рдпрд╛ рдЖрдк рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИрдВ (рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрд╕реА рдХрд╛ рдПрдХ рдкреБрди: рджрд╛рд╡рд╛ рд╣реИ) рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВрдиреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдКрдкрд░ рд╡рд░реАрдпрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреИрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдореА рдХреЛрдбрд┐рдВрдЧ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛ рд░рд╣реА рд╣реИред рдмреЗрд╢рдХ, рд▓реЛрдЧ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЪреВрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рддрд░реНрдХ рдХреА рдореВрд░реНрдЦрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░, рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реНрд╡реЗрдд-рд╢реНрдпрд╛рдо рддрд░реНрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рджрд░реНрдж рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рджрд░реНрдж рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ - рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рджрд░реНрдж рдХрд╛ рдХрд╛рд░рдг рднреА
рдЪрд░реНрдЪрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдПрдХ рдкрд╛рдпрдерди-рдПрд╕реНрдХ рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо (рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ) рдпрд╛ рдПрдХ рдХреЙрдХ-рдПрд╕реНрдХ рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо (рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП рд╢реБрджреНрдзрддрд╛ рдкреНрд░рдорд╛рдг) рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЪрд░реНрдЪрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП "рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдЙрдирдХреЗ рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдХрд░реЗрдВ" рдФрд░ рдпрд╣ рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╣реИред
рдПрдлрдЯреАрдЖрд░, рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдлрд┐рд░ рд╕реЗ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЦреБрд▓реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ (рдпрд╛рдиреА рдкреНрд░рддреНрдпреЗрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирд┐рд╣рд┐рдд рдпрд╛ рд╕реНрдкрд╖реНрдЯ "рдХреБрдЫ рдФрд░" -рдХреЗрд╕ рд╣реЛрддрд╛ рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрдХрдиреАрдХреА рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ рдЙрдиреНрд╣реЗрдВ (рдЬреНрдпрд╛рджрд╛рддрд░ рдпрд╣ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ) рдЬрдмрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрдХрдиреАрдХреА рдЕрдкрд╕рд╛рдЗрдб рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ (рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдЖрдк рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВтАж)ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЦреБрд▓реА рд░рдХрдо a) рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрддреЛрд╖рдЬрдирдХ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рджрдмрд╛рд╡ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ b) рд╢рд╛рдпрдж рдЧреЛ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдкрд░реНрдпрд╛рдкреНрдд рд▓рд╛рдн рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдпрд╛ рджреЛрдиреЛрдВ рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдЧрд▓рдд рд╕рд╛рдмрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ :)
рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓:
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ
рдореИрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИ: рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдПрдВ/рдПрд╕реНрдЯред рдФрд░ рд╡рд╣рд╛рдВ рднреА, рдкреИрдХреЗрдЬ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдареАрдХ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдВрджрд░реНрдн рдмрд┐рдВрджреБ рд╕реЗ, "рдмрд╣реБрддрд╛рдпрдд" рдФрд░ "рдмреЗрд╣рдж" рд╢рдмреНрдж рдЕрддрд┐рд░рдВрдЬрдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡реИрдз рд╕реНрдерд╛рдиреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред
database/sql/driver.Value
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ #23077 рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
https://godoc.corp.google.com/pkg/database/sql/driver#Value
рд╣рд╛рд▓рд╛рдВрдХрд┐, database/sql.Rows.Scan
рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдХрдореА рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕реНрдХреИрди рдЙрди рдорд╛рдиреЛрдВ рдореЗрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, int
; рдЕрдкрдиреЗ рдЧрдВрддрд╡реНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
https://godoc.corp.google.com/pkg/database/sql#Rows.Scan
@рдореЗрд░реЛрд╡рд┐рдпрд╕
рдореИрдВ рдЦреБрд▓реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд░реЛрдз рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ (рдЕрд░реНрдерд╛рдд рдкреНрд░рддреНрдпреЗрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдирд┐рд╣рд┐рдд рдпрд╛ рд╕реНрдкрд╖реНрдЯ "рд╕рдордерд┐рдВрдЧ рдПрд▓реНрд╕" -рдХреЗрд╕ рд╣реЛрддрд╛ рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрдХрдиреАрдХреА рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ (рдЬреНрдпрд╛рджрд╛рддрд░ рдпрд╣ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ)
рдХрдо рд╕реЗ рдХрдо рджреЛ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдмрдВрдж рд░рдХрдо рдХреА "рдХрдард┐рди рд╡рд┐рдХрд╕рд┐рдд" рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдорд┐рд▓рд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЛрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВред рдлрд┐рд░, рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХреЛ рдпреЛрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╣рд▓реЗ рдЙрд╕рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдирдП рд╕рджрд╕реНрдп рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╕рджрд╕реНрдп рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рджреВрд╕рд░рд╛ "рдЕрд╕рдВрднрд╡" рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ: рдпрд╛рдиреА, рдРрд╕реЗ рд╕рджрд╕реНрдп рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдЪреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХреЛ рдпреЛрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╣рд▓реЗ рдЗрд╕реЗ рдПрдХ рдЕрд╕рдВрднрд╡ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдирдП рд╕рджрд╕реНрдп рдХреЛ рд╕рдВрднрд╡ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рддреЗ рд╣реИрдВред
database/sql/driver.Value
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рд╣рдордд, рдЙрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ред рдзрдиреНрдпрд╡рд╛рдж :)
рдПрдХ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдорд┐рд▓рд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЛрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВред рдлрд┐рд░, рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХреЛ рдпреЛрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╣рд▓реЗ рдЙрд╕рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдирдП рд╕рджрд╕реНрдп рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╕рджрд╕реНрдп рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рдзрд╛рдиред
@Merovius рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрдирдВрдд-рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкрд░рд┐рд╡рд╛рд░ рд╣реИред рд╕рднреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░, рдЕрдирдВрдд рдпрд╛ рдЕрдиреНрдпрдерд╛, рдПрдХ default:
рдорд╛рдорд▓рд╛ рд╣реИред рдкрд░рд┐рдорд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, default:
рдЕрд░реНрде рд╣реИ рдпрд╛ рддреЛ рдПрдХ рд╡реИрдз рдорд╛рдорд▓рд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ рдпрд╛ рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХрд╣реАрдВ рдПрдХ рдмрдЧ рд╣реИ - рд╕реАрдорд┐рдд рд░рдХрдо рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЗрд╡рд▓ рдкреВрд░реНрд╡ рд╣реИ рдФрд░ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдХрднреА рдирд╣реАрдВред
json.Token рдФрд░ sql.Null* рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред go/types рдЙрд╕реА рддрд░рд╣ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ рдЬреИрд╕реЗ go/ast рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдРрд╕реЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдбреЛрдореЗрди рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдХреЗ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдирд▓рд╕рд╛рдЬреА рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧ рднреА рд╣реЛрддреЗ рд╣реИрдВред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЧреЛ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рдХреНрддрд┐ рджреЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВред рдЧреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдФрд░ рд▓рдЪреАрд▓рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ Go2 рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЙрддрдиреА рд╢рдХреНрддрд┐ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реА рд╣реИ рдЬрд┐рддрдиреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реИтАФрдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЙрд╕рдХрд╛ 80-90% рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреЗрдирд░рд┐рдХ рднреА рдЖрдкрдХреЛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдирдпрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдВрдЧреЗ: рдпрд╣ рдЖрдкрдХреЛ рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рджреЗрдЧрд╛ рдЬреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд, рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ, рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмреЗрд╣рддрд░ рдЯреВрд▓реАрдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВ, рдЖрдИрдПрдордУ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдпрд╛ рдЕрдиреНрдп рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ (рдФрд░ рд╡реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ))ред
рдпрджрд┐ рдЖрдк рд╕рдо-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдкрд░ рдПрдХ рдмрд╛рд╣рд░реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рд╕рднреА рдорд╛рдорд▓реЛрдВ + рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЛ рдердХрд╛рд╡рдЯ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд▓рд┐рдВрдЯрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ) рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпреЛрдЧ рдореЗрдВ рдПрдХ рдорд╛рдорд▓рд╛ рдЬреЛрдбрд╝рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИ (рдФрд░ рдЙрддрдирд╛ рд╣реА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ) ) рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВред
json.Token рдФрд░ sql.Null* рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
рдЯреЛрдХрди - рдЬрд╝рд░реВрд░ред рдПрдПрд╕рдЯреА-рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг (рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд╛рд░реНрд╕рд░ рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ)ред
рдореБрдЭреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд▓рд┐рдП рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдирд▓ *, рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ (рдпрд╛ рдХреБрдЫ "рдЬрд╛рджреБрдИ" рдЬреЗрдиреЗрд░рд┐рдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрд┐рд▓рд┐рди рдЬреЛрдбрд╝рдиреЗ рд╕реЗ), рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ type NullBool enum { Invalid struct{}; Value Int }
рдФрд░ type NullBool struct { Valid bool; Value Int }
рдмреАрдЪ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд╕рдо-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдкрд░ рдПрдХ рдмрд╛рд╣рд░реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рд╕рднреА рдорд╛рдорд▓реЛрдВ + рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ) рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЛ рдердХрд╛рд╡рдЯ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд▓рд┐рдВрдЯрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ) рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпреЛрдЧ рдореЗрдВ рдПрдХ рдорд╛рдорд▓рд╛ рдЬреЛрдбрд╝рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИ (рдФрд░ рдЙрддрдирд╛ рд╣реА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ) ) рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВред
рдКрдкрд░ рджреЗрдЦреЛред рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЦреБрд▓реА рд░рдХрдо рдХрд╣рддрд╛ рд╣реВрдВ, рдореИрдВ рдЙрдирдХрд╛ рдХрдо рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВред
рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЦреБрд▓реА рд░рдХрдо рдХрд╣рддрд╛ рд╣реВрдВ, рдореИрдВ рдЙрдирдХрд╛ рдХрдо рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВред
рдореЗрд░рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ https://github.com/golang/go/issues/19412#issuecomment -323208336 рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдЦреБрд▓реЗрдкрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рдореЛрдЯрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЕрднреА рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИ рд╣рдЯрд╛рдУ рдФрд░ рдкреЙрд▓рд┐рд╢ рдХрд░реЛред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓рд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдерд╛, рднрд▓реЗ рд╣реА рд╕рднреА рдорд╛рдорд▓реЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред
рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рддреНрдпрд╛рд░реЗ рдРрдк рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬреЗрдиреЗрд░рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ a
type Nullable(T) pick { // or whatever syntax (on all counts)
Null struct{}
Value T
}
рдПрдХ рдмрд╛рд░ рдФрд░ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рднреА рдмрддрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрддреНрдкрд╛рдж (рд╕рдВрд░рдЪрдирд╛) рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Valid = false, Value != 0 рдХреА рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рд╣реИред рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдЗрд╕реЗ рд░реВрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ 2 T рдЫреЛрдЯрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ 1 + T рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рди рд╣реЛред
рдмреЗрд╢рдХ рдЕрдЧрд░ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╛рдорд▓реЛрдВ рдФрд░ рдХрдИ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдЖрд╡рд┐рд╖реНрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдпреЛрдЧ рдерд╛, рддреЛ рдЧрд▓рддреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рдХреНрд╖рд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рд╛рде рднреА рдЧрд▓рддреА рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рдЪреАрдЬреЛрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрд╛рд▓ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИ рдЦреАрдВрдЪрдирд╛ред
рдЯреЛрдХрди - рдЬрд╝рд░реВрд░ред рдПрдПрд╕рдЯреА-рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг (рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд╛рд░реНрд╕рд░ рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ)ред
рдореИрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдХреБрдЫ рдЗрдирдкреБрдЯ рд▓реЗрддреЗ рд╣реИрдВ, рдХреБрдЫ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд╛рд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдХрднреА рднреА рдХрд░реАрдм рдЖрддреЗ рд╣реИрдВред рд╡рд╛рдВрдЫрд┐рдд рдЖрдЙрдЯрдкреБрдЯред рдореИрдВ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ (рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдореИрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ!) рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдПрд╕рдЯреА-рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓рддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ-рдЦрд╛рд╕рдХрд░ рдЬрдм рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдЬреАрдм рд╣реЛрддреЗ рд╣реИрдВ рдореЗрд░реЗ рдЫреЛрдЯреЗ рд╕реЗ рд╕рд┐рд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдФрд░ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗред
рдЬрдм рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдПрдкреАрдЖрдИ рдореЗрдВ рдЕрдХреНрд╕рд░ рдХреБрдЫ рдИрдЯреАрдПрд▓ рдХрд░рдиреЗ рдпрд╛ рдХреБрдЫ рдХрд╛рд▓реНрдкрдирд┐рдХ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдпрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдПрдХреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╡рд╛рдИ рд╣реЛрддреА рд╣реИ рдпрджрд┐ рд╡реЗ рдЬреЗрдб рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдРрд╕реЗ рд╕реНрдерд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреА, рднрд▓реЗ рд╣реА рдпрд╣ 10 рдорд┐рдирдЯ рдХреЗ рдбрд┐рдмрдЧ рдХреЛ 1 рд╕реЗрдХрдВрдб рддрдХ рдХрдо рдХрд░ рджреЗ "рдУрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ"ред
рдЧреЛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЬрдЧрд╣ рдЬрд╣рд╛рдВ рдореИрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЪреИрдирд▓реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдкрд░ рдЪрдпрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЧреЛрд░рдЖрдЙрдЯрд┐рди рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдПрдХ рдЧреЛрд░реМрдЯрд╛рдЗрди рдХреЛ 3 рдЪрд╛рди рдФрд░ рджреВрд╕рд░реЗ рдХреЛ 2 рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдореБрдЭреЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ chan pick { a A; b B; c C }
рд╕реЗ рдЕрдзрд┐рдХ chan A
, chan B
, chan C
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ chan stuct { kind MsgKind; a A; b B; c C }
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рдХрдо рд╕рддреНрдпрд╛рдкрди рдХреА рдХреАрдордд рдкрд░ рдЪреБрдЯрдХреА рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВред
рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдореМрдЬреВрджрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░ рд╕реВрдЪреА рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
func main() {
if FlipCoin() == false {
printCertainTypes(FlipCoin(), int(5))
} else {
printCertainTypes(FlipCoin(), string("5"))
}
}
// this function compiles with main
func printCertainTypes(flip bool, in interface{}) {
if flip == false {
switch v := in.(type) {
case int:
fmt.Printf(тАЬinteger %v\nтАЭ, v)
default:
fmt.Println(v)
}
} else {
switch v := in.(type) {
case int:
fmt.Printf(тАЬinteger %v\nтАЭ, v)
case string:
fmt.Printf(тАЬstring %v\nтАЭ, v)
}
}
}
// this function compiles with main
func printCertainTypes(flip bool, in interface{}) {
switch v := in.(type) {
case int:
fmt.Printf(тАЬinteger %v\nтАЭ, v)
case bool:
fmt.Printf(тАЬbool %v\nтАЭ, v)
}
fmt.Println(flip)
switch v := in.(type) {
case string:
fmt.Printf(тАЬstring %v\nтАЭ, v)
case bool:
fmt.Printf(тАЬbool 2 %v\nтАЭ, v)
}
}
// this function emits a type switch not complete error when compiled with main
func printCertainTypes(flip bool, in interface{}) {
if flip == false {
switch v := in.(type) {
case int:
fmt.Printf(тАЬinteger %v\nтАЭ, v)
case bool:
fmt.Printf(тАЬbool %v\nтАЭ, v)
}
} else {
switch v := in.(type) {
case string:
fmt.Printf(тАЬstring %v\nтАЭ, v)
case bool:
fmt.Printf(тАЬbool %v\nтАЭ, v)
}
}
}
// this function emits a type switch not complete error when compiled with main
func printCertainTypes(flip bool, in interface{}) {
fmt.Println(flip)
switch v := in.(type) {
case int:
fmt.Printf(тАЬinteger %v\nтАЭ, v)
case bool:
fmt.Printf(тАЬbool %v\nтАЭ, v)
}
}
рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдореЗрдВ, рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдирдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХрд╛ рд╡рдЬрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рддреЛ рдпрд╣ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд░реЗрдЦрд╛ рджреЗрддрд╛ рд╣реИред
рдорд╛рдирдХ рд╕рд╛рдзрди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд, рдХреБрдЫ рднреА рди рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╣реИред
рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпреЛрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЗрд╕ рдЯреИрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЙрди рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╣реИрдВ, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
type Sum interface { sum() }
type sum struct{}
func (sum) sum() {}
рдФрд░ рдмрд╕ рдЙрд╕ 0-рдЪреМрдбрд╝рд╛рдИ рд╡рд╛рд▓реЗ рдЯреИрдЧ рдХреЛ рд╣рдорд╛рд░реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВред
рд╣рдо рдПрдХ рд░реИрдкрд░ рдкреЗрд╢ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдпреЛрдЧ рдореЗрдВ рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
type External struct {
sum
*pkg.SomeType
}
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЯрдкрдЯрд╛ рд╣реИред
рдпрджрд┐ рдпреЛрдЧ рдореЗрдВ рд╕рднреА рд╕рджрд╕реНрдп рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣ рдХреА рд░рдЪрдирд╛рдПрдБ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдпреЛрдЧ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рдиреЗ рджреЗрддрд╛ рдХрд┐ рдЙрд╕ рдпреЛрдЧ рдореЗрдВ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп nil
рдорд╛рдорд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕реА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ
import "p"
var member struct {
p.Sum
}
рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░ рд╣рдореЗрдВ рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрд╡реИрдз рд╣реИрдВред
рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ func рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдпреЛрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ valid() error
рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рдХреА рд╣реИ
func valid(s Sum) error {
switch s.(type) {
case nil:
return errors.New("pkg: Sum must be non-nil")
case A, B, C, ...: // listing each valid member
return s.valid()
}
return fmt.Errorf("pkg: %T is not a valid member of Sum")
}
рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рд╡реИрдз рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреБрдЫ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ
type alwaysValid struct{}
func (alwaysValid) valid() error { return nil }
рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрдо рд╢рд┐рдХрд╛рдпрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЧреЛрдбреЛрдХ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ: рдбрдореА рд╡рд┐рдзрд┐ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВред
рдХреЗ рдмрдЬрд╛рдП,
//A Node is one of (list of types).
type Node interface { node() }
рд▓рд┐рдЦреЛ
//A Node is only valid if it is defined in this package.
type Node interface {
//Node is a dummy method that signifies that a type is a Node.
Node()
}
рд╣рдо рдХрд┐рд╕реА рдХреЛ рднреА Node
рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдпрд╣ рднреА рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдкреНрд░рдХрд╛рд░ Node
(рдХреЛрдИ рдХреЗрдВрджреНрд░реАрдп рд╕реВрдЪреА рдирд╣реАрдВ) рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдЖрдк рдЬрд┐рд╕ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ Node
рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдпрд╣ рдкреИрдЯрд░реНрди рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдпреЛрдЧ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╣рд╛рд░рд╛ interface{}
рд╡рд╛рдкрд╕ рдЧрд┐рд░рдирд╛ рд╣реИ, рдЬреИрд╕реЗ json.Token
рдпрд╛ driver.Value
ред рд╣рдо рдкрд┐рдЫрд▓реЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рдереЗ рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдпрд╣ interface{}
рдЬрд┐рддрдирд╛ рдХрд╣рддрд╛ рд╣реИ,
//Sum is one of int64, float64, or bool.
type Sum interface{}
func New(v interface{}) (Sum, error) {
switch v.(type) {
case nil:
return errors.New("pkg: Sum must be non-nil")
case int64, float64, bool:
return v
}
return fmt.Printf("pkg: %T is not a valid member of Sum")
}
рд░рдХрдо рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ "рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ" рдФрд░ "рдПрдХ рдорд╛рди рдЬреЛ рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред
*T
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк nil
рд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рдорд╛рди рдирд╣реАрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ (рд╕рдВрднрд╡рддрдГ) рд╢реВрдиреНрдп рдорд╛рди рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рд╕реВрдЪрдХ рдХреЛ рдбреАрд░реЗрдлрд╝реЗрдВрд╕ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред
рдкрд┐рдЫрд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдорд╛рдиреЛрдВ рдХреА рддрд░рд╣, рдФрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реВрдЪрдХ рд╡рд┐рдЪрд▓рди рдФрд░ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдвреЗрд░ рдЖрд╡рдВрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ sql рдкреИрдХреЗрдЬ рд╕реЗ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
type OptionalT struct {
Valid bool
Value T
}
рдЗрд╕рдХрд╛ рдкреНрд░рдореБрдЦ рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдорд╛рдиреНрдп рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдорд╛рди рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡реИрд▓рд┐рдб рдХреЗ рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рд╡реИрд▓реНрдпреВ рдХреЛ рд╣рдерд┐рдпрд╛рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рд╢реВрдиреНрдп рдЯреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рдорд╛рди рдХреЛ рд╢реВрдиреНрдп рдХрд┐рдП рдмрд┐рдирд╛ рд╡реИрд▓рд┐рдб рдХреЛ рдЕрд╕рддреНрдп рдкрд░ рдХреИрдЬрд╝реБрдЕрд▓реА рд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╡реИрд▓рд┐рдб рдХреЛ рдЯреНрд░реВ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ (рдпрд╛ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛) рдмрд┐рдирд╛ рд╡реИрд▓реНрдпреВ рдмрддрд╛рдП рдкреВрд░реНрд╡ рдореЗрдВ рдЫреЛрдбрд╝реЗ рдЧрдП рдорд╛рди рдХреЛ рдЖрдХрд╕реНрдорд┐рдХ рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░реНрд╕ рдФрд░ рдЧреЗрдЯрд░реНрд╕ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкрд╣рдЪрд╛рди рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдореВрд▓реНрдп: рдЧрдгрдирд╛ред
рдЧреЛ рдореЗрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реИ const/iota:
type Enum int
const (
A Enum = iota
B
C
)
OptionalT
рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпреЛрдЧ рдХреА рддрд░рд╣, рдпрд╣ рдбреЛрдореЗрди рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдХреЗрд╡рд▓ рддреАрди рдорд╛рдиреНрдп рдорд╛рди рдФрд░ рдХрдИ рдЕрдорд╛рдиреНрдп рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдареАрдХ рджреЛ рдорд╛рди рд╣реИрдВ рддреЛ рд╣рдо рдмреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореМрд▓рд┐рдХ рд╕рдВрдЦреНрдпрд╛-рдиреЗрд╕ рдХрд╛ рдореБрджреНрджрд╛ рднреА рд╣реИред A+B == C
ред рд╣рдо рдЯрд╛рдЗрдк рди рдХрд┐рдП рдЧрдП рдЕрднрд┐рдиреНрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реЗ рдмрд╣реБрдд рд╕реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдЪрд╛рд╣реЗ рдХреБрдЫ рднреА рд╣реЛред рдереЛрдбрд╝реЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХреЗ рд╕рд╛рде, рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рдЪрд╛рди рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
type Enum struct { v int }
var (
A = Enum{0}
B = Enum{1}
C = Enum{2}
)
рдЕрдм рдпреЗ рдХреЗрд╡рд▓ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛рдПрдВ рд╣реИрдВред рдЙрдирдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд▓реЗрдХрд┐рди рдмрд╕ рдЗрддрдирд╛ рд╣реАред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрдм рд╣рдордиреЗ рдХреЙрдиреНрд╕реНрдЯ-рдиреЗрд╕ рдЦреЛ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рдХрд╛рдо рдХрд░рдХреЗ рд╡рд╛рдкрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
func A() Enum { return Enum{0} }
func B() Enum { return Enum{1} }
func C() Enum { return Enum{2} }
рд╣рдордиреЗ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдФрд░ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдХреАрдордд рдкрд░ рдирд╛рдо рдмрджрд▓рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓реА рд╣реИ рдЬреЛ рдЕрддреНрдпрдзрд┐рдХ рдЗрдирд▓рд╛рдЗрди-рд╕рдХреНрд╖рдо рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпреЛрдЧ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдмрд╛рд╣рд░реА рдХреЛрдб рдХреЗрд╡рд▓ A()
, B()
, рдпрд╛ C()
ред рд╡реЗ var рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ рд▓реЗрдмрд▓ рдХреЛ рд╕реНрд╡реИрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ A() + B()
рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо Enum
рдкрд░ рдЬреЛ рднреА рддрд░реАрдХреЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рдореЗрдВ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдореВрд▓реНрдп рдмрдирд╛рдиреЗ рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд╣рд▓рд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдпрд╣ рдорд╛рдиреНрдп рд╣реИ .
рдХрднреА-рдХрднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рд▓реЗрдмрд▓ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд┐рдерд┐ рд╣реЛрддреА рд╣реИ рдФрд░ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░рд╣ рдХрд╛ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдорд╛рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддреАрди рдмреЗрдХрд╛рд░ рд░рд╛рдЬреНрдп (рдП, рдмреА, рд╕реА), рджреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди (рдбреА, рдИ) рдХреЗ рд╕рд╛рде рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдФрд░ рдПрдХ рдЗрдВрдЯ рд╡реИрд▓реНрдпреВ (рдПрдл) рд╣реИред рд╣рдо рдЙрдкрд░реЛрдХреНрдд рд░рдгрдиреАрддрд┐ рдХреЗ рдХрдИ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ
type Value struct {
Which int // could have consts for A, B, C, D, E, F
String string
Int int
}
рдпрд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП OptionalT
рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмреВрд▓ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреА рдПрдХ рдЧрдгрдирд╛ рд╣реИ рдФрд░ рдРрд╕реЗ рдХрдИ рдлрд╝реАрд▓реНрдб рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ Which
рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЗрдЯ (рдпрд╛ рдирд╣реАрдВ) рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпреЗ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ (рдпрд╛ рдирд╣реАрдВ) рд╣реИрдВред
рдЧреЛ рдореЗрдВ "рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдПрдХ" рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдХреБрдЫ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рджреЗрдЦрднрд╛рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ рд░рдирдЯрд╛рдЗрдо рдпрд╛ рдмрд╛рд╣рд░реА рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ "рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ" рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡реЗ рд╕рднреА рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд┐рдореНрдпреБрд▓реЗрдЯреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП "рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ" рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдпрд╛ рдЧреЛ/рдкреНрд░рдХрд╛рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЙрдиреНрд╣реЗрдВред рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рджреЛрдиреЛрдВ рдХреЛ рдпреЛрдЧ рдХреЗ рд╕рд╣реА рд╕реНрд╡рд╛рдж рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдпрд╣реА рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА "рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ" рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд┐рдирд╛ рд╡реИрдз рдХреЛрдб рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВред
рдпрджрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмреЗрд╣рддрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдЯреВрд▓рд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╕рдВрдХрд▓рдХ рдХрдИ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╡рд╣ рдЙрд╕ "рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ" рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рдерд╛ред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рддреБрдЪреНрдЫ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рдмрдЬрд╛рдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдорд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рдбреЛрдореЗрди рдореЗрдВ рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреА рд░рдЪрдирд╛рдПрдБ рдорд╛рди рд▓реЗрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдпреЛрдЧ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рдиреЗ рджреЗрддрд╛ рдХрд┐ рдЙрд╕ рдпреЛрдЧ рдореЗрдВ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реВрдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдХ рд╣реА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ
[тАж]
рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░ рд╣рдореЗрдВ рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрд╡реИрдз рд╣реИрдВред
рдХреНрдпреЛрдВ? рдПрдХ рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдореБрдЭреЗ "рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛" рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдордЬрдмреВрддреА рд╕реЗ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рдПрдХ io.Reader
, рдЬрд┐рд╕рдХреА Read
рд╡рд┐рдзрд┐ рдЖрддрдВрдХрд┐рдд рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рд╕реЗ рдЙрдмрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдмрд╕ рдЗрд╕реЗ рдШрдмрд░рд╛рдиреЗ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕реА рддрд░рд╣, рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдШреЛрд╖рд┐рдд рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдорд╛рдиреНрдп рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рд╣рдЯ рдЬрд╛рддреЗ рд╣реИрдВ - рддреЛ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдмрд╣рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреМрди рд╣реВрдВ? рдпрд╛рдиреА рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ "рдореИрдВрдиреЗ рдПрдХ рдирдХрд▓реА рдмрдВрдж рд░рд╛рд╢рд┐ рдХреЛ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рд╣реИ" рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╢рд╛рдпрдж рд╣реА рдХрднреА (рдпрджрд┐ рдХрднреА рд╣реЛ) рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдЖрддреА рд╣реИред
рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ type Sum interface { sum() Sum }
рдмрджрд▓рдХрд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рд╕реНрд╡рдпрдВ рд╣реА рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЖрдк рдХреЗрд╡рд▓ sum()
рдХреА рд╡рд╛рдкрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рддрд╣рдд рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЖрдо рд╢рд┐рдХрд╛рдпрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЧреЛрдбреЛрдХ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред
рдЗрд╕рдХрд╛ рдкреНрд░рдореБрдЦ рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдорд╛рдиреНрдп рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдорд╛рди рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИред рд╢реВрдиреНрдп рдорд╛рди рдЬрд╛рджреБрдИ рдирд╣реАрдВ рд╣реИрдВред sql.NullInt64{false,0}
рдФрд░ NullInt64{false,42}
рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, IMOред рджреЛрдиреЛрдВ SQL NULL рдХреЗ рдорд╛рдиреНрдп рдФрд░ рд╕рдордХрдХреНрд╖ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИрдВред рдпрджрд┐ рд╕рднреА рдХреЛрдб Value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Valid рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдПрдХ рдирд┐рд╖реНрдкрдХреНрд╖ рдФрд░ рд╕рд╣реА рдЖрд▓реЛрдЪрдирд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕ рдЬрд╛рдВрдЪ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рд╢рд╛рдпрдж "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рд╡реИрдХрд▓реНрдкрд┐рдХ/рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛), рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдЧрд▓рддреА рд╕реЗ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд▓рддреА рд╕реЗ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдорд╛рдиреВрдВрдЧрд╛ (рд╕реВрдЪрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдШрдмрд░рд╛рдПрдВрдЧреЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬреЛрд░ рд╕реЗ рдЕрд╕рдлрд▓ рд╣реЛрдирд╛ - рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реИрд╕реЗ рднреА рдирдВрдЧреЗ рдкреЙрдЗрдВрдЯрд░-рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ nil
рдХреЛ "рдЕрдирд╕реЗрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореМрд▓рд┐рдХ рд╕рдВрдЦреНрдпрд╛-рдиреЗрд╕ рдХрд╛ рдореБрджреНрджрд╛ рднреА рд╣реИред A+B == C. рд╣рдо рдЯрд╛рдЗрдк рди рдХрд┐рдП рдЧрдП рдЕрднрд┐рдиреНрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЪрд┐рдВрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдИ рд╣реИ?
рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рддреБрдЪреНрдЫ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рдмрдЬрд╛рдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдорд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рдбреЛрдореЗрди рдореЗрдВ рд╣реИред
рдмрд╕ рдПрдлрдЯреАрдЖрд░, рдЬрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░-рдЬреИрд╕рд╛-рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ (рдпрд╛рдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реБрдирд╣рд░реЗ рдХрд┐рд╕реНрдо рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдврдВрдЧ рд╕реЗ рдореЙрдбрд▓рд┐рдВрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдореИрдВ рдХрднреА рднреА рдХреЛрдИ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдЬреИрд╕реЗ рдореИрдВ рд░рд┐рд╕реАрд╡рд░ рдпрд╛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╢реВрдиреНрдп-рдиреЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ (рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рд╡реИрдз рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛)ред рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рд╕рдВрдХрд▓рдХ рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдиреА "рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд╛рдкрд╕реА рдирд╣реАрдВ" рд╢реИрд▓реА рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ), рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рдШрдмрд░рд╛рддрд╛ рд╣реВрдВред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЧреЛ рдХреЛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдорд╛рдирддрд╛ рд╣реВрдВ, рдЬреЛ рди рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛-рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ "рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмреЗрд╣рддрд░ рд╣реИрдВ", рдмрд▓реНрдХрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдареАрдХ рд╣реИред
рдорд╛рдирдХ рд╕рд╛рдзрди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд, рдХреБрдЫ рднреА рди рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╣реИред
рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рд╣реИ (рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдирд╣реАрдВ рджреЗрдЦрд╛)ред рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рдореВрд▓реНрдп рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдЙрд╕реА рдкреИрдХреЗрдЬ рд╕реЗ рдЖ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рддрднреА рдЖрдк рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рджреВрд╕рд░реА рдУрд░, рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛:
func foo(val string|int|error) {
switch v:= val.(type) {
case string:
...
}
}
рд╕рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдкреВрд░реА рд╢рдХреНрддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдареЛрд╕ рд╣реИ, рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рдирд╣реАрдВ рд╣реИред
@рдореЗрд░реЛрд╡рд┐рдпрд╕
рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЗрди "рдЦреБрд▓реА рд░рдХрдо" рдореЗрдВ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдЙрдиреНрд╣реЗрдВ "рдлреАрдЪрд░ рд░реЗрдВрдЧрдирд╛" рдХреЗ рд▓рд┐рдП рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗред рдпрд╣реА рдХрд╛рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЗрди "рдЦреБрд▓реА рд░рдХрдо" рдореЗрдВ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдЙрдиреНрд╣реЗрдВ "рдлреАрдЪрд░ рд░реЗрдВрдЧрдирд╛" рдХреЗ рд▓рд┐рдП рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗред рдпрд╣реА рдХрд╛рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдордЬреЛрд░ рддрд░реНрдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ - рдпрджрд┐ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рддреЛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣реЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдЗрд░рд╛рджреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рд╣реИрдВ (рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд╣ рдкреИрдЯрд░реНрди рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ)ред
рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рд╣реИ (рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдирд╣реАрдВ рджреЗрдЦрд╛)ред рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рдореВрд▓реНрдп рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕реЗ рджреВрд╕рд░реА рдмрд╛рд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрднреА рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ? рд╡реЗ рдирд┐рдпрдорд┐рдд, рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ (рдЬрд╛рд╣рд┐рд░ рд╣реИ) рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдмрдВрдж рд░рдХрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕реЗ рджреВрд╕рд░реА рдмрд╛рд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрднреА рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ? рд╡реЗ рдирд┐рдпрдорд┐рдд, рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ (рдЬрд╛рд╣рд┐рд░ рд╣реИ) рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдмрдВрдж рд░рдХрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдбрдореА рд╡рд┐рдзрд┐ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХреЛрдИ рддреАрд╕рд░рд╛ рдкрдХреНрд╖ "рд╕рдо рдкреНрд░рдХрд╛рд░" рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдпрд╛ рдХрд╛рдлреА рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдкрд░рд┐рджреГрд╢реНрдп рдЬрд╣рд╛рдВ рдПрдХ рдЯреАрдо рдХрд╛ рд╕рджрд╕реНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЙрд╕реА рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрди рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдХреЛрдб рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдореЗрд░реЗ рд╕реНрдкрд╖реНрдЯ "рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд" рдХрдерди рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдкрд░: "рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ [рдпреЛрдЧ рдореВрд▓реНрдп] рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред" рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреМрди рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИред
@рдореЗрд░реЛрд╡рд┐рдпрд╕
рдмрд╕ рдПрдлрдЯреАрдЖрд░, рдЬрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░-рдЬреИрд╕рд╛-рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ (рдпрд╛рдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реБрдирд╣рд░реЗ рдХрд┐рд╕реНрдо рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдврдВрдЧ рд╕реЗ рдореЙрдбрд▓рд┐рдВрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдореИрдВ рдХрднреА рднреА рдХреЛрдИ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдЬреИрд╕реЗ рдореИрдВ рд░рд┐рд╕реАрд╡рд░ рдпрд╛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╢реВрдиреНрдп-рдиреЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ (рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рд╡реИрдз рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛)ред рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рд╕рдВрдХрд▓рдХ рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдиреА "рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд╛рдкрд╕реА рдирд╣реАрдВ" рд╢реИрд▓реА рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ), рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рдШрдмрд░рд╛рддрд╛ рд╣реВрдВред
рдореИрдВ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдпрд╛ рдХрднреА рдирд╣реАрдВ рдХреЗ рд░реВрдк рдореЗрдВ
рдЕрдЧрд░ рдХреЛрдИ рдЦрд░рд╛рдм рдЗрдирдкреБрдЯ рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рддреЛ рд╡рд╣ рддреБрд░рдВрдд рдлрдЯ рдЬрд╛рдПрдЧрд╛, рдореИрдВ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реВрдВред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЦрд░рд╛рдм рдЗрдирдкреБрдЯ рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЕрдВрддрддрдГ рдШрдмрд░рд╛рд╣рдЯ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛, рддреЛ рдореИрдВ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЦрд░рд╛рдм рдЗрдирдкреБрдЯ рдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдлрд╝реНрд▓реИрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдкрддрд╛ рди рдЪрд▓реЗ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╢реБрд░реВ рдХреА рдЧрдИ рдереА 150 рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рдлрд╝реНрд░реЗрдо рдЕрдк рдХрд░рддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдм рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рдФрд░ 150 рдлрд╝реНрд░реЗрдо рдКрдкрд░ рдЬрд╛рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЙрд╕ рдЦрд░рд╛рдм рдореВрд▓реНрдп рдХреЛ рдХрд╣рд╛рдБ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
рдмрд╛рдж рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдЖрдзреЗ рдШрдВрдЯреЗ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рдЖрдзрд╛ рдорд┐рдирдЯ рдЦрд░реНрдЪ рдХрд░рдирд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╣рд░ рд╕рдордп рдЧреВрдВрдЧрд╛ рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддрд╛ рд╣реВрдБ рдФрд░ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рдореИрдВ рд╕реНрдХреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдБ рдЙрддрдиреА рд╣реА рдЬрд▓реНрджреА рдореИрдВ рдЕрдЧрд▓реА рдЧреВрдВрдЧрд╛ рдЧрд▓рддреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддрд╛ рд╣реВрдБред
рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдлрдВрдХ рд╣реИ рдЬреЛ рдПрдХ рдкрд╛рдардХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ func рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ рдЬреЛ рдкрд╛рдардХ рдХреЛ рддрдм рддрдХ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдореИрдВ рдХрд░реВрдБрдЧрд╛ рдЗрд╕реЗ рд╢реВрдиреНрдп рдФрд░ рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ рдпрд╛ "рдкрд╛рдардХ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП" рдЬреИрд╕реА рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдВ рддрд╛рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рдХрд░реАрдм рд╣реЛред
рдЧреЛрдбреЛрдХ -рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ ^C рдХреЛ рд╣рд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдореЗрд░реЗ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдкрд░ 40 рдорд┐рдирдЯ рддрдХ рдЪрд▓рд╛ рдФрд░ рдЗрд╕реЗ рд╣рд░ рдмрд╛рд░ рдХрд┐рд╕реА рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ #20131 (рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рдХрд╛рдВрдЯрд╛ рдЧрдпрд╛ рд╣реИ!)
рдРрд╕рд╛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ
type Sum interface { sum() Sum }
рдмрджрд▓рдХрд░ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рд╕реНрд╡рдпрдВ рд╣реА рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЖрдк рдХреЗрд╡рд▓sum()
рдХреА рд╡рд╛рдкрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рддрд╣рдд рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореБрдЭреЗ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрдо рд╕рддреНрдпрд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ [рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ] рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЪрд┐рдВрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрдИ рд╣реИ?
рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдерд╛: рдореИрдВ рдЙрди рд╕рднреА рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХред рдореЗрд░рд╛ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдерд╛ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ "рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ" рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рдереЗ рдЬреЛ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдореЗрдВ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ [рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдХреЙрдиреНрд╕реНрдЯ/рдЖрдИрдУрдЯрд╛ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирдЯрд╛рдЗрдкреНрдб рдЗрдВрдЯреАрдЧреНрд░рд▓ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ] рдПрдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЪрд┐рдВрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрдИ рд╣реИ?
рд╡рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рджреЗрд░ рдирд╣реАрдВ рд▓рдЧреА рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдФрд░ рднреА рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рдЕрдЧрд░ рд╕рдВрдХрд▓рдХ рдиреЗ рдХрд╣рд╛ рдерд╛ "рд╡рд╣рд╛рдБ, рд╡рд╣ рдкрдВрдХреНрддрд┐ - рд╡рд╣ рдЧрд▓рдд рд╣реИ"ред рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рдмрд╛рдд рд╣реЛ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рд╣реЛрдВрдЧреЗред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИред рд╢реВрдиреНрдп рдорд╛рди рдЬрд╛рджреБрдИ рдирд╣реАрдВ рд╣реИрдВред рдЖрдИрдПрдордУ,
sql.NullInt64{false,0}
рдФрд░NullInt64{false,42}
рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рджреЛрдиреЛрдВ SQL NULL рдХреЗ рдорд╛рдиреНрдп рдФрд░ рд╕рдордХрдХреНрд╖ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИрдВред рдпрджрд┐ рд╕рднреА рдХреЛрдб Value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Valid рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдПрдХ рдирд┐рд╖реНрдкрдХреНрд╖ рдФрд░ рд╕рд╣реА рдЖрд▓реЛрдЪрдирд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕ рдЬрд╛рдВрдЪ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рд╢рд╛рдпрдж "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рд╡реИрдХрд▓реНрдкрд┐рдХ/рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛), рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдЧрд▓рддреА рд╕реЗ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд▓рддреА рд╕реЗ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдорд╛рдиреВрдВрдЧрд╛ (рд╕реВрдЪрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдШрдмрд░рд╛рдПрдВрдЧреЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬреЛрд░ рд╕реЗ рдЕрд╕рдлрд▓ рд╣реЛрдирд╛ - рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реИрд╕реЗ рднреА рдирдВрдЧреЗ рд╕реВрдЪрдХ-рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╢реВрдиреНрдп рдХреЛ "рдЕрдирд╕реЗрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рд╡рд╣ "рдпрджрд┐ рд╕рднреА рдХреЛрдб рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡реИрдз рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ" рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдмрдЧ рдлрд┐рд╕рд▓ рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕рдВрдХрд▓рдХ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА рдмрдЧ рд╣реИрдВ (рдпрджреНрдпрдкрд┐ рдЙрд╕ рдкреИрдЯрд░реНрди рдХреЗ рдмрдбрд╝реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдЬрд╣рд╛рдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдлрд╝реАрд▓реНрдб рдереЗ рдФрд░ рднреЗрджрднрд╛рд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рд░рд╛рдЬреНрдп рдереЗ)ред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ/рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЗрди рд╕рднреА рдХреЛ рдкрд╛рдпрд╛ рдФрд░ рдХреЛрдИ рднреА рдЬрдВрдЧрд▓ рдореЗрдВ рдирд╣реАрдВ рднрд╛рдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рд╡рд╣ рдЧрд▓рддреА рдХреА рдереА рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЕрддреАрдд рдлрд┐рд╕рд▓ рдЧрдпрд╛ рдерд╛ рдЕрдЧрд░ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдХреЛрдИ рдмрдЧ рдерд╛, рд╡реИрд╕реЗ рд╣реА рдпрд╣ рдореБрдЭреЗ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ int рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред
рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП *T
рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдЧреИрд░-рд╢реВрдиреНрдп рд▓рд╛рдЧрддреЗрдВ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ, рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдкреЗрд╕рдЯрд╛рдЗрдо рдФрд░ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рджреЛрдиреЛрдВ рдореЗрдВред
(рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдпрд╛ рд╕рд╣реА рд╢реВрдиреНрдп рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб v, _ := nullable.[Value]
рдЬреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред)
рдореИрдВ рдЬреЛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рд╣реИред рдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП,
рдЬрдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЙрдирдХрд╛ рдкрд╣рд▓рд╛ рд╢рдмреНрдж рдЬреАрд╕реА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рд╕реВрдЪрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдиреНрдпрдерд╛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рджрдВрдб рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЧрд╡рд╛рд░рд╛ рдирд╣реАрдВред рдореЗрд░реЗ рд▓рд┐рдП, рдкрд╛рд╕ 10:41 AM, "рдЬреЛрд╢ рдмреНрд▓реЗрдЪрд░ рд╕реНрдирд╛рдЗрдбрд░" <
рд╕реВрдЪрдирд╛рдПрдВ@github.com> рдиреЗ рд▓рд┐рдЦрд╛:
рдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдк рдПрдкреА рдпрд╛ *рдкреА рдЖрдкрдХреЛ рдФрд░ рдЕрдзрд┐рдХ рджреЗрдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ
рдореЗрдореЛрд░реА рдЯреНрд░реЗрдбрдСрдлрд╝ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдгред
рд╕реНрдХреЗрд▓рд░ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рджреВрд╕рд░рд╛ рд╢рдмреНрдж a . рд╣реИ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рдмреНрдж рдХреЛ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛
рд╕реВрдЪрдХ; рджреЗрдЦреЗрдВ #8405 https://github.com/golang/go/issues/8405 for
рд╡рд┐рдЪрд╛рд░ - рд╡рд┐рдорд░реНрд╢ред рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдЪрд╛рд░ рд╕рдВрднрд╡рддрдГ a . рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗ
рдкреНрд░рдХрд╛рд░ рдЪреБрдиреЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреА рдЕрдВрдд рдореЗрдВ рдЖрд╡рдВрдЯрди рдФрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
рд╡реИрд╕реЗ рднреА рдЧреИрд░-рд╕реНрдерд╛рдиреАрдпред
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рд╕реВрддреНрд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/19412#issuecomment-323371837 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AGGWB-wQD75N44TGoU6LWQhjED_uhKGUks5sZaKbgaJpZM4MTmSr
.
@urandom
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдбрдореА рд╡рд┐рдзрд┐ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХреЛрдИ рддреАрд╕рд░рд╛ рдкрдХреНрд╖ "рд╕рдо рдкреНрд░рдХрд╛рд░" рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдирд┐рд░реНрдпрд╛рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдЦреБрд▓реЗ рдФрд░ рдмрдВрдж рд░рдХрдо рдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рднреА рдЕрдВрддрд░ рдХреЗ рдмрд┐рдирд╛ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:
type X interface { x() X }
type IntX int
func (v IntX) x() X { return v }
type StringX string
func (v StringX) x() X { return v }
type StructX struct{
Foo bool
Bar int
}
func (v StructX) x() X { return v }
рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рдХреЛрдИ рд╡рд┐рд╕реНрддрд╛рд░ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдкреИрдХреЗрдЬ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреА рддрд░рд╣ рд╣реА рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ, рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрд╕рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдПрдХреНрд╕, рдпрд╛ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХреНрд╕ рд▓реЗрддрд╛ рд╣реИред
рдпрджрд┐ рд╡рд╣ func x рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдпрд╛ рддреЛ рдкреИрдирд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ X рд╕реНрд╡рдпрдВ рдПрдореНрдмреЗрдбреЗрдб рдерд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдерд╛) рдпрд╛ рдПрдХ рдорд╛рди рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХрд╛ рдХреЛрдб рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХреЙрд▓рд░ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛ (рдФрд░ рдЙрдирдХрд╛ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрджрд┐рдЧреНрдз рд╣реИ рдЕрдЧрд░ рд╡реЗ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд╣реАрдВ рдкрдврд╝реЗ рд╣реИрдВ)ред
рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЬреЛ "рдРрд╕рд╛ рди рдХрд░реЗрдВ" рд╕рдВрджреЗрд╢ рд╕реЗ рдШрдмрд░рд╛рддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдХреЙрд▓рд░ рдХреЛ рдЕрдкрдирд╛ рдХреЛрдб рдареАрдХ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рд╡рд╣ func x рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдпрд╛ рддреЛ рдШрдмрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ [тАж]
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛: рдпрджрд┐ рдЖрдк рд╣реИрд░рд╛рди рд╣реИрдВ, рдХрд┐ рдПрдХ рдЕрдорд╛рдиреНрдп рдореВрд▓реНрдп рдХрд╛ рдЖрдкрдХрд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд┐рд░реНрдорд╛рдг рдЕрдорд╛рдиреНрдп рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪрд░реНрдЪрд╛ рдХреЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рддрдирд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдерд╛ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реНрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рд░рдЦрдирд╛ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ред рдпрд╣ @urandom рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЯреИрдЧ-рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрд▓реА рд░рдХрдо рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдпрд╛ рдкреНрд░рдпреЛрдЧ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрджрд┐рдЧреНрдз рджрд╛рд╡рд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рдРрд╕рд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдЪрд┐рдд рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛, рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ
3 рдореБрдЭреЗ 1 рдФрд░ 2 рдХрд╛ рдЕрдЬреАрдм рдорд┐рд╢реНрд░рдг рд▓рдЧрддрд╛ рд╣реИ: рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЦрд░реАрджрддрд╛ рд╣реИред
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ "рдпрджрд┐ рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реИрдВ, рдХрд┐ рдЕрдорд╛рдиреНрдп рдореВрд▓реНрдп рдХрд╛ рдЖрдкрдХрд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд┐рд░реНрдорд╛рдг рдЕрдорд╛рдиреНрдп рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ", рд▓реЗрдХрд┐рди, 3 рдХреЗ рд╕рд╛рде, рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрдм рдЖрдк рдХрд░рддреЗ рд╣реИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпреЛрдВред
2 рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЛрдиреЛрдВ рдХреЛрдб рдХреЛ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдлрд┐рд╕рд▓рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рдЧрдбрд╝рдмрдбрд╝ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЧрд▓рдд рдХреНрдпреЛрдВ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдХреНрдпрд╛ рдореИрдВ рдкреИрдЯрд░реНрди рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рдпрд╛ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджрд░реНрд╢рди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
@urandom рдореИрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рдРрд╕рд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдпрджрд┐ рд╕рдВрджреЗрд╣ рд╣реИ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░-рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА (рдФрд░ рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЧреБрдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ рдФрд░ рдЗрд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рд╡реИрдз рдореВрд▓реНрдп)ред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ "рдпрд╣ рдХрд┐рддрдиреА рдмрд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд┐рддрдиреА рдЧрдВрднреАрд░ рд╣реЛрдЧреА"ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдКрдкрд░ рд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ "рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдХрднреА рдирд╣реАрдВ рдФрд░ рдмрд╣реБрдд рдХрдо" рд╣реИ - рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИрдВ, рдЬреЛ рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрд╣рдирдд рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИ - рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдмрд┐рдВрджреБ рдХреЗ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдХреЗ рддрд░реНрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореИрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реЛрд░-рд╢рд░рд╛рдмреЗ рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдирдП рддрд░реНрдХред рдореИрдВрдиреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдКрдкрд░ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрд╛ рдХрд┐ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдирдХрд▓реА-рд░рд╛рд╢рд┐-рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрдпрд╛рдд рдпреЛрдЧреНрдпрддрд╛ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рд╡реЗ рд╣рд░ рддрд░рд╣ рд╕реЗ рд╕рдЦреНрддреА рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВред
рдпрджрд┐ рд╕рдВрджреЗрд╣ рд╣реИ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░-рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА (рдФрд░ рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЧреБрдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ рдФрд░ рдЗрд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рд╡реИрдз рдореВрд▓реНрдп)ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧреБрдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╣реИ: рдЬрдм рд▓реЛрдЧ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо proto.Message
рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде), рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдпрд╣ рдХреМрди рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ . (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдВрдШ рдпрд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡реЗ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред https://github.com/golang/protobuf/issues/364 рднреА рджреЗрдЦреЗрдВред)
рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрджрд┐ рдХреЛрдИ рдЪрд░ рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ unsafe
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдХрдореЛрдмреЗрд╢ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпреЛрдВред
@ рдореЗрд░реЛрд╡рд┐рдпрд╕ рд╢рд╛рдпрдж рдореИрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд░рд╣рд╛ рд╣реВрдВ: рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХрд┐рд╕реА рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЧрд▓рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрдХреНрд╖ рд▓рд╛рдн рд╣реИред
рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЧреЛ/рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджреНрд╡рд╛рд░рд╛ рд╕рдореНрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЯреВрд▓реАрдВрдЧ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдЧреИрд░-рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЯреВрд▓рд┐рдВрдЧ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдВрдб рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЯрд░реНрди рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╡реЗ рдкреИрдЯрд░реНрди рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛ рдЕрдорд╛рдиреНрдп рдорд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рднреА рдмрдирд╛ рджреЗрдЧрд╛: рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдпрдорд┐рдд рдХреЛрдб, рдЬреЗрдирд░реЗрдЯ рдХреЛрдб, рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╣реИ- рдмрд╛рдж рд╡рд╛рд▓реЗ рджреЛ рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЕрдиреНрдп рдкрдХреНрд╖ рд▓рд╛рдн рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдФрд░ рд╡рд╣ рдмреЗрд╣рддрд░ рддреЗрдЬрд╝ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рддрдереНрдп рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЫрджреНрдо-рдпреЛрдЧ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдЫрджреНрдо-рдпреЛрдЧ "рдЗрди рдирд┐рдпрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ" рдЬреИрд╕реЗ json.Token
рдпрд╛ driver.Value
рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗ рдХреБрдЫ рдФрд░ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХрдо рдЬрдЧрд╣ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ interface{}
рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛ рдЕрдорд╛рдиреНрдп рдорд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рднреА рдмрдирд╛ рджреЗрдЧрд╛
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ "рдЕрдорд╛рдиреНрдп рдореВрд▓реНрдп" рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рдХрдерди рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
@neild рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдерд╛
var v pick {
None struct{}
A struct { X int; Y *T}
B int
}
рдЗрд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ
struct {
activeField int //which of None (0), A (1), or B (2) is the current field
theInt int // If None always 0
thePtr *T // If None or B, always nil
}
рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд╕рд╛рде рдЖрдк thePtr
рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА activeField
0 рдпрд╛ 2 рдерд╛ рдпрд╛ theInt
рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рдереЗ, рднрд▓реЗ рд╣реА activeField
0 рдерд╛ред
рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЙрди рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░ рджреЗрдЧрд╛ рдЬреЛ рд╕рдВрдХрд▓рдХ рдмрдирд╛ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрд╕реА рддрд░рд╣ рдХреА рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдмрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ рдЬреЛ рдЖрдЬ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ @bcmills рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рдорд╛рдгреБ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рдЬреЛ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рд╡рд╣ рдЕрдорд╛рдиреНрдп рдорд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрдпреЛрдВ рд╣реИред
var t time.Timer
t
рдПрдХ рдЕрдорд╛рдиреНрдп рдорд╛рди рд╣реИ; t.C
рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, t.Stop
рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдЧреА, рдЖрджрд┐ред рдХрд┐рд╕реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреБрдЫ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ "рдЕрдорд╛рдиреНрдп" рдорд╛рдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЪрд▓рддреЗ рд╣реИрдВред рдЬрд╛рдУ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗ рдпреВрдирд┐рдпрдиреЗрдВ рдЙрд╕ рд╕реБрдИ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рддреА рд╣реИрдВред (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░рдг рднреА рд╣реИрдВред)
@neild рд╣рд╛рдБ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдвреАрд▓рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реВрдВред
рдореБрдЭреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдорд╛рдиреНрдп рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред
рдпреЛрдЧ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЬрд╛рдиреЗ/рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдЙрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
@jimmyfrasche , рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдЖрдкрдХреЛ рд╣рд░ рд╕рдВрднрд╡ рдкреНрд░рдХрд╛рд░ рдмрддрд╛рддрд╛ рд╣реИ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдХреНрдпрд╛ рд╣реИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рдпрд╣ рдХреЛрдб рдХреЗ switch
рднрд╛рдЧ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ:
func F(sum SumInterface) {
switch v := sum {
case Screwdriver:
...
default:
panic ("Someone implementing a new type which gets passed to F and causes a runtime panic 3 weeks into production")
}
}
рддреЛ, рдореБрдЭреЗ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЖрдзрд╛рд░рд┐рдд рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдХрд░рдг рдХреЗ рд╕рд╛рде рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрджреНрджреЛрдВ рдХреЛ рдЯреЛрд▓рд┐рдВрдЧ рдФрд░/рдпрд╛ рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╡рд┐рдзрд┐ рд╣реИ, рддреЛ рд╕рднреА рд╕рдВрднрд╡ (рд╣рд╛рдВ, рдЬрд╛рдирдмреВрдЭрдХрд░ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдЗрд╕реА рддрд░рд╣, рдЖрдИрдУрдЯрд╛-рдЖрдзрд╛рд░рд┐рдд рдПрдирдо рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рдПрдХ рдПрдирдо рдПрдХ type Foo int
рдлреЙрд░реНрдо рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд╕рдореНрдореЗрд▓рди рд╣реИ const ( FooA Foo = iota; FooB; FooC )
" рд╡реНрдпрд╛рдкрдХ рдФрд░ рд╕рдЯреАрдХ рдЙрдкрдХрд░рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдЙрдирдХреЗ рд▓рд┐рдП рднреАред
рд╣рд╛рдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ (рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╕рдорд░реНрдерди рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛), рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рдкреАрдУрд╡реА рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рд╡реЗ рдЕрдХреНрд╕рд░ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдЖрдИрдПрдордУ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЧреЛ 2 рдореЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реНрдкреЗрд╕ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ - рдХрдо рд╕реЗ рдХрдо рдЕрдЧрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
(рдФрд░ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдлрд╛рдпрджреЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреБрди: рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣ рднрд╛рд░реА рдирд╣реАрдВ рддреМрд▓рддрд╛, рдиреБрдХрд╕рд╛рди рднреА рджреЗрдЦрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдЖрддреЗ рд╣реИрдВ)
@Merovius рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рд╣реИред
рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рд╕рдкреЛрд░реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдСрдл-рд▓рд╛рдЗрди рдЯреВрд▓-рд▓рд┐рдВрдЯрд░, рдХреЛрдб рдЬреЗрдирд░реЗрдЯрд░ рдЖрджрд┐ рдХреЛ рд╕реВрдЪрдирд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рднрд▓реЗ рд╣реА, рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░реЗрдВред
рдЧреЛ рдореЗрдВ рд╕реНрдпреВрдбреЛрд╕рдо рдХреЗ рд╕рдмрд╕реЗ рдЖрдо рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ: (рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдШрдЯрдирд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ)
*T
рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд▓рд┐рдП T
T
)interface{}
рдЬреЛ рдХрд┐ рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреНрд░реИрдм рдмреИрдЧ рддрдХ рд╕реАрдорд┐рдд рд╣реИредрдЙрди рд╕рднреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЧреИрд░-рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рджреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдХрдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рд░рд┐рдЯрд░реНрди рдХреЗ рдФрд░ рдХрд┐рд╕реА рднреА рд╕рджрд╕реНрдп рдкрд░ рдХреЛрдИ рдирд┐рдХрд╛рдп рдирд╣реАрдВ рдХреЗ рд╕рд╛рде рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╡рд┐рдзрд┐ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред Enums рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рд╡реЗ рдХреЗрд╡рд▓ Type = iota
рдЗрд╕рд▓рд┐рдП рдЬрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдИрдУрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдЯреНрд░рд┐рдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
*T
рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ T
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реВрдЪрдХ рд╕реЗ рднреЗрдж рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдХрдиреНрд╡реЗрдВрд╢рди type O = *T
рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдирд╛рдо рдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред type O *T
рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдХреЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рдУрд░ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рд╕реЗ рдЯреВрд▓рд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдПрдХ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВред (рдЬреЗрдиреЗрд░рд┐рдХ рд╕рдВрднрд╡рддрдГ type Optional(T) *T
рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдЗрдиреНрд╣реЗрдВ "рдЯреИрдЧрд┐рдВрдЧ" рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛)ред
рдПрдХ рдПрдирдо рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рдЯреВрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛, рдХреМрди рд╕реЗ рдХреНрд╖реЗрддреНрд░ рдПрдирдо рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ? рд╣рдо рдЗрд╕реЗ рдХрдиреНрд╡реЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдирдо рдореЗрдВ рдкреНрд░рддрд┐ рд╕рджрд╕реНрдп рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдХрд┐ рдПрдирдо рдорд╛рди рдФрд░ рдлрд╝реАрд▓реНрдб рдорд╛рди рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
type Which int
const (
A Which = iota
B
C
)
type Sum struct {
Which
A struct{} // has to be included to line up with the value of Which
B struct { X int; Y float64 }
C struct { X int; Y int }
}
рдЙрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ "2 рдлрд╝реАрд▓реНрдбреНрд╕, рдлрд░реНрд╕реНрдЯ рдЗрдЬ рдмреВрд▓" рд╡рд┐рд╢реЗрд╖ рдХреЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
interface{}
рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдбрд╝рдкрдиреЗ рд╡рд╛рд▓реЗ рдмреИрдЧ рдХреЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП //gosum: int, float64, string, Foo
рдЬреИрд╕реА рдЬрд╛рджреБрдИ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдирд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрдХреЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
package sum
type (
Type struct{}
Enum int
OneOf interface{}
)
рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рд╡реЗ type MyEnum sum.Enum
рдлреЙрд░реНрдо рдХреЗ рд╣реИрдВ, рддреЛ рдХреЗрд╡рд▓ рдПрдирдо рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ, рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдХреЛ рддрднреА рдкрд╣рдЪрд╛рдиреЗрдВ рдЬрдм рд╡реЗ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ sum.Type
, рдФрд░ рдХреЗрд╡рд▓ interface{}
рд╣рдбрд╝рдкрдиреЗ рд╡рд╛рд▓реЗ рдмреИрдЧ рдЬреИрд╕реЗ type GrabBag sum.OneOf
рдкрд╣рдЪрд╛рдиреЗрдВ
рдкреЗрд╢реЗрд╡рд░реЛрдВ
рднрд▓реЗ рд╣реА рдЙрди рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдЗрдП рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреВрд▓рд┐рдВрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЯреВрд▓реАрдВрдЧ рдХреЛ рдЬрдирд░реЗрдЯрд┐рд╡ (рдЬреИрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧрд░) рдФрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг (рдЬреИрд╕реЗ рдЧреЛрд▓рд┐рдВрдЯ) рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЬрдирд░реЗрдЯрд┐рд╡ рдХреЛрдб рд▓рд╛рдкрддрд╛ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдкрд╛рджрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ (рдереЛрдбрд╝рд╛ рдердХрд╛рдК рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреАрдврд╝реА рддрд░реНрдХ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ рд╕рдорд╛рди рд╣реЛрдЧрд╛)ред
рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреЛ "рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ" рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рдорд╛рдиреНрдп рдХрд░реЗред
Enums рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧрд░ рдЬреИрд╕реЗ рдФрд░ рдЯреВрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред https://github.com/golang/go/issues/19814#issuecomment -291002852 рдореЗрдВ рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЬрдирд░реЗрдЯрд┐рд╡ рдЯреВрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ рдЬреЛ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдорд╢реАрди рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд╣ рдареАрдХ рд╣реИред
рдореИрдВ рдЗрд╕ рд╕рдордп рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреА рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рд╣реИ?
рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯ рдЙрдореНрдореАрджрд╡рд╛рд░ рдердХрд╛рд╡рдЯ рд▓рд╛рдЗрдирд┐рдВрдЧ рд╣реИред рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрдирд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
1 рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдФрд░ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ 2 рдХреЛ 100% рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛ рднреА рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдФрд░ рдЖрдк рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛрдб рдЗрд╕ рд▓рд┐рдЯрд░ рдХреЛ рд╡реИрд╕реЗ рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВред
2 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдХреЛрдб рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдпрд╛ рдкрд╣рдЪрд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдЬреЛ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реА рд╕рд░рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ func рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ "рдЖрдкрдиреЗ pkg.F(v) рд▓рд┐рдЦрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдорддрд▓рдм pkg.F(v.EmbeddedField)" рдпрд╛ "рдЖрдкрдиреЗ 2 рд╕реЗ pkg.F рдкрд╛рд╕ рдХрд┐рдпрд╛, pkg.B рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ"ред рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕реЗ "рдЖрдк рдХрд┐рд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХреНрд╕ рдЖрдк рдлрд╝реАрд▓реНрдб рдПрдл рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ ". рдпрд╣ рдЬреЛрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдорд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рджреВрд╕рд░реА рдмрдбрд╝реА рдмрд╛рдд рдЧреЛрдбреЛрдХ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред Godoc рдкрд╣рд▓реЗ рд╕реЗ рд╣реА const/iota рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ #20131 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрдпреВрдбреЛрд╕рдо рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧрд╛ред рд╕рдВрд░рдЪрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред
рд╕рд╛рде рд╣реА рдСрдл-рд▓рд╛рдЗрди рдЯреВрд▓тАФрд▓рд┐рдВрдЯрд░, рдХреЛрдб рдЬреЗрдирд░реЗрдЯрд░ рдЖрджрд┐ред
рдирд╣реАрдВред рд╕реНрдерд┐рд░ рдЬрд╛рдирдХрд╛рд░реА рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЯрд╛рдЗрдк-рд╕рд┐рд╕реНрдЯрдо (рдпрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рдореНрдореЗрд▓рди рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдХреЛрдИ рднреА рд╕реНрдерд┐рд░ рдЙрдкрдХрд░рдг рдЗрд╕реЗ рдПрдХ рдмрдВрдж рд░рд╛рд╢рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╣реИ) рдФрд░ рдХреЛрдИ рднреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг/рдХреЛрдбрдЬрди рдЬреЛ рдЖрдк рдЪрд╛рд╣реЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣ iota-enums рдХреЗ рд╕рдореНрдореЗрд▓рди рдХреЗ рд╕рд╛рдеред
рдкрд░рд╛рд╡рд░реНрддрди рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╣реИ - рдФрд░ рдПрдХ рдЕрд░реНрде рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣рд╛рдВ рд░рдХрдо-рджрд░-рд╕рдореНрдореЗрд▓рди рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдпрд╛ рдШреЛрд╖рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рд╕реВрдЪреА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рдЬреЛ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рдХрдо рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдмрдирд╛рддреА рд╣реИред
(рд╕рд╛рде рд╣реА, рдПрдлрдЯреАрдЖрд░, рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд░рдирдЯрд╛рдЗрдо-рд╕реВрдЪрдирд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдЯреИрдЧ-рд╡рд┐рдзрд┐ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд▓реБрдХрдЕрдк-рдЯреЗрдмрд▓ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЙрдирдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ рдпрд╣)ред
рддреЛ, рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдЬрд╛рдирдмреВрдЭрдХрд░ рдерд╛: рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рднрд▓реЗ рд╣реА, рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░реЗрдВред
рдЬрдм рдореИрдВрдиреЗ рдХрд╣рд╛ "рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░реЗрдВ", рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рдерд╛ "рдЙрдирдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢реВрдиреНрдп рдореЗрдВ рдмрд╣рд╕ рдХрд░реЗрдВ", рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ "рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рдЗрди рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд┐рддрдиреЗ рдЙрдкрдпреЛрдЧреА/рдЖрд╡рд╢реНрдпрдХ/рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИрдВ"ред
рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдиреБрднрд╡ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ: рдЖрдкрдХреЛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЖрдкрдиреЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЖрдкрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╡реЗ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдереЗред рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреЛ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ "рдЬрд┐рд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛") рдФрд░ рдЙрдирдХреЗ рдЦрд┐рд▓рд╛рдл рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, рдХреЛрд╢рд┐рд╢ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреИрд╕реЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╕рдорд╛рди рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
рдЖрдк "рдЙрд╕ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ" рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдЖрдк рд╕реНрдерд┐рд░ рдердХрд╛рд╡рдЯ-рд╕рдорд╕реНрдпрд╛ (рд╕рдорд╕реНрдпрд╛) рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдПрдХ рдЙрдкрдХрд░рдг рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдвреВрдВрдврддрд╛ рд╣реИ, рдХреНрдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП рдердХрд╛рд╡рдЯ-рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рд▓рд┐рдЦреЗрдВ, рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред
рдореИрдВ рдЬреЛрд░ рд╕реЗ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЙрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕реНрдерд┐рд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрдкрдХрд░рдг рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлреАрдбрдмреИрдХ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдерд╛ (рдФрд░ рдпрд╣ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛)ред
рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдЕрдЧрд░ рдореИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдЬрд╣рд╛рдВ рдореИрдВ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рдП) рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рди рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ рдФрд░ рдмреА) рд╕рд░рд▓ рдХреЙрдиреНрд╕реНрдЯ-рдЖрдИрдУрдЯрд╛-рдПрдирдо, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХ рдПрдХрд▓ рдХреЙрдиреНрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ int рд╣реИ- рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рд╛рд░реВрдк рдХреА рдШреЛрд╖рдгрд╛ред рдПрдХ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рджреЛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди IMO рдпрд╣ рдареАрдХ рд╣реИ (рдХрдВрдкрд╛рдЗрд▓рд░ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рдХрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рддрд╛рдХрд┐ рдпрд╣ рдареАрдХ рд▓рдЧреЗ)ред
рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рд╕реЗрдЯ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдбрд╛рдпрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рддрдиреЗ рдЭреВрдареЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ/рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИрдВ
https://godoc.org/github.com/jimmyfrasche/closed
рдЕрднреА рднреА рдмрд╣реБрдд рдХрд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдореИрдВ рд╡рд╛рджрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдореБрдЭреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗред рдЗрд╕рдореЗрдВ рд╢рд╛рдпрдж рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрдЧ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред
cmds/closed-exporer рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдЖрдпрд╛рдд рдкрде рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд╛рдП рдЧрдП рд╕рднреА рдмрдВрдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдЧрд╛ред
рдореИрдВрдиреЗ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдереЗ рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдереЗред рдпрджрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рдЯреИрдЧ рд╡рд┐рдзрд┐ рд╕рдореНрдореЗрд▓рди рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЦреЛ рджрд┐рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдФрд░ рдкреИрдХреЗрдЬ рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдмрдВрдж рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
Enums рдХреЗ рд╕рд╛рде рдореИрдВ рджреВрд╕рд░реА рддрд░рдл рдЧрдпрд╛ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд░ рдЧреИрд░-рдмрд┐рдЯрд╕реЗрдЯ рдХреЙрдиреНрд╕ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ред рдореИрдВ рдЦреЛрдЬреЗ рдЧрдП рдмрд┐рдЯрд╕реЗрдЯ рдХреЛ рднреА рдмреЗрдирдХрд╛рдм рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред
рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ рдпрд╛ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдорд╛рд░реНрдХрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ stdlib рдореЗрдВ рд╣реИред
рдореИрдВрдиреЗ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдереЗ рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдереЗред
рдореБрдЭреЗ рдпрд╣ рдорджрджрдЧрд╛рд░ рд▓рдЧреЗрдЧрд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд╣реАрдВ рдереЗред
@Merovius рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдореИрдВрдиреЗ рдПрдХ рд╕реВрдЪреА рдирд╣реАрдВ рд░рдЦреАред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ stdlib.sh (cmds/рдмрдВрдж-рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдореЗрдВ) рдЪрд▓рд╛рдХрд░ рдкрд╛рдпрд╛ред рдЕрдЧрд░ рдореИрдВ рдЕрдЧрд▓реА рдмрд╛рд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред
рдЬрд┐рди рдкрд░ рдореИрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡реЗ рд╕рднреА рдЧреИрд░-рдирд┐рд░реНрдпрд╛рддрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдереЗ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдкреНрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛: рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдерд╛, рдЙрд╕рдХреА рдХреЛрдИ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдереА, рдмрд╕ рдХреБрдЫ рдРрд╕рд╛ рдерд╛ рдЬреЛ рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рдерд╛ред рдЙрдирдХрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдереЗ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдмрдВрдж рд╣реЛ рдЧрдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗред рд╢рд╛рдпрдж рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдВрддрд░ рдХреЗ рдЕрдВрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж рдореИрдВ рд╣рдореЗрд╢рд╛ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВред
@jimmyfrasche рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рд░рдХрдо рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рд╡реЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ (рдпрд╛рдиреА рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛) рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕реНрдерд┐рд░ рд▓рд┐рдВрдЯрд░ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ "рд╕рднреА рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реИрдВ" - рдЗрд╕рд▓рд┐рдП рдЙрдирдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдирд╣реАрдВ рд╣реИ рдмрдВрдж рд░рдХрдо рдХреЗ рд░реВрдк рдореЗрдВред рд╣реИрдВ, OTOH, рд╡реЗ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрднреА рдХрднреА рдФрд░ рдПрдХ рдорд╛рдорд▓реЗ рдХреЛ рдЫреЛрдбрд╝, рд╢рд┐рдХрд╛рдпрдд рд╕рд╣реА рд╣реЛрдЧрд╛ - рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдВрдЯрд░ рдкрдХрдбрд╝ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреА рддрд░рд╣ рд╣реЛрдЧрд╛ред
рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╢рдмреНрдж рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдШ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЧреЛ рдореЗрдВ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдорд╛рди рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ [] рдорд╛рди рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЫреЛрдЯреЗ рдмрд┐рдЯ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдкреИрдХ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛрдЧреБрдиреА рдореЗрдореЛрд░реА рд▓реЗрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реА рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рд▓рдЧрддрд╛ рд╣реИ?
рднрд╛рд╖рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХреЛ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЫреЛрдЯреЗ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рдЖрдзреЗ рдореЗрдВ рдХрд╛рдЯрдиреЗ рд╕реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрдХрд░реНрд╖рдХ рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдЬ рдЧреЛ рдореЗрдВ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрджреНрдзрддрд╛ рдФрд░ рд╕рдордЭ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдорд╢реАрди рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ; рд╕рд┐рд░реНрдл рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд╢рд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдПред
рдЖрдк рдПрдХ рдорд╛рди рдХреЛ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реВрдЪрдХред
рдлрд╝рд░, 6, 2018 3:54 pm рдкрд░, "рдмреНрд░рд╛рдпрди Slesinsky" [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:
рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╢рдмреНрдж рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдШ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рдХрдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
рд╕реНрдореГрддрд┐ рдкреНрд░рдпреЛрдЧред рдореИрдВ рдЧреЛ рдореЗрдВ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐
рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдорд╛рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ [] рдорд╛рди рджреЛрдЧреБрдирд╛ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЗрддрд╛ рд╣реИ
рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреИрдХ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдЬреИрд╕рд╛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рдереЗ
рд╕реА рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рд▓рдЧрддрд╛ рд╣реИ?рднрд╛рд╖рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХреЛ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдореГрддрд┐ рдХреЛ рдХрд╛рдЯрдиреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ
рдХреБрдЫ рдЫреЛрдЯреЗ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзреЗ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕реБрдВрджрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрдШреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдореНрдореЛрд╣рдХ рддрд░реНрдХ? рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рддрдХ I
рдЖрдЬ рдЧреЛ рдореЗрдВ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╢реАрд░реНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрджреНрдзрддрд╛ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░
рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╢реАрди рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредрдореИрдВрдиреЗ рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ; рдмрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд╢рд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП
рдЕрдиреБрд╕рдВрдзрд╛рдиред-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/19412#issuecomment-363561070 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AGGWBz-L3t0YosVIJmYNyf2iQ-YgIXLGks5tSLv9gaJpZM4MTmSr
.
@skybrian рдпрд╣ рд░рд╛рд╢рд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдмрд╣реБрдд рд╣реА
рдпрд╣ рдЖрдкрдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ: рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдпрдж рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╢рд╛рдпрдж рдЕрдм рддрдХ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЙрддрдиреА рд╣реА рдЬрдЧрд╣ рд▓реЗрдЧрд╛ред рдЬрдм рддрдХ рдХрд┐ рдЯреБрдХрдбрд╝рд╛ рд╕рдорд░реВрдк рди рд╣реЛ, рд▓реЗрдХрд┐рди рддрдм рдЖрдк рдЕрднреА рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрд▓рд╛рдЗрд╕-рдкреНрд░рдХрд╛рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдПред рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрджрд┐ рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдереЛрдбрд╝реА рд╕реА рд╕реНрдореГрддрд┐ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@DemiMarie рдЕрд╕реБрд░рдХреНрд╖рд┐рддред рдкреЙрдЗрдВрдЯрд░ рдРрдк рдЗрдВрдЬрди рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рдмрд┐рдЯреНрд╕ рдкреИрдХ рдХрд░рдиреЗ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрддрд╛, рддреЛ рдпрд╣ рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ред
@Merovius рд╣рд╛рдБ, рдкреИрдХ рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдФрд░ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рдд рд╣реИ; рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдЧреЛ рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдмреЗрд╣рддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рд▓реЗрдХрд┐рди рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рддреЗрдЬрд╝ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛ рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред рд╢рд╛рдпрдж рдЕрдиреНрдп рд╣реИрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдвреВрдВрдврдирд╛ рд╣реИ рдЬреЛ рдЖрдЬ рдЧреЛ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАрдВред
рдпрд╣ рд╕рдЪ рд╣реИред
рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдЧреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ,
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рдмреЗрддрд╣рд╛рд╢рд╛ рдЧрддрд┐рд╢реАрд▓ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдгред рдпрджрд┐ рдЖрдкрдХреЛ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ,
рдЖрдкрдХреЗ рд╣реЙрдЯ рд▓реВрдкреНрд╕ рдХреЛ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдЖрдк
рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдРрдк рдЗрдВрдЬрди рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
6 рдлрд░рд╡рд░реА, 2018 рдХреЛ рд╢рд╛рдо 6:15 рдмрдЬреЗ, "рдмреНрд░рд╛рдпрди рд╕реНрд▓реЗрд╕рд┐рдВрд╕реНрдХреА" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:
@DemiMarie https://github.com/demimarie рдЕрд╕реБрд░рдХреНрд╖рд┐рдд.рдкреЙрдЗрдВрдЯрд░ рдРрдк рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдЗрдВрдЬрди, рдФрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдмрд┐рдирд╛ рдмрд┐рдЯреНрд╕ рдкреИрдХ рдХрд░рдиреЗ рдирд╣реАрдВ рджреЗрдЧрд╛
рдХреВрдбрд╝рд╛ рдЙрдард╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ред рд╕рдВрднрд╡ рд╣реЛрддрд╛ рддреЛ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛
рдкреЛрд░реНрдЯреЗрдмрд▓ред
@metrovius рд╣рд╛рдБ, рдЗрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдкреИрдХреНрдб рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рдд рд╣реИ; рд╕рдВрдХреЗрдд рд╣реИрдВ
рдЧреЛ рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдмреЗрд╣рддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ a
рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛, рдЖрдк рдЗрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдпрд╛ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рд▓реЗрдХрд┐рди рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рддреЗрдЬрд╝ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛ рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рд╣реИ
рдорд╛рдорд▓рд╛ред рд╢рд╛рдпрдж рдЕрдиреНрдп рд╣реИрдВ? рдпрд╣ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИ a
рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рдвреВрдВрдврдирд╛ рд╣реИ рдЬреЛ рдЖрдЬ рдЧреЛ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/19412#issuecomment-363598572 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AGGWB65jRKg_qVPWTiq8LbGk3YM1RUasks5tSN0tgaJpZM4MTmSr
.
рдореБрдЭреЗ @rogpeppe рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛рдлреА рдЖрдХрд░реНрд╖рдХ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ @griesemer рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдкрд╣рдЪрд╛рдиреЗ рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рднреЛрдВ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред
рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╣рддрд╛ рд╣реИ: "рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд░рдЦрддрд╛ рд╣реИ
рдЗрд╕рдХреЗ рд╕рднреА рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ, рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░
рдирд╛рдо рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ред".
рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХреЗ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
var x int|float64
рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
x += 5
рдпрд╣ рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:
switch i := x.(type) {
case int:
x = i + 5
case float64:
x = i + 5
}
рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрд╡рд┐рдЪ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
type Num int | float64
type StringOrNum string | Num
var x StringOrNum
switch i := x.(type) {
case string:
// Do string stuff.
case Num:
// Would be nice if we could use i as a Num here.
}
рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреАрдЪ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд╛рд▓рдореЗрд▓ рд╣реИ рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
var x int|float64
var x, y int | float64
рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЗрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдирд┐рдпрдо рд╣реИрдВ? рдХреМрди рд╕рд╛ рд╣рд╛рдирд┐рдкреВрд░реНрдг рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдХреНрдпреЛрдВ)? рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдЧреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ рд╕реА рдХрд░рддрд╛ рд╣реИ) рдЙрджреНрджреЗрд╢реНрдп рдкрд░ - рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдмрдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдФрд░ рднреА рдЕрдзрд┐рдХ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП:
var x, y, z int|string|rune
x = 42
y = 'a'
z = "b"
fmt.Println(x + y + z)
fmt.Println(x + z + y)
fmt.Println(y + x + z)
fmt.Println(y + z + x)
fmt.Println(z + x + y)
fmt.Println(z + y + x)
рд╕рднреА int
, string
рдФрд░ rune
рдореЗрдВ рдПрдХ +
рдСрдкрд░реЗрдЯрд░ рд╣реИ; рдЙрдкрд░реЛрдХреНрдд рдЫрдкрд╛рдИ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдФрд░ рд╕рдмрд╕реЗ рдмрдврд╝рдХрд░, рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреИрд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
var x, y int | float64
рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЗрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдирд┐рдпрдо рд╣реИрдВ? рдХреМрди рд╕рд╛ рд╣рд╛рдирд┐рдкреВрд░реНрдг рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдХреНрдпреЛрдВ)? рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
@Merovius рдХреЛрдИ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд░реВрдкрд╛рдВрддрд░рдг рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ x + y
рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧрд╛:
z = int(x) + int(y)
z = float64(x) + float64(y)
рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдЖрдкрдХрд╛ xyz рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рд╕рдорд░реНрдерд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХрд╛ рд╕рдорд░реНрдерди" рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдЗрд░рд╛рджрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред "рд╕рднреА рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди" рдЬреИрд╕рд╛ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рднреА рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИрдВред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓реЗрди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рд╕рднреА int, string рдФрд░ rune рдореЗрдВ рдПрдХ + рдСрдкрд░реЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИ; рдЙрдкрд░реЛрдХреНрдд рдЫрдкрд╛рдИ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВ рдФрд░ рд╕рдмрд╕реЗ рдмрдврд╝рдХрд░, рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреИрд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
рдмрд╕ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореЗрд░рд╛ "рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХреЗ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?" рдЧреЛ рд╕реНрдкреЗрдХ рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдерд╛ рдХреНрдпреЛрдВрдХрд┐ "рдПрдХ рдкреНрд░рдХрд╛рд░ рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред"ред
рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдХреЛ рдореИрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рдЙрд╕рдХреЗ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ "рдЕрдиреНрдп рд╕рд╛рдорд╛рди" рдХреЗрд╡рд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХ рд╣реИред
рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╢реВрдиреНрдп рд╕реЗ рддреБрд▓рдирд╛ рд╣реИ:
var x []int | []string
fmt.Println(x == nil) // Prints true
x = []string(nil)
fmt.Println(x == nil) // Still prints true
рджреЛрдиреЛрдВ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп рд╕реЗ рддреБрд▓рдиреАрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╢реВрдиреНрдп рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдЕрдВрддрд░ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддрд┐ https://github.com/golang/go/issues/22729 рдПрдХ рдмреБрд░реА рдмрд╛рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕рдорд╛рдирддрд╛ рдкрд░реАрдХреНрд╖рдг рдпрд╣рд╛рдВ рдПрдХ рдмреБрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрдореЛрджрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдорд┐рд▓рд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдорд┐рд░рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ, рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреЛ a) рдореЗрдВ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИрдВ рдпрд╛ b) рдЕрддреНрдпрдВрдд (рдФрд░ IMO рднреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ) рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реАрдорд┐рдд рд╣реЛрдВрдЧреА - рдЕрд░реНрдерд╛рддреН, рд╕рднреА рдСрдкрд░реЗрдЯрд░ рдХреЗрд╡рд▓ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рднреА рд╣реИ, рдЬреЛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдЙрдирдХреЗ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЙрдирдХреА рдордЬрдмреВрддреА рдХреЛ рдФрд░ рднреА рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЖрдк рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рд╡реЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдмрд╣реБрдд рдЫреЛрдЯреЗ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдореВрд░реНрдд рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрдиреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИред
рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЖрдк рдХрднреА рднреА рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдУрд╣ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛: рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдЖрдк рдХрднреА рднреА рдпрд╣ рддрдп
@Merovius рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд░рдЦрддрд╛ рд╣реИ
рдЗрд╕рдХреЗ рд╕рднреА рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛"ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдПрдХ рдЧреИрд░-рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред
рдУрд╣ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛: рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдЖрдк рдХрднреА рднреА рдпрд╣ рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рдЖрдк рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЪрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ ... рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди-рдкреНрд░рдХрд╛рд░ рд╕реЗ рдпреЛрдЧ рддрдХред рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреБрдЫ рдСрдкрд░реЗрд╢рди (рдЬреИрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ) рдХрдВрдкрд╛рдЗрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ @rogpeppe рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред
рдпрджрд┐ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рдмрд╛рд╣рд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореВрд▓ рд░реЛрдЧрдкреЗрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдФрд░ рдореЗрдердб рд╕реЗрдЯ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╕рдорд╛рдирддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ {} рдЬреЛ рдХрд░рддрд╛ рд╣реИ:
var x int | float64
fmt.Println(x == "hello") // compilation error?
x = 0.0
fmt.Println(x == 0) // true or false? I vote true :-)
рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдПрдХ рдЧреИрд░ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред
рдЖрдк рд╣рдореЗрд╢рд╛ рддрд░реАрдХреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдирдП рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд░ рд╣реИ - рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ, рдЖрдк рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдо-рд╡реИрд▓реНрдпреВ (рдпрд╛ рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ) рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЯрд╛рдЗрдк-рдПрд╕реЗрд░рд╢рди/-рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдЦреЛрд▓ рдирд╣реАрдВ рджреЗрддреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рддрдХ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рддрдм рддрдХ рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ, рдпрд╣ рдЕрднреА рднреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдРрд╕реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдУрд╡рд░рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
(рдЖрдк рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдпреЛрдЧ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рдЕрднреА рднреА рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ - I рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рдмрдВрдж рд░рдХрдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ)
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡реИрд╕рд╛ рд╣реА рд░рд╣реЗрдЧрд╛ рдЬреИрд╕рд╛ @rogpeppe . рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ рдПрдХ рдпреЛрдЧ-рдорд╛рди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреА рд╣реИ, рдореИрдВ (рдЕрдкрдиреЗ рдШрдЯрдХ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП) рдПрдХ рдпреЛрдЧ-рдореВрд▓реНрдп рд╕реЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдирдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛, рд▓реЗрдХрд┐рди рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╛рдиреА рдореЗрд░рд╛ рддрд░реНрдХ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИ, рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рд╢рдмреНрджрд╛рд░реНрде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлрд╛рдпрджреЗрдордВрдж рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рд╣реИред
fmt.Println(x == "hello") // compilation error?
рдпрд╣ рд╕рдВрднрд╡рдд: рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛
рдЧреИрд░-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ X рдХрд╛ рдорд╛рди x рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ T рдХрд╛ рдорд╛рди t рддреБрд▓рдиреАрдп рд╣реИ рдЬрдм рдкреНрд░рдХрд╛рд░ X рдХреЗ рдорд╛рди рддреБрд▓рдиреАрдп рд╣реИрдВ рдФрд░ X T рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ рдпрджрд┐ t рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ X рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ t рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдорд╛рди x рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ .
fmt.Println(x == 0) // true or false? I vote true :-)
рдмрд╣реБрдзрд╛ рдЭреВрдард╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдорд╛рди
var x int|float64 = 0.0
y := 0
fmt.Println(x == y)
рдПрдХ рд╕рдВрдХрд▓рди-рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ), рдпрд╣ рдкреНрд░рд╢реНрди рдХреЗрд╡рд▓ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпреБрдХреНрддрд┐ рдореЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рдлрд┐рд░ рддреБрд▓рдирд╛ рдЭреВрдареА рд╣реЛрдЧреА)ред рдХреМрди рд╕рд╛ рдЖрдИрдПрдордУ рдареАрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЖрдЬ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░реЗрд╢рд╛рдиреА рдХреЗ
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдШрдЯрдХ рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рджреЛрд╣рд░рд╛рдирд╛: рдореИрдВ рд░рдХрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
fmt.Println(x == "hello") // compilation error?
рдпрд╣ рд╕рдВрднрд╡рдд: рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕реБрдзрд╛рд░: рдпреБрдХреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕рдореЗрдВ рдХрдерди рд╢рд╛рдорд┐рд▓ рд╣реИ
рдХрд┐рд╕реА рднреА рддреБрд▓рдирд╛ рдореЗрдВ, рдкрд╣рд▓рд╛ рдСрдкрд░реЗрдВрдб рджреВрд╕рд░реЗ рдСрдкрд░реЗрдВрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
@Merovius рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреА рдмрд╛рддреЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЙрди рдкрд░ рдФрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ 0 рдкреНрд░рд╢реНрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
fmt.Println(x == 0) // true or false? I vote true :-)
рдмрд╣реБрдзрд╛ рдЭреВрдард╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рдорд╛рди
var x int|float64 = 0.0
y := 0
fmt.Println(x == y)
рдПрдХ рд╕рдВрдХрд▓рди-рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ),
рдореБрдЭреЗ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рд╕рдореНрдореЛрд╣рдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ var x float64 = 0.0
рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлреНрд▓реЛрдЯ64 рд╕реЗ 0 рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдорд╛рдореВрд▓реА рдмрд┐рдВрджреБ: (рдП) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдлреНрд▓реЛрдЯ 64 (0) рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 0.0 int рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред (рдмреА) x == y рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдЭреВрдард╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ "рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП" рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рд╣реИ (рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ), рддреЛ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛:
var x,y int|float64 = float64(0), 0
fmt.Println(x == y)
// рдЭреВрдард╛
рдореИрдВ рдЕрднреА рднреА рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ x == 0
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ 0 рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рджреЗрд░ рд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд╛рдпрд╛ред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рд╕реЗ "рдЬреНрдпрд╛рджрд╛ рдлрдЬ" рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддреБрд▓рдирд╛ рд╢реВрдиреНрдп рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рдореБрджреНрджреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд╛рдлреА рднреНрд░рдо рдкреИрджрд╛ рд╣реБрдЖ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╣рдо 0 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдорд╛рди рдорд╛рддреНрд░рд╛ рдореЗрдВ рднреНрд░рдо рджреЗрдЦреЗрдВрдЧреЗ рдпрджрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рд╕рдорд╛рдирддрд╛ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рд╕рдореНрдореЛрд╣рдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ var x float64 = 0.0 рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрд╕реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ float64 рд╕реЗ 0 рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рд╢рд╛рдпрдж рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рд╣реИрдВ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдХреИрд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рджрдЧреА / рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рджреБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ рдореВрд▓реНрдп рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рдЗрд╕реЗ рд╕рд╣реА рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдЖрд╢рд╛рд╡рд╛рджреА рдирд╣реАрдВ рд╣реВрдВред
рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ float64(0)
рд╕реЗ int(0)
(рдпрд╛рдиреА var x float64 = 0.0
рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг) false
, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рд╣реИ рддреНрд░реБрдЯрд┐ (рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдареАрдХ рдпрд╣реА рдореЗрд░реА рдмрд╛рдд рд╣реИ ; рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рддрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
(рдП) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдлреНрд▓реЛрдЯ 64 (0) рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 0.0 int рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ (рдореИрдВ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░" рдХреЗ рдХрд░реАрдм рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдорд╛рди рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рдпрд╣ рдирд╣реАрдВ рд╣реИ)ред
(рдмреА) x==y рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдЭреВрдард╛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред)
рдирд╣реАрдВ, рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдкрдиреЗ рдХрд╣рд╛ рд╣реИ, рдХрд┐ рдСрдкрд░реЗрд╢рди e1 == y
, рдЬрд┐рд╕рдореЗрдВ e1
рдПрдХ рдпреЛрдЧ-рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдЧреАред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, x
рдХрд╛ рдкреНрд░рдХрд╛рд░ int|float64
рдФрд░ y
рдХрд╛ рдкреНрд░рдХрд╛рд░ int
рдФрд░ рдпрд╣ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ float64
рдФрд░ int
рддреБрд▓рдиреАрдп рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕ рд╢рд░реНрдд рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рд╕рдВрдХрд▓рди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рд╢рд░реНрдд рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо рдирд┐рдпрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдХрд┐ рдЗрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ "рд╕реА рдореЗрд╕" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдкрд┐рдЫрд▓реА рдЖрдо рд╕рд╣рдорддрд┐ рдпрд╣ рд░рд╣реА рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВ: рдЫреЛрдЯреА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рдмрд░реНрддрдиред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рд╕рд┐рд╕реНрдЯрдо рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреА рдЕрдЪреНрдЫреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрддреА рд╣реИред
рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░рддрд╛ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд░реА рд╡рд┐рддрд░рд┐рдд рд╕реЗрд╡рд╛ рд▓рд┐рдЦ тАЛтАЛрд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рд╡реЗ рдЖрд╕рд╛рди рд╣реЛрдВрдЧреЗред рд╕реЗрд╡рд╛ рдХреЗ рдмрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдпреЗ NPD рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛ рдЧрдП рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдордЭрджрд╛рд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред
рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреЛ рдХреА рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЧрд╛рд░рдВрдЯреА рд╕рд╛рдорд╛рдиреНрдп рдЖрджрд┐рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдордЬреЛрд░ рд╣реИред
рд▓реЗрдХрд┐рди, рд░рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдиреА рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдирдкреАрдбреА рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреИрд╕реЗ рд╡реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ: рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╣реИ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╢ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рд╕реНрдпреВрдбреЛрдХреЛрдб рдореЗрдВ iotuils.WriteFile
-рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░рд╡рд╛рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛
file = open(name, os.write)
if file is error
return error("cannot open " + name + " writing: " + file.error)
if file.write(data) is error:
return error("cannot write into " + name + " : " + file.error)
return ok
рдФрд░ рдпрд╣ Rust . рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
match open(name, os.write)
file
match file.write(data, os.write)
err
return error("cannot open " + name + " writing: " + err)
ok
return ok
err
return error("cannot write into " + name + " : " + err)
рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рд▓реЗрдХрд┐рди рдмрджрд╕реВрд░рдд рд╣реИред
рдФрд░ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡:
type result[T, Err] oneof {
default T
Error Err
}
рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ ( result[void, string]
= !void
)
file := os.Open(name, ...)
if !file {
return result.Error("cannot open " + name + " writing: " + file.Error)
}
if res := file.Write(data); !res {
return result.Error("cannot write into " + name + " : " + res.Error)
}
return ok
рдпрд╣рд╛рдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢рд╛рдЦрд╛ рдЕрдЬреНрдЮрд╛рдд рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рд╢рд╛рдЦрд╛ рдХреЛ .Error
рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдПрдХ рдмрд╛рд░ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реЛ рдЬрд╛рдиреЗ рдкрд░ рдкрд░рд┐рдгрд╛рдо рддреНрд░реБрдЯрд┐ рд╣реИ)ред рдПрдХ рдмрд╛рд░ рдЬрдм рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЦреЛрд▓реА рдЧрдИ рдереА рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реА рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд░ рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ file
рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдЕрдиреНрдпрдерд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЧрдпрд╛ рдерд╛ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдЧреЗ рдХреЗ рдмрдпрд╛рдиреЛрдВ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ)ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдирдкреАрдбреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
type Reference[T] oneof {
default T
nil
}
// Reference[T] = *T
рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИ
@ рд╕рд┐рд░реНрдХреЛрди , рдЖрдкрдХрд╛ рдЬрдВрдЧ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдореЗрдВ рд╕реАрдзреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдЧрд▓рдд рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ if
рдХрдердиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЧреЛ-рдЬреИрд╕реА рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
ferr := os.Open(name, ...)
if err(e) := ferr { // conditional match and unpack, initializing e
return fmt.Errorf("cannot open %v: %v", name, e)
}
ok(f) := ferr // unconditional match and unpack, initializing f
werr := f.Write(data)
...
(рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ, рдпрд╣ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рдпрджрд┐ рд╕рдВрдХрд▓рдХ рдпрд╣ рд╕рд╛рдмрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдПрдХ рдмрд┐рдирд╛ рд╢рд░реНрдд рдореИрдЪ рд╣рдореЗрд╢рд╛ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдареАрдХ рдПрдХ рдорд╛рдорд▓рд╛ рд╢реЗрд╖ рд╣реИред)
рдмреБрдирд┐рдпрд╛рджреА рддреНрд░реБрдЯрд┐-рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХрд╛рдзрд┐рдХ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рд▓рдВрдмреА рд╣реИ рдФрд░ рдПрдХ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ (рдпрджрд┐ рдмрдпрд╛рдиреЛрдВ рдХреЛ рдФрд░ рдЬреЛрдбрд╝рдХрд░), рдФрд░ рд╕рдВрдХрд▓рдХ рдЬрд╛рдВрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
@sirkon
рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВ: рдЫреЛрдЯреА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рдмрд░реНрддрдиред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рд╕рд┐рд╕реНрдЯрдо рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреА рдЕрдЪреНрдЫреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрддреА рд╣реИред
[тАж]
рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреЛ рдХреА рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЧрд╛рд░рдВрдЯреА рд╕рд╛рдорд╛рдиреНрдп рдЖрджрд┐рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдордЬреЛрд░ рд╣реИред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрдпрд╛рди рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЯрдХрд░рд╛рд╡ рдФрд░ рдЕрдкрдорд╛рдирдЬрдирдХ рд╣реИрдВред рд╡реЗ рд╢рд░реНрдордирд╛рдХ рднреА рд╣реИрдВ, рдЯреАрдмреАрдПрдЪ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝реА, рдЧреИрд░-рддреБрдЪреНрдЫ рд╕реЗрд╡рд╛рдПрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИрдВред рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ Google рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рдмрдбрд╝реА рдФрд░ рдЧреИрд░-рддреБрдЪреНрдЫ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЧреЛ рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рди рд╣реА рдЗрд╕реЗ, рдЖрдИрдПрдордУ), рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк рд╕реЗ рди рдХреЗрд╡рд▓ "рдЖрджрд┐рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ" рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдПрдирдкреАрдбреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореВрд▓реНрдп рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЗрд╡рд▓ dereference рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди AFAICT рдХреБрдЫ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЙрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реВрдиреНрдп-рдореВрд▓реНрдп рдкрд░ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрднреА рднреА рдШрдмрд░рд╛рдПрдЧрд╛)ред рдпрд╛рдиреА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ *p
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдиреНрдп рд╣реИ, p.T
(рдпрд╛ рдпрд╣ p.default
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдорд╛рдиреНрдп рд╣реИ? рдпрд╣ рдмрддрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рд╣реИ ) рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдФрд░ рд╢реВрдиреНрдп-рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдПрдХ рд▓рд╛рдн рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдСрдкрд░реЗрд╢рди рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреЛ рдЙрд╕ рдкреНрд░рд╡рд░реНрддрди рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рд╡рд╣ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирдИ рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд▓рд╛рддрд╛ рд╣реИ (рдпрдХреАрдирди, рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрд▓реА рд░рдХрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ), рдЬрдмрдХрд┐ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИ рд╡рд╣ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк "рдмрджрд╕реВрд░рдд" рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
@рдореЗрд░реЛрд╡рд┐рдпрд╕
рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ Google рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ,
рдзрдиреНрдп рд╣реИрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕реАред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЗрд╡рд▓ dereference рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдлрд┐рд░
var written int64
...
res := os.Stdout.Write(data) // Write([]byte) -> Result[int64, string] тЙИ !int64
written += res // Will not compile as res is a packed result type
if !res {
// we are living on non-default res branch thus the only choice left is the default
return Result.Error(...)
}
written += res // is OK
@skybrian
ferr := os.Open(...)
рдпрд╣ рдордзреНрдпрд╡рд░реНрддреА рдЪрд░ рд╡рд╣ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдФрд░ рд╢реВрдиреНрдп-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИред рдпреЗ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдп рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдФрд░ рдЖрдИрдПрдордУ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред
@ рд╕рд┐рд░рдХреЛрди рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рд▓реЛрдЧреЛрдВ рд╕реЗ рдЖрдВрдЦреЛрдВ рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЙрд╕ рдкрд░ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ред
рдЖрдЗрдП рд╣рдо рдЕрдкрдиреА рдмрд╛рддрдЪреАрдд рдХреЛ рд╕рднреНрдп рд░рдЦреЗрдВ, рдФрд░ рдЧреИрд░-рд░рдЪрдирд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдмрдЪреЗрдВред рд╣рдо рдЪреАрдЬреЛрдВ рдкрд░ рдЕрд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рд╕рдореНрдорд╛рдирдЬрдирдХ рдкреНрд░рд╡рдЪрди рдмрдирд╛рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред https://golang.org/conductред
рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ Google рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ
рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк Google рдкрд░ рдЙрд╕ рддрд░рд╣ рдХрд╛ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
@ рд╣рд╕реБрдлреЗрд▓ рд╡рд╣ рдЖрджрдореА рдЬрд░реНрдордиреА рд╕реЗ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░рдХрд░реНрддрд╛ рдХреЗ рдЕрд╣рдВрдХрд╛рд░ рдФрд░ рдмреЗрд╣реЗрдореЛрде рдкреНрд░рдмрдВрдзрди рдХреЛ рдкрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдХрд╡рд╛рд╕ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд╡рд╛рд▓реА рдмрдбрд╝реА рдЖрдИрдЯреА рдХрдВрдкрдирд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпреЗ рд╢рдмреНрджред
@ рд╕рд┐рд░рдХреЛрди рд╡рд╣реА рдЖрдкрдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред рдПрдб-рд╣реЛрдорд┐рдирдо рдФрд░ рд╕рд╛рдорд╛рдЬрд┐рдХ рддрд░реНрдХ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕реАрдУрд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ "рд╕рд╛рдорд╛рдЬрд┐рдХ рддрд░реНрдХ" рдЕрдХреНрд╕рд░ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ: рд╕рдВрдХрд▓рдХ рджреЗрд╡ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ, рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрдирд░ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ, Google рд▓реЛрдЧ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВред
рдирд╣реАрдВ, рд╡реЗ рдирд╣реАрдВ рдХрд░рддреЗред рдХреЛрдИ рдмреМрджреНрдзрд┐рдХ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рд╕рд┐рд░реНрдл рдирд┐рд░реНрдгрдп рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реИред рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓реЗред
рдмрд╛рддрдЪреАрдд рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ (рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдкрдЯрд░реА рдкрд░ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рд▓рд┐рдП @agnivade рдХреЛ рдзрдиреНрдпрд╡рд╛рдж)ред
рджреЛрд╕реНрддреЛрдВ, рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рдЧреЛрдлрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрд▓реЛрдХ рдореЗрдВ рдЗрди рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рдЕрдкрдиреА рднреВрдорд┐рдХрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рд╕рдореБрджрд╛рдп рдореЗрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рд╕рдореНрдорд╛рдирдЬрдирдХ рдФрд░ рдзрд░реНрдорд╛рд░реНрде рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЕрдкрдиреЗ 2-рд╕реЗрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ:
рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рд╡рд┐рдзрд┐ рд╕реЗрдЯ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде) рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рд╛рде рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдирдИ рдЧреНрд░реБрдкрд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдЖрджрд┐рдо (рдпрд╛ рдмреБрдирд┐рдпрд╛рджреА) рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рдирдореЗрдВ рдХреЛрдИ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ (рдмреВрд▓рд┐рдпрди, рдиреНрдпреВрдореЗрд░рд┐рдХ, рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ [] рдмрд╛рдЗрдЯ, [] int, рдЖрджрд┐) рдХреЛ рд╡реИрд╕реЗ рд╣реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд░рддреА рд╣реИред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ _family_ рдирд┐рд░реНрдорд╛рдг рдХреА рддрд░рд╣ рдХреБрдЫ рдЬреЛрдбрд╝реЗрдВред
рд╡рд╛рдХреНрдп рд░рдЪрдирд╛
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
type theFamilyName family {
someType
anotherType
}
рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:
FamilyType = "family" "{" { TypeName ";" } "}" .
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
func Display(s family{string; fmt.Stringer}) { /* function body */ }
рдпрд╣реА рд╣реИ, рдПрдХ-рдкрдВрдХреНрддрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╢реВрдиреНрдп рд╣реИ, рдЬреИрд╕реЗ рд╢реВрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рдеред
(рд╣реБрдб рдХреЗ рддрд╣рдд рдкрд╛рд░рд┐рд╡рд╛рд░рд┐рдХ рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдкреАрдЫреЗ рдмреИрдареЗ рдПрдХ рдореВрд▓реНрдп рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред)
рддрд░реНрдХ
рд╣рдореЗрдВ рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рд╣рдо рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдХреМрди рд╕реЗ рдкреНрд░рдХрд╛рд░ рдорд╛рдиреНрдп рд╣реИрдВред
рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рддрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛, рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред
рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ _Go рдХреЛрдб рдЕрдзрд┐рдХ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг_ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдХреЛрдб рдореЗрдВ рд╣реА рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕ рддрдереНрдп рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рддреЗ рд╣реИрдВ рдХрд┐ "рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред" рдпрд╣ рдереЛрдбрд╝рд╛ рд╢рд░реНрдордирд╛рдХ рд╣реИ рдХрд┐ рдЧреЛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рдФрд░ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░) рдирд┐рд░реНрдорд╛рдг, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рд╣рдо рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, _Nothing_ рдХрд╣рддреЗ рд╣реИрдВред
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг
sql.Rows.Scan
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
Scan converts columns read from the database into the following common Go types and special types provided by the sql package:
*string
*[]byte
*int, *int8, *int16, *int32, *int64
*uint, *uint8, *uint16, *uint32, *uint64
*bool
*float32, *float64
*interface{}
*RawBytes
any type implementing Scanner (see Scanner docs)
рдФрд░ sql.Row.Scan
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ "рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрди рдХрд░реЗрдВ" рд╡рд╛рдХреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП _some рдЕрдиреНрдп function_ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ? рдпрд╣ рдЧреЛ-рдЬреИрд╕реА рдирд╣реАрдВ рд╣реИтАФрдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╡рд╛рдХреНрдп рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Rows.Scan
*RawBytes
рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди Row.Scan
рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдХреНрд╕рд░ рдЧрд╛рд░рдВрдЯреА рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ- "рддреЛ рдЙрд╕ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ" - рдЖрдк рд▓рдЧрднрдЧ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрднреА-рдХрднреА рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреЛ, рдЕрдкрдиреЗ рдЖрдк рдХреА рддрд░рд╣, рд╕рд┐рд░реНрдл рдмрд╛рд╣рд░ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдПрдХ *RawBytes
рдореЗрдВ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ Row.Scan
рдХреЗрд╡рд▓ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж Row.Scan
( рдХрд╣ рд░рд╣рд╛ рд╣реИ "рдПрд╕рдХреНрдпреВрдПрд▓: рд░реЛ рдкрд░ рд░реЙрдмрд╛рдЗрдЯреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рд╕реНрдХреИрди")ред рдпрд╣ рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдРрд╕реА рдЧрд▓рддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
type Value family {
*string
*[]byte
*int; *int8; *int16; *int32; *int64
*uint; *uint8; *uint16; *uint32; *uint64
*bool
*float32; *float64
*interface{}
*RawBytes
Scanner
}
рдЗрд╕ рддрд░рд╣, рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рджрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ Rows.Scan
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд┐рдЪ рдХреЛ рдХрд┐рд╕реА рднреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА; Row.Scan
рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдкрд░рд┐рд╡рд╛рд░ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдмрд╛рдд рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреИрд╕реЗ cloud.google.com/go/datastore.Property
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ interface{}
рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдорд╛рди" рдлрд╝реАрд▓реНрдб рд╣реИ рдФрд░ рдЗрд╕ рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
// Value is the property value. The valid types are:
// - int64
// - bool
// - string
// - float64
// - *Key
// - time.Time
// - GeoPoint
// - []byte (up to 1 megabyte in length)
// - *Entity (representing a nested struct)
// Value can also be:
// - []interface{} where each element is one of the above types
// This set is smaller than the set of valid struct field types that the
// datastore can load and save. A Value's type must be explicitly on
// the list above; it is not sufficient for the underlying type to be
// on that list. For example, a Value of "type myInt64 int64" is
// invalid. Smaller-width integers and floats are also invalid. Again,
// this is more restrictive than the set of valid struct field types.
//
// A Value will have an opaque type when loading entities from an index,
// such as via a projection query. Load entities into a struct instead
// of a PropertyLoadSaver when using a projection query.
//
// A Value may also be the nil interface value; this is equivalent to
// Python's None but not directly representable by a Go struct. Loading
// a nil-valued property into a struct will set that field to the zero
// value.
рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
type PropertyVal family {
int64
bool
string
float64
*Key
time.Time
GeoPoint
[]byte
*Entity
nil
[]int64; []bool; []string; []float64; []*Key; []time.Time; []GeoPoint; [][]byte; []*Entity
}
(рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рд╛рдл-рд╕реБрдерд░реЗ рджреЛ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред)
json.Token
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдКрдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреА рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрдЧреА:
type Token family {
Delim
bool
float64
Number
string
nil
}
рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ:
рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп sql.DB.Exec
, рдпрд╛ sql.DB.Query
, рдпрд╛ рдХреЛрдИ рднреА рдлрд╝рдВрдХреНрд╢рди рдЬреЛ interface{}
рдПрдХ рд╡рд┐рд╡рд┐рдз рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реЗрдЯ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдПрдХ рд╕реНрд▓рд╛рдЗрд╕_, рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ []interface{}
рд╕реЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╕рдордп "рд╕реНрдкреНрд░реЗрдб" рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдпрд╣ рдХрд╣рдирд╛ рдЧрд▓рдд рд╣реИ DB.Exec("some query with placeholders", emptyInterfaceSlice)
; рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ: DB.Exec("the query...", emptyInterfaceSlice...)
рдЬрд╣рд╛рдВ emptyInterfaceSlice
рдХрд╛ рдкреНрд░рдХрд╛рд░ []interface{}
ред рдРрд╕реА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ Value
рдХрд╛ рдПрдХ рднрд┐рдиреНрди рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд╣рд╛рдВ Value
рдХреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ interface{}
рдХреА рдЕрд╢реБрджреНрдзрд┐ рдХреЗ рдХрд╛рд░рдг _рдЕрд╕рд▓реА рдЧрд▓рддрд┐рдпрд╛рдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИрдВ_ред
var x int | float64 | string | rune
z = int(x) + int(y)
z = float64(x) + float64(y)
рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ x
рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ int()
ред
рдореБрдЭреЗ family
рд╣реЛрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рд╡рд╢ (constricted?) рд╣реЛрдЧрд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рд╣рд░ рд╕рдордп рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдорд┐рд▓рд╛рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реА рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ case
ред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдХреНрд╕рд░ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░
рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдиреБрдмрдВрдз, рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рдиреЗ рд▓рдЧрд╛ рдЬреИрд╕реЗ
func foo() (..., error)
рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред
рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЬреЛ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реМрдЯрд╛рддреА рд╣реИрдВред рдХреБрдЫ рдХрд╛рд░реНрдп
рд╡рд╛рдкрд╕реА net.Addr
рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрджрдирд╛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ net.Addr
рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рдЖрдк
рдмрд╛рдж рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА net.Addr
рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХрд╛
рдПрдкреАрдЖрдИ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ рдХрд┐ рдпрд╣ OpError
рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпреЛрдВ рди "рд╕рдВрдХрд▓рди рд╕рдордп" рдпреБрдХреНрддрд┐ рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдП?
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
OpError is the error type usually returned by functions in the net package. It describes the operation, network type, and address of an error.
рдЖрдорддреМрд░ рдкрд░? рдЖрдкрдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВред Read
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдХрд╣реАрдВ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ OpError рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ
err := blabla.(*OpError)
рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрдо рд╕реЗ рдХрдо *OpError | error
рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ
рдРрд╕реА рддреНрд░реБрдЯрд┐ рдФрд░ рд╕рдВрдХрд▓рдХ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
BTW: рдХреНрдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрд░реВрдкрддрд╛ рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдЕрднреА рддрдХ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдпрд╛ рдПрдХ 'рд╡рд┐рд╢реЗрд╖рддрд╛' рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдЕрд░реНрдерд╛рдд:
func calc(a < add(a, a) a >, b a) a {
return add(a, b)
}
func drawWidgets(widgets []< widgets.draw() error >) error {
for _, widgets := range widgets {
err := widgets.draw()
if err != nil {
return err
}
}
return nil
}
a < add(a, a) a
рдЕрд░реНрде рд╣реИ "рдЬреЛ рдХреБрдЫ рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд╡рд╣рд╛рдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдРрдб (рдЯрд╛рдЗрдкрдСрдл рдП, рдЯрд╛рдЗрдкрдСрдл рдП) рдЯрд╛рдЗрдкрдСрдл рдП) рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП"ред < widgets.draw() error>
рдЕрд░реНрде рд╣реИ рдХрд┐ "рдЬреЛ рднреА рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЙрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдбреНрд░рд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ"ред рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
func Sum(a []< add(a,a) a >) a {
sum := a[0]
for i := 1; i < len(a); i++ {
sum = add(sum,a[i])
}
return sum
}
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд╛рд░рдВрдкрд░рд┐рдХ "рдЬреЗрдиреЗрд░рд┐рдХ" рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ)ред
рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рдЖрдк рдмрд╛рдж рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рддрд░рд╣ рдХреЗ
net.Addr
рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред .
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╛рдУ, рд╕рдВрд╕реНрдХрд░рдг subtyping рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдПрдХ func() *FooError
рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ func() error
рдЬрд╣рд╛рдВ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдВрддреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
func Foo() (FooVal, FooError) {
// ...
}
func Bar(f FooVal) (BarVal, BarError) {
// ...
}
func main() {
foo, err := Foo()
if err != nil {
log.Fatal(err)
}
bar, err := Bar(foo) // Type error: Can not assign BarError to err (type FooError)
if err != nil {
log.Fatal(err)
}
}
рдпрд╛рдиреА рдЗрд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдореИрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рдереЗ) рд╣рдо рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рдкреНрд░рдХрд╛рд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЧреЛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рди рдХреЗрд╡рд▓ рдХрд╛рдлреА рдзреАрдореЗ рд╣реЛрддреЗ рд╣реИрдВ (рд╕рдВрдХрд▓рди рдХреЛ рдзреАрдорд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рд░рдирдЯрд╛рдЗрдо рдХреЛ рднреА рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) рдмрд▓реНрдХрд┐ рдмрд╣реБрдд рдХрдо рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рднреА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рде рд╣реА, рдЧреЛ рдХреЗ рдкрд╛рд╕ рд╡реИрд░рд┐рдПрдВрдЯ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк func() *FooError рдХреЛ func() рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдВрддреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА рдХрд┐ рдпрд╣ рдЧреЛ рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рдХрднреА рдареЛрдХрд░ рдирд╣реАрдВ рдЦрд╛рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдЕрднреНрдпрд╛рд╕ рдХреЗрд╡рд▓ error
ред рд▓реЗрдХрд┐рди рд╣рд╛рдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпреЗ рдкреНрд░рддрд┐рдмрдВрдз рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ error
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВред
func main() {
foo, err := Foo()
if err != nil {
log.Fatal(err)
}
bar, err := Bar(foo) // Type error: Can not assign BarError to err (type FooError)
if err != nil {
log.Fatal(err)
}
}
рдореБрдЭреЗ рдРрд╕реА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдареАрдХ рд╣реИ, рдПрд╕реЛрд▓рдВрдЧреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдмрд╕ рдПрдХ "рдЯрд╛рдЗрдк рд╡рд░реНрд▓реНрдб" рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ (рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ variable -> type
рдХрд╛ рдирдХреНрд╢рд╛ рд╣реИ) рдФрд░ рдпрджрд┐ рдЖрдк рдлрд┐рд░ рд╕реЗ - рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк "рдЯрд╛рдЗрдк рд╡рд░реНрд▓реНрдб" рдореЗрдВ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡реИрд╕реЗ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐
var int i = 0;
i = "hi";
рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдЪрд░/рдШреЛрд╖рдгрд╛рдПрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдФрд░ i = "hi"
рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП i
рдкрд░ "рдЯрд╛рдЗрдк рд▓реБрдХрдЕрдк" рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рдХреНрдпрд╛ рдРрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореБрджреНрджреЗ рд╣реИрдВ рдЬреЛ func () *ConcreteError
рдХреЛ func() error
рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдХрд╛рд░рдг/рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХрд╛рд░рдг)? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛:
type MyFunc func() error
type A struct {
}
func (_ *A) Error() string { return "" }
func NewA() *A {
return &A{}
}
func main() {
var err error = &A{}
fmt.Println(err.Error())
var mf MyFunc = MyFunc(func() error { return NewA() }) // type checks fine
//var mf MyFunc = MyFunc(NewA) // doesn't type check
_ = mf
}
рдпрджрд┐ рдЖрдк func (a, b) c
рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ func (x, y) z
рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рддреЛ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ z
c
(рдФрд░ a
, b
рдХреЛ x
, y
рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп/рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде/рд╕рдВрдЧрдд рд╣реИ)ред рдмреЗрд╢рдХ, рдХреНрдпрд╛ рдпрд╣ рд░рдирдЯрд╛рдЗрдо/рд╕рдВрдХрд▓рди рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ ... рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╕рдЦреНрддреА рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЛ рджреЗрдЦрдХрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдХреНрдпреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ x
рдХреЛ a
рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ func () x
рдХреЛ func () a
рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдмреЗрд╢рдХ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рд░рдирдЯрд╛рдЗрдо рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛) рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрднрд╡ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред (рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЕрд╕рд▓реА рдХреНрд░реВрдХреНрд╕ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ)ред
рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдк _рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд╛рд▓_ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░реИрдкрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдЬреИрд╕реЗ рдЙрдкрд░реЛрдХреНрдд рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ) рдХреЗ рд╕рд╛рде рд░рдирдЯрд╛рдЗрдо рдореБрджреНрджреЛрдВ (рдпрджрд┐ рд╡рд╣рд╛рдВ рд╣реИрдВ) рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ funcs рдХреЗ рд╕рд╛рде funcs рдХреА рддреБрд▓рдирд╛ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджреЗрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд▓рдкреЗрдЯрд╛ func func рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ)ред
рдореБрдЭреЗ рдРрд╕реА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдареАрдХ рд╣реИ, рдПрд╕реЛрд▓рдВрдЧреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░)
рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдПрдВ рдЖрдорддреМрд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ (рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ)ред рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдЗрд╕рд╕реЗ рдареАрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧреА - рдХрдо рд╕реЗ рдХрдо рдЬрдм рддрдХ рдЖрдк FooError
рдпрд╛ BarError
рдХрд┐рд╕реА рдЕрдиреНрдп рдЧреБрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕реЗ рдЪрд╛рд╣рд┐рдП рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рдХрд┐ err
error
рдФрд░ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯреЗрдВред рдмреЗрд╢рдХ, рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдЯреАрдХ рд╕реНрдерд┐рддрд┐ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡реИрд╕реЗ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐
рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, i
рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреЛ рдХрд┐ int
рдФрд░ рдЬрдм рдЖрдк string
рдЗрд╕рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдмреАрдЪ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рд╣рд░ рдЙрдкрдпреЛрдЧ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреНрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдкрд░ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рддрдм рджрд┐рдП рдЧрдП рд╕рднреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдЕрдиреБрдмрдВрдз)ред рдпрд╣реА рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИрдВред
рдХреНрдпрд╛ рдРрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореБрджреНрджреЗ рд╣реИрдВ рдЬреЛ
func () *ConcreteError
рдХреЛfunc() error
рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдХрд╛рд░рдг/рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХрд╛рд░рдг)?
рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ func
рд╡реЗ рд╢рд╛рдпрдж рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ (рдЕрди/-рд░реИрдкрд┐рдВрдЧ рдХреЛрдб рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдХреЗ, рдЗрд╕реА рддрд░рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдкрд╛рд╕рд┐рдВрдЧ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЧреЛ рдореЗрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рд▓рд┐рдЦрд╛ рдФрд░ рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЬреЛ рдореБрдЭреЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЬреЛрдбрд╝рдиреЗ рд▓рд╛рдпрдХ рд╣реИред рдпрд╛рдиреА рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд╛рд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдХреЗ рд╕рд╛рде рдХрд┐ рдпрд╣ funcs рдХреЗ рд╕рд╛рде funcs рдХреА рддреБрд▓рдирд╛ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджреЗрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд▓рдкреЗрдЯрд╛ func рдЙрд╕ func рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рд▓рдкреЗрдЯрддрд╛ рд╣реИ)ред
funcs рддреБрд▓рдиреАрдп рдирд╣реАрдВ рд╣реИрдВред
рд╡реИрд╕реЗ рднреА, рдЯреАрдмреАрдПрдЪ, рдпрд╣ рд╕рдм рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рд╖рдп рд▓рдЧрддрд╛ рд╣реИ :)
рдПрдлрд╡рд╛рдИрдЖрдИ: рдореИрдВрдиреЗ рдЕрднреА рдпрд╣ рдХрд┐рдпрд╛ рд╣реИ ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред (# 19814 рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
рдореБрдЭреЗ рдкрд╛рд░реНрдЯреА рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рднреА рдЧреЛ рдХреЗ 4 рд╕рд╛рд▓ рдмрд╛рдж рдЕрдкрдиреА рднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
рдЙрди рдкрд┐рдЫрд▓реЗ 4 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реА рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдорд┐рд▓реА рд╣реИрдВ:
nil
рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ ("рдЧреЛ рдПрдХ рдЖрд╕рд╛рди рднрд╛рд╖рд╛ рд╣реИ" рдХрдерди рдХреЛ рдЦрд░рд╛рдм рдордЬрд╛рдХ рдХреА рддрд░рд╣ рдзреНрд╡рдирд┐ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рдирд░рдХ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ)редnil
(рд╣рд╛рдБ!)рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрди рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд┐рдЫрдбрд╝реЗ рдЕрд╕рдВрдЧрдд рдЧреЛ 2.0.0 (рдЧреЛ 2 рдирд╣реАрдВ) рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рдХрднреА рднреА рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рд╡реИрд╕реЗ рднреА...
рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛:
// Divide returns either a float64 or an arbitrary error
func Divide(dividend, divisor float64) float64 | error {
if dividend == 0 {
return errors.New("dividend is zero")
}
if divisor == 0 {
return errors.New("divisor is zero")
}
return dividend / divisor
}
func main() {
// type-switch statements enforce completeness:
switch v := Divide(1, 0).(type) {
case float64:
log.Print("1/0 = ", v)
case error:
log.Print("1/0 = error: ", v)
}
// type-assertions, however, do not:
divisionResult := Divide(3, 1)
if v, ok := divisionResult.(float64); ok {
log.Print("3/1 = ", v)
}
if v, ok := divisionResult.(error); ok {
log.Print("3/1 = error: ", v.Error())
}
// yet they don't allow asserting types not included in the union:
if v, ok := divisionResult.(string); ok { // compile-time error!
log.Print("3/1 = string: ", v)
}
}
рдЗрдВрдЯрд░рдлреЗрд╕ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реИрдВ , рд╡реЗ рджреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЬрд╛рдирд╡рд░ рд╣реИрдВред рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рдЯрд╛рдЗрдк-рд╕реНрд╡рд┐рдЪ рдкреВрд░реНрдг рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдорд╛рдорд▓реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЯрд╛рдЗрдк-рдПрд╕реЗрд░реНрд╢рди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмрд╣реБрдд рдмрд╛рд░ рдореИрдВрдиреЗ рд▓реЛрдЧреЛрдВ рдХреЛ _non-nil рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ nil value_ : https://play.golang.org/p/JzigZ2Q6E6F рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рджреЗрдЦрд╛ рд╣реИ ред рдЖрдо рддреМрд░ рдкрд░, рд▓реЛрдЧ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рдПрдХ error
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реВрдЪрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ nil
, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╢реВрдиреНрдп-рд╕рдХреНрд╖рдо рдмрдирд╛рдирд╛ рдПрдХ рдЧрд▓рддреА рдереАред
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рд░рд┐рд╕реЗрдкреНрд╢рдирд┐рд╕реНрдЯ рдХреА рддрд░рд╣ рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдЖрдк рдЗрд╕рд╕реЗ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдЗрдВрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЛ рдореЗрдВ, рдпрд╣ рдПрдХ рдХрд╛рд░реНрдбрдмреЛрд░реНрдб рдЖрдХреГрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЕрдЧрд░ рдЖрдк рдЗрд╕рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рддреЛ рджреБрдирд┐рдпрд╛ рдЕрдЪрд╛рдирдХ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧреАред
рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ (рд╢рд╛рдпрдж-рдкреНрд░рдХрд╛рд░) рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП nil
рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдереА:
type CustomErr struct {}
func (err *CustomErr) Error() string { return "custom error" }
func CouldFail(foo int) error | nil {
var err *customErr
if foo > 10 {
// you can't return a nil pointer as an interface value
return err // this will panic!
}
// no error
return nil
}
func main() {
// assume no error
if err, ok := CouldFail().(error); ok {
log.Fatalf("it failed, Jim! %s", err)
}
}
рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рд╢рд╛рдпрдж-рдкреНрд░рдХрд╛рд░ рд╡рд┐рдирд┐рдореЗрдп рдирд╣реАрдВ рд╣реИрдВред рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЦрд░рд╛рдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:
// P returns a pointer to T, but it's not clear whether or not the pointer
// will always reference a T instance. It might be an optional T,
// but the documentation usually doesn't tell you.
func P() *T {}
// O returns either a pointer to T or nothing, this implies (but still doesn't guarantee)
// that the pointer is always expected to not be nil, in any other case nil is returned.
func O() *T | nil {}
рдлрд┐рд░ JSON рднреА рд╣реИред рдпрд╣ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб (рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝реАрд▓реНрдб рд╕рд╣рд┐рдд) JSON рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ JSON unmarshaller рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
type DataModel struct {
// Optional needs to be type-checked before use
// and is therefore allowed to no be included in the JSON document
Optional string | nil `json:"optional,omitempty"`
// Required won't ever be nil
// If the JSON document doesn't include it then unmarshalling will return an error
Required *T `json:"required"`
}
рдкреА.рдПрд╕.
рдореИрдВ рдЗрд╕ рд╕рдордп рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдореИрдВ рд╡рд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
read = (s String) -> (Array<Byte> or Error) => match s {
"A" then Error<NotFound>
"B" then Error<AccessDenied>
"C" then Error<MemoryLimitExceeded>
else Array<Byte>("this is fine")
}
main = () -> ?Error => {
// assume the result is a byte array
// otherwise throw the error up the stack wrapped in a "type-assertion-failure" error
r = read("D") as Array<Byte>
log::print("data: %s", r)
}
рдореИрдВ рдЗрд╕реЗ рдПрдХ рджрд┐рди рд╕рдЪ рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдереЛрдбрд╝реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
рд╢рд╛рдпрдж рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореВрд▓реНрдп рд▓рд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛред
рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ nil
рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧрд╛ ред рдпрд╣рд╛рдВ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рджрд┐рдП рдЧрдП рд╣реИрдВ (рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛ рдкрд╣рд▓реЗ рд╣реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ):
<any pointer type> | nil
nil
рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рд╢реВрдиреНрдп рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рдХрд╛рд░ <pointer type> | nil
ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:var n *int = nil // Does not compile, wrong type
var n *int | nil = nil // Ok!
var set map[string] bool = nil // Does not compile
var set map[string] bool | nil = nil // Ok!
var myFunc func(int) err = nil // Nope!
var myFunc func(int) err | nil = nil // All right.
рд╡реЗ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ:
| nil
рд╡рд┐рднреЗрджрд┐рдд рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛var maybeAString *string // Wrong: invalid initial value
var maybeAString *string | nil // Good
var value int = 42
var barePointer *int = &value // Valid
var nilablePointer *int | nil = &value // Valid
nilablePointer = barePointer // Valid
barePointer = nilablePointer // Invalid: Incompatible types
nilablePointer
рд╕реЗ barePointer
рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:switch val := nilablePointer.(type) {
case *int:
barePointer = val // Yeah! Types are compatible now. It is imposible that "val = nil"
case nil:
// Do what you need to do when nilablePointer is nil
}
рдФрд░ рдмрд╕ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реА рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ), рд▓реЗрдХрд┐рди рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЬреЛ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдЪрд┐рдкрдХреЗ рд╣реБрдП рд╣рдо рдХрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдореВрд▓реНрдп рд▓рд╛рдПрдВрдЧреЗред рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд░рдирд╛ред
рдЗрд╕ рд╕рд░рд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЬреЛ рд▓рд╛рдн рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ:
nil pointer dereference
рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА! рдореИрдВmap | nil
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАрд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЕрдореВрд░реНрдд рднреА рд╣реИ рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореВрд▓реНрдп рд▓рд╛рддрд╛ рд╣реИ: рдорди рдХреА рд╢рд╛рдВрддрд┐ рдбреЗрд╡рд▓рдкрд░ ред рдЖрдк рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕, рдлрд╝рдВрдХреНрд╢рдВрд╕, рдЪреИрдирд▓реНрд╕, рдореИрдкреНрд╕ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЖрд░рд╛рдо рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЙрдирдХреЗ рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред _рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░реВрдВрдЧрд╛!_ ЁЯШВ
рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЗрд╕ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреВрд░реНрдг рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХреЗрдЧрд╛, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрджрдо рджрд░ рдХрджрдо рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝реЗрдЧрд╛ (рдореЗрд░реЗ рд▓рд┐рдП, рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рд░рд┐рдЯрд░реНрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдХрджрдо рд╣реИ) , рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЕрдм рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ)ред
рдПрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдпрд╣ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рднреА рдкрд┐рдЫрдбрд╝рд╛ рдЕрд╕рдВрдЧрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ gofix
рджреНрд╡рд╛рд░рд╛ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдмрд╕ рд╕рднреА рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ <pointer type> | nil
рдмрджрд▓реЗрдВред
рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ? рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рд╢реВрдиреНрдп-рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рддреЗрдЬреА рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ ("рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ") рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рддрд░реАрдХрд╛ рд╣реИред
@alvaroloes
рдЖрдк рдПрдХ рдирдВрдЧреЗ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкреНрд░рд╛рд░рдВрднреАрдХреГрдд рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред
рдпрд╣реА рдЗрд╕ рдорд╛рдорд▓реЗ рдХрд┐ рдЬрдбрд╝ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЧреЛ рдХрд░рддрд╛ рд╣реИ - рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдкреВрд░реНрдг рд╡рд┐рд░рд╛рдоред рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдЙрддреНрддрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП make([]T, 100)
рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдЕрдиреНрдп рдмрд╛рддреЗрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдкрд░ рдШрдмрд░рд╛рдиреЗ рд╡рд╛рд▓реЗ рд╢реВрдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░) рдЗрд╕ рдореВрд▓ рдирд┐рдпрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред (рдФрд░ рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЪ рд╣реИ рдХрд┐ рд╢реВрдиреНрдп-рд╕реНрд▓рд╛рдЗрд╕ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ - рдПрдХ рд╢реВрдиреНрдп-рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЙрддрдирд╛ рд╣реА рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрдЧреА рдЬрд┐рддрдирд╛ рдХрд┐ рд╢реВрдиреНрдп-рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд▓рд┐рдЦрдирд╛)ред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ: рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╕реБрдВрджрд░ рдореМрд▓рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдп рд╕реЗ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛ рд╢реВрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЙрдкрдпреЛрдЧреА рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рди рдХреЗрд╡рд▓ рд╕рдм рдХреБрдЫ рд╢реВрдиреНрдп рдорд╛рди рджреЗ рд░рд╣рд╛ рд╣реИред рд╢реВрдиреНрдп рдирдХреНрд╢рд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рддреЛ рдХреНрдпреЛрдВ рди рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдЧреЛ рдХреЛ рдмрджрд▓рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрд╡рд┐рдлреНрдЯ рдФрд░ рдЕрдиреНрдп рдХреА рддрд░рд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ/рдЧреИрд░-рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рд╕рднреА рд▓реЗрдХрд┐рди:
<pointer type> | nil
рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАредрддреЛ рдХреНрдпреЛрдВ рди рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВред
рдКрдкрд░ рджреЗрдЦреЛред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЬреЛ рд╕рд╕реНрддреА рджрд┐рдЦрддреА рд╣реИрдВ, рдЙрдирдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╣реА рдЧреИрд░-рддреБрдЪреНрдЫ рд▓рд╛рдЧрддреЗрдВ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИрдВред
рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдЧреЛ рдХреЛ рдмрджрд▓рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд░рд╣реЗрдЧрд╛
рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдиреЗ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВред рдЬрд┐рд╕рдХрд╛ рд╡рдЬрди рднрд╛рд░реА рд╣реЛрддрд╛ рд╣реИ рд╡рд╣ рд╡рд░реАрдпрддрд╛ рдФрд░ рдЯреНрд░реЗрдбрдСрдл рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЧреЛ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдиреЗ рдЗрд╕реЗ рдЪреБрдирд╛ред
рдПрдлрдЯреАрдЖрд░, рдпрд╣ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдФрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд┐рд╕реА рднреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░рддрд┐рд╡рд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ - рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╢реВрдиреНрдп рдорд╛рди рдХреНрдпрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдирдП рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдж рддрдХ рдирд┐рд░рд╛рд╢рд╛ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рдЬреЛ рдЗрди рджрд┐рдиреЛрдВ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрд╛рдХреА рдХреЗ рдзрд╛рдЧреЗ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджреЗрддреЗ рд╣реИрдВред
рдЖрд╣! рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рдерд╛ред рджреЛрд╣! "рд╕рд░рд▓" рд╢рдмреНрдж рдХреЗ рдЬрдЯрд┐рд▓ рдЕрд░реНрде рд╣реИрдВред рдареАрдХ рд╣реИ, рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ "рд╕рд░рд▓" рд╢рдмреНрдж рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдпрд╣ рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдерд╛ред рдореЗрд░рд╛ рдЗрд░рд╛рджрд╛ рдереЛрдбрд╝реА рдорджрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдерд╛ред рдореИрдВ рдзрд╛рдЧреЗ рдХреЗ рд╕рд╛рде рдмрдиреЗ рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЦрд╛рд▓реА рд╕рдордп рдирд╣реАрдВ рд╣реИред
рд╡рд╛рдкрд╕ рдорд╛рдорд▓реЗ рдкрд░: рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╢реВрдиреНрдп рдорд╛рди рд╣реИред
рдХреБрдЫ рджреЗрд░ рд╕реЛрдЪрдиреЗ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореВрд▓реНрдп рдЬреЛрдбрд╝ рд╕рдХрддреА рд╣реИ рдФрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
рдЕрдЧрд░ рдореБрдЭреЗ рд╕рд╣реА рд╕реЗ рдпрд╛рдж рд╣реИ, рддреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдореЗрдВ рдЗрд╕рдХреА рдореЗрдореЛрд░реА рд╕реНрдкреЗрд╕ рдХреЛ 0 рд╕реЗ рднрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ рдЧреИрд░-рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрдЧ рдХрд╛ рдПрдХ рд╕реНрд░реЛрдд рд╣реИ:
type S struct {
n int
}
var s S
s.n // Fine
var s *S
s.n // runtime error
var f func(int)
f() // runtime error
рддреЛ рдХреНрдпрд╛ рд╣реБрдЖ рдЕрдЧрд░ рд╣рдо:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рдореБрджреНрджреЗ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдореБрдЦреНрдп рд╣реЛрд▓реНрдбрд┐рдВрдЧ-рдмреИрдХ рдкреЙрдЗрдВрдЯ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрди рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
| рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ | рд╢реВрдиреНрдп рдорд╛рди | рдЧрддрд┐рд╢реАрд▓ рд╢реВрдиреНрдп рдорд╛рди | рдЯрд┐рдкреНрдкрдгреА |
| --- | --- | --- | --- |
| *рдЯреА | nil
| рдирдпрд╛ (рдЯреА) |
| []рдЯреА | nil
| []рдЯреА{} |
| рдирдХреНрд╢рд╛ [рдЯреА] рдпреВ | nil
| рдирдХреНрд╢рд╛[рдЯреА]рдпреВ{} |
| func
| nil
| рдиреЛрдк | рддреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рд╢реВрдиреНрдп рдорд╛рди рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рдорд╛рди рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рд╕реВрдЪреА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ error
, рддреЛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░реБрдЯрд┐ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди "рдХреЛрдИ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ" рд╣реИ |
| chan T
| nil
| рдореЗрдХ (рдЪрд╛рди рдЯреА) |
| interface
| nil
| - | рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╣рд╛рдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд noop
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ |
| рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рд╕рдВрдШ | nil
| рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рд╢реВрдиреНрдп рдорд╛рди | |
рдЕрдм, рдЬрдм рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ nil
, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдЕрднреА рд╣реИрдВред рдЕрдВрддрд░ рдЙрд╕ рдХреНрд╖рдг рдХрд╛ рд╣реИ рдЬрдм nil
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕ рд╕рдордп, рдЧрддрд┐рд╢реАрд▓ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:
type S struct {
n int
}
var s *S
if s == nil { // true. Nothing different happens here
...
}
s.n = 1 // At this moment the go runtime would check if it is nil, and if it is,
// do "s = new(S)". We could say the code would be replaced by:
/*
if s == nil {
s = new(S)
}
s.n = 1
*/
// -------------
var pointers []*S = make([]*S, 100) // Everything as usual
for _,p := range pointers {
p.n = 1 // This is translated to:
/*
if p == nil {
p = new(S)
}
p.n = 1
*/
}
// ------------
type I interface {
Add(string) (int, error)
}
var i I
n, err := i.Add("yup!") // This method returns 0, and the default error "Noop"
if err != nil { // This condition is true and the error is returned
return err
}
рдореИрдВ рд╢рд╛рдпрдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдореБрдЦреНрдп рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢реВрдиреНрдп-рдЪреЗрдХ тАЛтАЛрдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдХрд╣реВрдВрдЧрд╛:
рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдмрддрд╛рдП рдЧрдП рд╕рднреА рд▓рд╛рдн рд╣реИрдВ, рд╕рд╛рде рд╣реА рдпрд╣ рднреА рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдЬреЛ рдХрд┐ рдХреЗрд╡рд▓ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛), рдЧреЛ рдХреЛрдб рдХреЛ рдЙрддрдирд╛ рд╣реА рд╕рд╛рдл рд░рдЦрддреЗ рд╣реБрдП рдпрд╣ рдЕрднреА рд╣реИред
рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ? рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рд╣реЛ рдЪреБрдХреА рд╣реИред рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА-рдкреНрд░рд╕реНрддрд╛рд╡ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ nil
рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╢реВрдиреНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ: рдЙрдкрдпреЛрдЧреА рд╢реВрдиреНрдп рдорд╛рдиред
рд╡рд╛рдкрд╕ рдорд╛рдорд▓реЗ рдкрд░: рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╢реВрдиреНрдп рдорд╛рди рд╣реИред
рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рддрдХрдиреАрдХреА рдХрд╛рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдХреНрд░рдорд┐рдХ рдорд░рдореНрдордд рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВ (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред рдпрд╛рдиреА рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, "рдореБрдЦреНрдп" рдХреМрди рд╕рд╛ рдХрд╛рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рд╛рдж рдФрд░ рд╡рд░реАрдпрддрд╛ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред
рддреЛ рдХреНрдпрд╛ рд╣реБрдЖ рдЕрдЧрд░ рд╣рдо:
- рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╢реВрдиреНрдп рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
- рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ (рдЖрд▓рд╕реА рдкреНрд░рд╛рд░рдВрдн)ред
рдпрджрд┐ рдЖрдк рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ
func F(p *T) {
*p = 42 // same as if p == nil { p = new(T) } *p = 42
}
func G() {
var p *T
F(p)
fmt.Println(p == nil) // Has to be true, as F can't modify p. But now F is silently misbehaving
}
рдпрд╣ рдЪрд░реНрдЪрд╛ рд╕рдм рдХреБрдЫ рд╣реИ рд▓реЗрдХрд┐рди рдирдИ рд╣реИред рдРрд╕реЗ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╡реЗ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ :)
рдпрд╣реА рдЗрд╕ рдорд╛рдорд▓реЗ рдХрд┐ рдЬрдбрд╝ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЧреЛ рдХрд░рддрд╛ рд╣реИ - рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдкреВрд░реНрдг рд╡рд┐рд░рд╛рдоред рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрдХ ([] рдЯреА, 100) рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
рдпрд╣ (рдФрд░ new(T)
) рдХреЛ рдЕрд╕реНрд╡реАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ T
рдорд╛рди рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ make([]T, 0, 100)
рдФрд░ рдлрд┐рд░ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП append
рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмрдбрд╝рд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛ ( v[:0][:100]
) рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред [10]T
рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд╕рдВрднрд╡ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐ рдХрд┐рд╕реА рд╕рд░рдгреА рд╕реВрдЪрдХ рдореЗрдВ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдореБрдЦрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреА)ред рдФрд░ рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЬреЗрдирд░рд┐рдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреЗрд╢ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реЛрдиреЗ рддрдХ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдХреБрдЫ рдмрд╛рдзреНрдпрддрд╛ рдХреЛ рдкреВрд░рд╛ рди рдХрд░реЗрдВред рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕рдмрд╕реЗрдЯ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдЖрд░рдВрднреАрдХрд░рдг рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд╛рдлреА рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рднреАред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓рд╛рдЧрдд/рд▓рд╛рдн рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд╛рдЧрдд рдкрдХреНрд╖ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИред рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдмреВрдЭрдХрд░ рдкрд╕рдВрдж ("рд╣рдореЗрд╢рд╛ рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИ") рдХреЗ рдмрдЬрд╛рдп рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЯреНрд░реИрдХрд┐рдВрдЧ рдкрд╣рд▓реЗ рджрд┐рди рд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдереАред
рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рддрдХрдиреАрдХреА рдХрд╛рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдХреНрд░рдорд┐рдХ рдорд░рдореНрдордд рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддреЗ рд╣реИрдВ (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред рдпрд╛рдиреА рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, "рдореБрдЦреНрдп" рдХреМрди рд╕рд╛ рдХрд╛рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рд╛рдж рдФрд░ рд╡рд░реАрдпрддрд╛ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдореИрдВ рдпрд╣ рд╕рдордЭрддрд╛ рд╣реВрдБред рд╣рдореЗрдВ рдмрд╕ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рднреА рджреЗрдЦрдирд╛ рд╣реИ (рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдмрд┐рдВрджреБ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ: рдкрд▓рдХ :) рдЬрд╣рд╛рдВ рд╡реЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдЧреЛ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ? рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рд╣рдо рд╕рднреА рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)
рдпрджрд┐ рдЖрдк рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ (...)
рдореБрдЭреЗ рдпрд╣ рдареАрдХ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╡рд┐рдлрд▓рддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ nil
рдорд╛рди рд╡рд╛рд▓рд╛ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдк рдЙрд╕ рдорд╛рди рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рдЙрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рдореБрдЭреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рджреЗрдВ:
// Augmenting your example with more comments:
func FCurrentGo(p *T) {
// Here "p" is just a value, which happens to be a pointer type. Doing...
*p = 42
// ...without checking first for "nil" is the recipe for hiding a bug that will crash the entire program,
// which is exactly what is happening in current Go code bases
// The correct code would be:
if p == nil {
// panic or return error
}
*p = 42
}
func FWithDynamicZero(p *T) {
// Here, again, p is just a value of a pointer type. Doing...
*p = 42
// would allocate a new T and assign 42. It is true that this doesn't have any effect on the "outside
// world", which could be considered "incorrect" because you expected the function to do that.
// If you really want to be sure "p" is pointing to something valid in the "outside world", then
// check that:
if p == nil {
// panic or return error
}
*p = 42
}
func main() {
var p *T
FCurrentGo(p) // This will crash the program
FWithDynamicZero(p) // This won't have any effect on "p". This is expected because "p" is not pointing
// to anything. No crash here.
fmt.Println(p == nil) // It is true, as expected
}
рдЧреИрд░-рд╕реВрдЪрдХ рд░рд┐рд╕реАрд╡рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реЛ рд░рд╣реА рд╣реИ, рдФрд░ рдпрд╣ рдирдП рдЖрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рд╕рдордЭ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ):
type Point struct {
x, y int
}
func (p Point) SetXY(x, y int) {
p.x = x
p.y = y
}
func main() {
p := Point{x: 1, y: 2}
p.SetXY(24, 42)
pointerToP := &Point{x: 1, y: 2}
pointerToP.SetXY(24, 42)
fmt.Println(p, pointerToP) // Will print "{1 2} &{1 2}", which could confuse at first
}
рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛:
рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдПрдХ рд╣реА рд╣реИ: рдХреБрдЫ рднреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди, рдореЗрд░реЗ рд▓рд┐рдП, рдП) рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╣реИ (рдкреВрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ!)ред
рдмреА) рдХреЛ "рдореВрдХ рддреНрд░реБрдЯрд┐" рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдиреВрдВрдЧрд╛ред рдпрд╣ рдХреЗрд╡рд▓ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмрдбрд╝реЗ рд▓рд╛рднреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рд▓рд╛рддрд╛ рд╣реИред
рдиреЛрдЯ: рдореИрдВ "рдореЗрд░реЗ" рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ рдмрдЪрд╛рд╡ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ) рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЕрдЧрд░ рдХреБрдЫ рдЕрдиреНрдп рдмрд┐рдВрджреБ рд╣реИрдВ рдЬреЛ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдФрд░ рджреВрд╕рд░реА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ
рдиреЛрдЯ 2: рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХреЗрд╡рд▓ "рд╢реВрдиреНрдп" рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рд╕рдВрдШреЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдмрдирд╛рдКрдВрдЧрд╛
рдареАрдХ рд╣реИ, рдореИрдВ рдпрд╣ рд╕рдордЭрддрд╛ рд╣реВрдБред рд╣рдореЗрдВ рдмрд╕ рджреВрд╕рд░реЗ рд▓реЛрдЧреЛрдВ рдХрд╛ рдирдЬрд░рд┐рдпрд╛ рднреА рджреЗрдЦрдирд╛ рд╣реИ (рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рдд рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ )
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╣ рддрд▓рд╡рд╛рд░ рджреЛрдиреЛрдВ рддрд░рд╣ рд╕реЗ рдХрдЯрддреА рд╣реИред рдЖрдкрдиреЗ рдХрд╣рд╛ "рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдерд╛
рдпрд╣ рд╡рд┐рдлрд▓рддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкреЙрдЗрдВрдЯрд░ рд▓реЗ рд░рд╣рд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЕрдХреНрд╕рд░, рдкреЙрдЗрдВрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рд╕рдорд╛рд░реЛрд╣ рдЪреБрдкрдЪрд╛рдк рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдПрдХ рдмрдЧ рдорд╛рдирддрд╛ рд╣реВрдВред рдпрд╛ рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рддрд░реНрдХ рд╣реИ, рдХрд┐ рдЗрд╕ рддрд░рд╣ рдПрдХ рд╢реВрдиреНрдп-рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рд░реЛрдХрдХрд░, рдЖрдк рдмрдЧ рдХреА рдПрдХ рдирдИ рд╢реНрд░реЗрдгреА рдкреЗрд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реВрдиреНрдп-рд╕реВрдЪрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╣рд╛рдВ рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ - рдФрд░ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдЬрд╛рд░реА рд░рдЦрдиреЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдореИрдВ рдЧреИрд░-рдиреАрд▓реЗрдмрд▓ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд╕ рдмрдЧ рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрдХрдбрд╝рдиреЗ рдХреЗ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдореВрд▓реНрдп рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрд╕ рдмрдЧ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдореЗрдВ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред
рдпрд╛рдиреА рдРрд╕рд╛ рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЧреИрд░-рд╢реВрдиреНрдп рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдПрдХ рддрд░рд╣ рдХреА рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдЙрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП, рд░рдирдЯрд╛рдЗрдо-рдкреИрдирд┐рдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд┐рд░реНрдл рдПрдХ рд▓рдХреНрд╖рдг рд╣реИ - рд╕рдорд╕реНрдпрд╛ рдЧрд▓рддреА рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдореЗрдВ рдмрдЧ рд╣реИ nil
рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрдЧ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЧреИрд░-рд╕реВрдЪрдХ рд░рд┐рд╕реАрд╡рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕реА рд╣реА рд╕реНрдерд┐рддрд┐ рд╣реЛ рд░рд╣реА рд╣реИ
рдореИрдВ рдпрд╣ рд╕рд╛рджреГрд╢реНрдп рдирд╣реАрдВ рдЦрд░реАрджрддрд╛ред рдЖрдИрдПрдордУ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ
func Foo(p *int) { *p = 42 }
func main() {
var v int
Foo(&v)
if v != 42 { panic("") }
}
рд╕рд╣реА рдХреЛрдб рд╣реЛрдирд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ
func Foo(v int) { v = 42 }
func main( ){
var v int
Foo(v)
if v != 42 { panic("") }
}
рд╕рд╣реА рд╣реЛрдирд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЧреЛ рдореЗрдВ рдПрдХ рдкреВрд░реНрдг рд╢реБрд░реБрдЖрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдРрд╕реА рднрд╛рд╖рд╛ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдПрдХ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдкрд╛рдпрдерди рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗрд╡рд▓ рдЕрдзрд┐рдХрддрд░ рдореВрд▓реНрдп рд╕рдВрджрд░реНрдн рдмрдирд╛рддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдЖрдИрдПрдордУ, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╡реНрдпрд░реНрде рд╣реИ, рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдмрдирд╛рдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд░рд┐рдЪрд┐рддрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдиреБрднрд╡реА рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рднреА рдкреЙрдЗрдВрдЯрд░ рд░рд┐рд╕реАрд╡рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрдиреЗ рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рджреЗрдЦрддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рд╕рд╣реА рдХрд╣рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, nil
-рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрдкреВрд░реНрдг рддрд░реНрдХ рд╣реИ , рдХрд┐ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рд╣реА рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдПрдХ рд╣реА рд╣реИ: рдХреБрдЫ рднреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред
рдЖрдИрдПрдордУ рд╡рд░реНрддрдорд╛рди рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдореЗрдВ рдлрд┐рдХреНрд╕ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рд╢реВрдиреНрдп рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдПрдХ рдмрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдЬреИрд╕реЗ, рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ
// The correct code would be:
if p == nil {
// panic or return error
}
*p = 42
рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рдХреЛрдб рдХреЛ рд╕рд╣реА рдирд╣реАрдВ рдорд╛рдирддрд╛ред nil
-рдЪреЗрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ nil
рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИред
рд▓реЗрдХрд┐рди, рдореЗрд░реЗ рд▓рд┐рдП, рдП) рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╣реИ (рдкреВрд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ!)ред
рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕ рдкрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реЛрдВрдЧреЗред рдореИрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдХреЛ рд╣рдореЗрд╢рд╛ рднреНрд░рд╖реНрдЯ рдбреЗрдЯрд╛ рдФрд░ рдЧрд▓рдд рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдорд╛рдирддрд╛ рд╣реВрдВред рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореЗрд░реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ рдФрд░ рди рд╣реА рдХрднреА рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдХрдо рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореЗрд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдмрдЧреНрд╕ рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрдирдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореЗрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдмрдЧ рд╣реЛрдВрдЧреЗ рдФрд░ рдЬрдм рд╡реЗ рд╕рд╛рдордиреЗ рдЖрдПрдВрдЧреЗ рддреЛ рдмрд╕ рдХрд╣рд░ рдмрд░рдкрд╛рддреЗ рд░рд╣реЗрдВрдЧреЗред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╣ рддрд▓рд╡рд╛рд░ рджреЛрдиреЛрдВ рддрд░рд╣ рд╕реЗ рдХрдЯрддреА рд╣реИред рдЖрдкрдиреЗ рдХрд╣рд╛ "рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдерд╛"ред рдЙрд╕ рдХрдерди рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рд╣реИ рдЬреЛ рджрд┐рдП рдЧрдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд░рдЦрддрд╛ рд╣реИ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо, рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдХреЛ рдЙрд╕ рдкреНрд░рд╢реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдП рдЬрд╣рд╛рдВ рд╣рдо рдорд╛рди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реИред
рдЦреИрд░, рдореИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЕрдЧрд░ рдпрд╣реА рдмрд╛рдд рд╕рдордЭ рдореЗрдВ рдЖрддреА рддреЛ рд╢рд╛рдпрдж рдореИрдВрдиреЗ рд╕рд╣реА рд╢рдмреНрджреЛрдВ рдХрд╛ рдЪреБрдирд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реЛрддрд╛ рдФрд░ рдореИрдВ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВред рдореИрдВ рдмрд╕ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдмрд╕ред
рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ _"... рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░рдг рдЬреЛ рдЗрд╕реЗ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ..."_ рдЖрдкрдХреЗ рд╡рд╛рдХреНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ_"рдпрд╣ рдорд╛рдорд▓рд╛ рдХреА рдЬрдбрд╝ рд╣реИ"_ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЬрд┐рдХреНрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рд╢реВрдиреНрдп рдорд╛рди рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдмрд╛рдд рдереАред рддреЛ рдпрд╣ рдореЗрд░реА рдмреБрд░реА рдзрд╛рд░рдгрд╛ рдереАред
nil
рдЪреБрдкрдЪрд╛рдк рдмрдирд╛рдо рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред "рдбрд╛рдпрдиреЗрдорд┐рдХ рдЬрд╝реАрд░реЛ рд╡реИрд▓реНрдпреВ" рдореВрд▓ рд╕реБрдЭрд╛рд╡ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдереА рдЬрдм рдореИрдВрдиреЗ рд╕рднреА-рдкреНрд░рдХрд╛рд░-рдЪрд╛рд╣рд┐рдП-рд╢реВрдиреНрдп-рдореВрд▓реНрдп рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░реЗрд░рдгрд╛ рдпрд╣ рдереА рдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рднреЗрджрднрд╛рд╡рдкреВрд░реНрдг рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдореБрдЦреНрдп рд░реЛрдХ-рдЯреЛрдХ рднреА рдерд╛ред
рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╢реВрдиреНрдп-рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЧреИрд░-рд╢реВрдиреНрдп рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред
рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░, рд╣рдо ("рд╣рдо" рдХреЗ рд╕рд╛рде рдореИрдВ рдкреВрд░реЗ рдЧреЛ рд╕рдореБрджрд╛рдп рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ) рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдпрджрд┐ nil
рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдФрд░ рдЬреЛ рдЪреАрдЬ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░рдЦрддреА рд╣реИ рд╡рд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рд░реНрдгрдп рд╣реИ "рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рд╣реИрдВ рдФрд░ рдпрд╣ 0 рд╕реЗ рдмрдирд╛ рд╣реИ", рддреЛ рд╣рдо рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рдореВрд▓реНрдп рд▓рд╛рддрд╛ рд╣реИ рддреЛ рдЙрд╕ рдирд┐рд░реНрдгрдп рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ред
рдореИрдВ рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд╛рдХреНрдп _"рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ, рдкреВрд░реНрдг рд╡рд┐рд░рд╛рдо "_ред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ "рдкреВрд░реНрдг рд╡рд┐рд░рд╛рдо рд▓рд┐рдЦрдирд╛" рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ред рдореБрдЭреЗ рдЧрд▓рдд рдордд рд╕рдордЭреЛ! рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд╕реЛрдЪрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ: рдореБрдЭреЗ рдХреЛрдИ рд╣рдардзрд░реНрдорд┐рддрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрди рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:
рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕ рдкрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реЛрдВрдЧреЗред рдореИрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдХреЛ рд╣рдореЗрд╢рд╛ рднреНрд░рд╖реНрдЯ рдбреЗрдЯрд╛ рдФрд░ рдЧрд▓рдд рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдорд╛рдирддрд╛ рд╣реВрдВред рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореЗрд░реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИ рдФрд░ рди рд╣реА рдХрднреА рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рдХрдо рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореЗрд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдмрдЧреНрд╕ рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрдирдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореЗрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдмрдЧ рд╣реЛрдВрдЧреЗ рдФрд░ рдЬрдм рд╡реЗ рд╕рд╛рдордиреЗ рдЖрдПрдВрдЧреЗ рддреЛ рдмрд╕ рдХрд╣рд░ рдмрд░рдкрд╛рддреЗ рд░рд╣реЗрдВрдЧреЗред
рдореИрдВ рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВред рдЬреЛрд░ рд╕реЗ рдЕрд╕рдлрд▓ рд╣реЛрдирд╛ рд╣рдореЗрд╢рд╛ рдЪреБрдкрдЪрд╛рдк рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЧреЛ рдореЗрдВ рдПрдХ рдкрдХрдбрд╝ рд╣реИ:
рдЗрд╕реЗ рдПрдХ рддрд░рдл рд░рдЦ рджреЗрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЦрддрд░рдирд╛рдХ рд╣реИ), рддреЛ, рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реЗрдгреА ( nil
-рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдлрд▓рддрд╛рдУрдВ) рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рд╣реИред
рддреЛ рдЖрдЗрдП рдЗрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддреЗ рд░рд╣реЗрдВ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдЖрдкрдХреЗ рд╕рдордп рдФрд░ рдКрд░реНрдЬрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдореИрдВ рд╣реИрдХреЗрд▓ рдХреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЬрдВрдЧ рдХреЗ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдпрд╣ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рдирд╛рдордХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмреЗрд╣рддрд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯреИрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпреВрдВрдЯ рдкреНрд░рдХрд╛рд░, рд╡реЗрд░рд┐рдПрдВрдЯ рдХреА рдЧрд┐рдирддреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдпреВрдирд┐рдпрди рдлрд╝реАрд▓реНрдб (рдбреЗрдЯрд╛ рдзрд╛рд░рдг рдХрд░рдирд╛)ред
рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рдмрдВрдж рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рд╕рдВрдХрд▓рди рд╕рдордп рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рдХреНрд▓реАрдирд░ рд╣реЛрдЧрд╛)ред рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рдорд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЕрд▓рдЧ рд╣реИред
рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕:
type Type enum {
Tuple (int,int),
One int,
None,
};
рдЖрдХрд╛рд░ рдХреЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдХрд╛рд░ ((int, int)) рд╣реЛрдЧрд╛ред
рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдирдП рдмрдирд╛рдП рдЧрдП рдореИрдЪ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдпрд╛ рдореМрдЬреВрджрд╛ рд╕реНрд╡рд┐рдЪ рдСрдкрд░реЗрдЯрд░ рдХреЗ рднреАрддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:
var a Type
switch (a) {
case Tuple{(b,c)}:
//do something
case One{b}:
//do something else
case None:
//...
}
рдирд┐рд░реНрдорд╛рдг рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕:
var a Type = Type{One=12}
рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ рдПрдирдо рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╢реВрдиреНрдп рдорд╛рди (рд╕рдорд╕реНрдпрд╛):
рд╣рдо рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреНрд░рдо рдореЗрдВ рдирд╛рдореЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдирдо рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдХреНрд░рдордмрджреНрдз рд╕рджрд╕реНрдп рд╕реВрдЪреА рдореЗрдВ рдкрд╣рд▓реЗ рд╕рджрд╕реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдЧрд╛ред
рд╢реВрдиреНрдп рдореВрд▓реНрдп рд╕рдорд╕реНрдпрд╛ рдХрд╛ PS рд╕рдорд╛рдзрд╛рди рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордЭреМрддреЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпреЛрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпреЛрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж
рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рдореВрд▓реНрдп рдмрдирд╛рдирд╛ рдХреНрд╖реЗрддреНрд░ рдШреЛрд╖рдгрд╛ рдЖрджреЗрд╢ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрджрддрд░ рд╣реИред
рдХрд┐рд╕реА рдиреЗ рдбрд┐рдЬрд╛рдЗрди рдбреЙрдХ рд▓рд┐рдЦрд╛ рд╣реИ?
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реИ:
19412-рднреЗрджрднрд╛рд╡_рд╕рдВрдШ_рдФрд░_рдкреИрдЯрд░реНрди_рдорд┐рд▓рд╛рди.рдПрдордбреА.рдЬрд╝рд┐рдк
рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЛрдЧ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЛ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпреЛрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж
рдЕрдм рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЬреАрд░реЛ рд╡реИрд▓реНрдпреВ (рд╕рдорд╕реНрдпрд╛) рдкрд░ рд╕рдордЭреМрддрд╛ urandoms рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред
UPD: рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрджрд▓ рдЧрдпрд╛, рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ред
рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рд╣рд╛рд▓рд┐рдпрд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░):
type Task interface {
task()
}
type SearchAdd struct {
Ctx context.Context
ID string
Attrs Attributes
}
func (SearchAdd) task() {}
type SearchUpdate struct {
Ctx context.Context
ID string
UpdateAttrs UpdateAttributes
}
func (SearchUpdate) task() {}
type SearchDelete struct {
Ctx context.Context
ID string
}
func (SearchDelete) task() {}
рдФрд░ рддрдм
task := <- taskChannel
switch v := task.(type) {
case tasks.SearchAdd:
resp, err := search.Add(task.Ctx, &search2.RequestAdd{тАж}
if err != nil {
log.Error().Err(err).Msg("blah-blah-blah")
} else {
if resp.GetCode() != search2.StatusCodeSuccess {
тАж
}
}
case tasks.SearchUpdate:
тАж
case tasks.SearchDelete:
тАж
}
рдпрд╣ рд▓рдЧрднрдЧ рдЕрдЪреНрдЫрд╛ рд╣реИред рдмреБрд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛ рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдирдП рдЦреЛрдЬ рд╕реВрдЪрдХрд╛рдВрдХ рдСрдкрд░реЗрд╢рди рдХрд╛рд░реНрдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдИ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред
рд╕рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП IMHO рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдФрд░ рдбрд┐рд╕реНрдкреИрдЪрд░реНрд╕ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреЗ рдХрд╛рд░реНрдп рдЕрд╕рдВрдЦреНрдп рдФрд░ рдЫреЛрдЯреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рд╕реНрд╡рдпрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ
type Task oneof {
// SearchAdd holds a data for a new record in the search index
SearchAdd {
Ctx context.Context
ID string
Attrs Attributes
}
// SearchUpdate update a record
SearchUpdate struct {
Ctx context.Context
ID string
UpdateAttrs UpdateAttributes
}
// SearchDelete delete a record
SearchDelete struct {
Ctx context.Context
ID string
}
}
+
switch task {
case tasks.SearchAdd:
// task is tasks.SearchAdd in this scope
case tasks.SearchUpdate:
case tasks.SearchDelete:
}
рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрддреНрдорд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреЛрд╢ рд╣реЛрдЧрд╛ рдЬреЛ рдЧреЛ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╢ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдбрд╛рдЗрд╡рд┐рдВрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдЖрдЙрдЪ, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдПред рдЗрд╕реЗ рдареАрдХ рдХрд░реЛред
рджреЛ рд╕рдВрд╕реНрдХрд░рдг, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░:
type Sum oneof {
TтВБ TypeDeclтВБ
TтВВ TypeDeclтВВ
тАж
TтВЩ TypeDeclтВЩ
}
рдЬрд╣рд╛рдВ TтВБ
тАж TтВЩ
Sum
( oneof
рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕реНрддрд░ рдкрд░ рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ рдФрд░ Sum
рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛ рдХреЗрд╡рд▓ TтВБ
тАж TтВЩ
рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣рдорд╛рд░реЗ рдкрд╛рд╕ (type)
рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ oneof
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрд╛рдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
type Enum oneof {
Value = iota
}
рдХреЙрдиреНрд╕ рдХреЗ iota
рдХреЗ рд╕рдорд╛рди рд╣реА, рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдорд╛рдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ Enums рд╣реИрдВ рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рд╣реИред
switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрддреНрдорд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреЛрд╢ рд╣реЛрдЧрд╛ рдЬреЛ рдЧреЛ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╢ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдбрд╛рдЗрд╡рд┐рдВрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ task
рдЪрд░ рдХреЗ рдЕрд░реНрде рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред
```go switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрддреНрдорд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреЛрд╢ рд╣реЛрдЧрд╛ рдЬреЛ рдЧреЛ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╢ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдбрд╛рдЗрд╡рд┐рдВрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд╛рд░реНрдп рдЪрд░ рдХреЗ рдЕрд░реНрде рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред
```
рдлрд┐рд░ рдЕрдкрдиреЗ рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрднрдХрд╛рдордирд╛рдПрдБред
@sirkon рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
switch task {
case Task.SearchAdd:
// task is Task.SearchAdd in this scope
case Task.SearchUpdate:
case Task.SearchDelete:
}
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ Task
рд▓рд┐рдП рдиреЛ-рд╡реИрд▓реНрдпреВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
var task Task
рдХреНрдпрд╛ рдпрд╣ nil
? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ switch
рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд case nil
?
рдпрд╛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рддрдм рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛ рдХреНрд░рдо рдЙрд╕ рддрд░рд╣ рд╕реЗ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ enums рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдареАрдХ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ switch task.(type)
рдмрд░рд╛рдмрд░ рд╣реИ рд▓реЗрдХрд┐рди рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╣реИ рдирд╛? рдЬреИрд╕рд╛ рдХрд┐ .. рдпрджрд┐ рдЖрдк рдПрдХ рдорд╛рдорд▓реЗ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ред рдФрд░ default
рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╡рд╣ рд╕рд╣реА рд╣реИ?
рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд╡реЗ рдЧреЛ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдорд╛рдорд▓реЛрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ (рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛) рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрд░ рдмрд╣реБрдд рдмреБрд░рд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдиреЛ-рд╡реИрд▓реНрдпреВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
var task Task
рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдпрд╣ рдЧреЛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдиреАрд▓ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдпрд╛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред (рдкреНрд░рдХрд╛рд░) рд▓реЗрдХрд┐рди рд╕реНрд╡рд┐рдЪ рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╣реИ рдирд╛? рдЬреИрд╕рд╛ рдХрд┐ .. рдпрджрд┐ рдЖрдк рдПрдХ рдорд╛рдорд▓реЗ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ред
рд╣рд╛ рд╕рд╣реА рд╣реИред
рдФрд░ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╡рд╣ рд╕рд╣реА рд╣реИ?
рдирд╣реАрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рддред
рдкреАрдПрд╕ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ @ianlancetaylor рдФрд░ рдЕрдиреНрдп рдЧреЛ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реВрдиреНрдпрддрд╛ рдЙрдиреНрд╣реЗрдВ рдХрд╛рдлреА рдПрдирдкреАрдбреА-рдкреНрд░рд╡рдг рдмрдирд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдХрд╛ рд╢реВрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд░ рдпрд╣ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИред рдореИрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ case nil
рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдПрдХ if task != nil
рдкрд╣рд▓реЗ рдХрд░рдирд╛ рднреА рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ:|
рдХреНрдпрд╛ рдЗрд╕рдХреА рднреА рдЗрдЬрд╛рдЬрдд рд╣реЛрдЧреА?
type Foo oneof {
A = 3
B = "3"
C = 3.0
D = struct { E bool }{ true }
}
рдХреНрдпрд╛ рдЗрд╕рдХреА рднреА рдЗрдЬрд╛рдЬрдд рд╣реЛрдЧреА?
type Foo oneof { A = 3 B = "3" C = 3.0 D = struct { E bool }{ true } }
рдЦреИрд░, рддрдм рдХреЛрдИ рд╕реНрдерд┐рд░рд╛рдВрдХ рдирд╣реАрдВ, рдХреЗрд╡рд▓
type Foo oneof {
A <type reference>
}
рдпрд╛
type Foo oneof {
A = iota
B
C
}
рдпрд╛
type Foo oneof {
A = 1
B = 2
C = 3
}
рдЖрдИрдУрдЯрд╛ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдХреЛрдИ рд╕рдВрдпреЛрдЬрди рдирд╣реАрдВред рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди, рдЙрдиреНрд╣реЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдПрдХ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдирд╡реАрдирддрдо рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧреА, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рд╢реВрдиреНрдп-рдорд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреБрдХрд╕рд╛рди рд╕реЗ рдмрдЪрддреЗ рд╣реБрдП рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реНрдерд╛рди рджрд┐рдЦрд╛рдпрд╛ред рдпрд╣ рдЕрд╕рдВрдЧрдд рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рд╕рдо-рдИрд╢ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд╣реАрдВ, рд╢реВрдиреНрдп рдорд╛рди рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣реА рд╣реИ, рдЙрд╕ рд╕реЗрдЯ рдХреЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкреНрд░рдХрд╛рд░-рдЬрд╛рдВрдЪ рдХреЗ рд╕рд╛рде, рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдХрдо рд╕реЗ рдХрдо рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕реАрдорд┐рдд рд╕реЗрдЯ рд▓реЗрддрд╛ рд╣реИред
рдЕрдм, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рдЬрд╛рдЗрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдбрд┐рд╕рдЬрдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЦреБрд▓реЗ рд╣реИрдВред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА, рдпрд╣ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп (рдпрд╛ рд╕рдо-рдИрд╢-рдЯреЗрдХрд┐рдВрдЧ) func рдпрд╛ рдорд╛рди рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдИрдПрдордУ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд░рдХрдо рдХреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реНрдкреЗрд╕ рд╕реНрд╡рдпрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИред рдФрд░ рдпрд╣ рдХрд┐ рд░рдХрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╡реИрд╕реЗ рднреАред рдмрд╕ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
@Merovius рдирд╡реАрдирддрдо рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкрд╣рд▓реЗ рдереНрд░реЗрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
func addOne(x int|float64) int|float64 {
switch x := x.(type) {
case int:
return x + 1
case float64:
return x + 1
}
}
рдмрди рдЬрд╛рдПрдЧрд╛:
contract intOrFloat64(T) {
T int, float64
}
func addOne(type T intOrFloat64) (x T) T {
return x + 1
}
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдпрджрд┐ рдЬреЗрдирд░рд┐рдХ рдЕрдВрддрддрдГ рдЙрддрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЕрдм рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рдВрджрд┐рдЧреНрдз рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн рдЧреЛ рдЬреИрд╕реА рд╕рд░рд▓ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрддреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдВрдЧреЗред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рддреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рдХрдо рд╕реЗ рдХрдо рд╡рд┐рдШрдЯрдирдХрд╛рд░реА рд╕рдорд╛рдзрд╛рди рдЖрдИрдПрдордУ @ianlancetaylor рдХрд╛ 'рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕' рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ 'рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд' рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрдЬ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдкреБрд╕реНрддрдХ рд╕реЗ рдПрдХ рдкрддреНрддрд╛ рдирд┐рдХрд╛рд▓рд╛ рд╣реИ, рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмреНрд▓реЙрдХ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ:
type intOrFloat64 interface{ type int, float64 }
рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдирдП рдХреАрд╡рд░реНрдб (рдЬреИрд╕реЗ restrict
) рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЖрдк рдЕрднреА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рдпрджрд┐ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдереАрдВред
рдореБрдЭреЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИред рдпрджрд┐ RHS рдкрд░ рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдПрдХ рдЯрд╛рдЗрдк рди рдХрд┐рдП рдЧрдП рдЕрдХреНрд╖рд░ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдорд┐рд▓рд╛рди рдирд╣реАрдВ рдерд╛ рддреЛ рдпрд╣ рдмрд╕ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрдЧрд╛:
var v1 intOrFloat64 = 1 // compiles, dynamic type int
var v2 intOrFloat64 = 1.0 // compiles, dynamic type float64
var v3 intOrFloat64 = 1 + 2i // doesn't compile, complex128 is not a specified type
рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рдФрд░ рдПрдХ рдердХрд╛рд╡рдЯ рдЬрд╛рдВрдЪ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рди рдХреЛ рдЙрд╕рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдХрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреИрд╕рд╛ рдХрд┐ рдЖрдЬ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╢реВрдиреНрдп рдорд╛рди рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдХрд┐рд╕реА рднреА рджрд░ рдкрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрдЬ рдЖрдо рддреМрд░ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╣реИрдВ)ред рдПрдХ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди nil
(рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреБрдЫ рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрдВрдЧреЗ, рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдЬреЛ nil
рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдПред
рдпрд╣ рд╕рдм рдореЗрд░реЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рд╕рдВрдХрд▓рди рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХреА рд╣реИред
IIUC рдЬреЗрдирд░рд┐рдХ рдЪреАрдЬ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЯрд╛рдЗрдк рдХреА рдирд╣реАрдВ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рд╣реИ (рдЬреЛ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ) рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдЬрд╛рдВрдЪ рдФрд░ рдПрдирдо рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреЛ рдХрд┐ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдирд╣реАрдВ?) рдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
@alanfo , @Merovius рдХреНрдпреВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж; рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдмрджрд▓ рд░рд╣реА рд╣реИ:
рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рджреВрд╕рд░реЗ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рдмрджрд▓рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ: рдореИрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдлрд┐рд▓рд╣рд╛рд▓ рдореБрдЭреЗ рдХреЛрдИ рдордЬрдмреВрдд рддрдХрдиреАрдХреА рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдРрд╕реЗ "рдпреЛрдЧ" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм "рдпреЛрдЧ" рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрддрд┐рд╢реАрд▓ рдорд╛рдиреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдмрддрд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ - рдпрджрд┐ рдЕрдиреБрдмрдВрдз рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкреНрд░рдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рдЙрдЪрд┐рдд рдЙрдкрдпреЛрдЧреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдмрдВрдз рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
@рдЕрдЪреНрдЫреА рд╢рд░рд╛рдм
рдореИрдВ рдпрд╣ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдЙрди рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдХреЛрдИ рднреА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ - рдЬреИрд╕рд╛ рдХрд┐ @Merovius рдиреЗ рдЕрдкрдиреА рдЖрдЦрд┐рд░реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдПрдВ рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЙрдирд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИрдВред рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреВрд░реНрд╡ рдмрд╣реБрдд рд╕рдВрдХреАрд░реНрдг рд╣реИ рдФрд░ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдмрд╣реБрдд рдЪреМрдбрд╝рд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рдХ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рд╕рдВрдХрд▓рдХ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
@ рдЧреНрд░рд┐рд╕реЗрдорд░
рдЖрдк рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдореИрдВ рд╣реИрд░рд╛рди рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдбреНрд░рд╛рдлреНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрдиреБрднрд╛рдЧ "рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдВ") рдореЗрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╡рд╛рд╣рди рдХреНрдпреЛрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рдЕрдиреБрдмрдВрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдиреБрдмрдВрдз рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╡рд┐рдзрд┐ рдХреЗ рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд╣реА рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдмрд╛рдзрд╛ рдереА, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЕрдЬреАрдм рдмрдирд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЧреНрд░рд╛рдлрд╝ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ "рдПрдХ рдкрддреНрдерд░ рд╕реЗ рджреЛ рдкрдХреНрд╖рд┐рдпреЛрдВ рдХреЛ рдорд╛рд░ рд╕рдХрддреЗ рд╣реИрдВ" рдФрд░ рдлрд┐рд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдпреЛрдЧ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ (рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╣реИрдВ рд╢рд╛рдпрдж рд╕рд╣реА рд╣реИ рдХрд┐ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдЕрдЧрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдореЗрдВ 'рдЧреИрд░-рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд' рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдЬреЗрдирд┐рдХреНрд╕ рдХрд╛ рд╕рдВрдмрдВрдз рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░ рднреА рдирд╣реАрдВ) рдЗрд╕рд▓рд┐рдП рд╡реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдВрдЧреЗред рдпрджрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдмрдиреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╢рд╛рдпрдж рд╣рдо рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП const type
(рдпрд╛ рдХреЗрд╡рд▓ const
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@griesemer рдХреБрдЫ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рд╣реИрдВред
рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред
рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ
type C2(type T C1) interface { ... }
рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ T
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд╣рд░ рд╣реА рдореМрдЬреВрдж рд╣реИред T
рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдЕрдиреБрдмрдВрдз C1
рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ T
рдФрд░ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬреЛ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдиреБрдмрдВрдз рдХреЗ рдирд┐рдХрд╛рдп рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╡рд╢ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдмрд╛рдзрд╛ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦрдиреЗ рджреЗрдирд╛ рд╣реЛрдЧрд╛:
type C3(type U C1) interface(T) {
Add(T) T
}
рдЬрд╣рд╛рдВ T
рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХреЛрдИ рднреА рд╕рдВрдЪрд╛рд▓рди рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЗрд╖рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпреЗ рдСрдкрд░реЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рдиреЛрдВ рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ)ред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛ред рдПрдХ рд╕рдорд╛рдзрд╛рди рд╕рд┐рд░реНрдл рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реИрд╕реЗ рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдпрд╣рд╛рдВ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╣рдЪрд╛рди рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдо рдХрд╕реНрдЯрдо рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ
contract (T) indenticalTo(U) {
*T *U
}
(рдпрд╣рд╛рдВ, рдореИрдВ "рд░рд┐рд╕реАрд╡рд░" рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдПрдХрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд┐рд╖реНрдХрд╛рд░рд┐рдд рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде "рдмрд╛рдзрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдЪреНрдЪрд╛рд░рдг рдХрд░реВрдВрдЧрд╛, рдЬреИрд╕реЗ рдПрдХ рд░рд┐рд╕реАрд╡рд░ рдХреЗ рд╕рд╛рде рдПрдХ func рдХреЛ "рд╡рд┐рдзрд┐" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреБрдмрдВрдз рдирд╛рдо рдХреЗ рдмрд╛рдж рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдФрд░ рдмрд╛рдзрд╛ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдПрдХ рдмрд╛рдзрд╛ рдЦрдВрдб рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред)
рдЪреВрдВрдХрд┐ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рд╣реА рд╣реИ, рдЗрд╕ рдмрд╛рдзрд╛ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ T
рд╕рдорд╛рди рд╣реИ U
ред рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдПрдХ рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк (identicalTo(int)), (identicalTo(uint)), ...
рдХреЛ рдПрдХ рдмрд╛рдзрд╛ рд╡рд┐рдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдмрдХрд┐ рдЕрдиреБрдмрдВрдз рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдорд╕реМрджреЗ рд╕реЗ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рд╕реЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХреЗрдВ:
contract Foo(T, U) {
T U, int64
}
рдХрд┐рд╕рдХреЛ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХ/рдЕрдзрд┐рдХ рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдбрд┐рдЬрд╛рдЗрди рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреА, рддреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╡реЗ рдЕрдЬреАрдм рд▓рдЧреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдЪреАрдЬ рд╣реЛрдВрдЧреЗред
рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдбреНрд░рд╛рдлреНрдЯ рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреИрд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпрджрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ:
рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ
рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ :)
рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░
рдпрд╣рд╛рдВ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдПрдХ рдЧреИрд░-рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рддрднреА рд╣реЛрдЧреА рдЬрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░/рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рд╕реНрд╡рддрдВрддреНрд░ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ (рдУрдВ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред
рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╡рд┐рд╡рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрджрд┐ рдЙрд╕реЗ рдХрд┐рд╕реА рдмрд╛рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред
рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рддрднреА рд╣реЛрдЧреА рдЬрдм:
рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ _ рдкрд╣рд▓реЗ рд╣реА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рд╣рдо рдпрд╣рд╛рдВ рдкреАрдЫреЗ рдирд╣реАрдВ рд╣рдЯрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ)ред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рддреБрд░рдВрдд рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рд╕реНрд╡рддрдВрддреНрд░ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдЗрдирдореЗрдВ рд╕реЗ (2) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдкрд░реЗрд╢рд╛рдиреА рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдЧреНрд░рд╛рдлрд╝ рдЙрджрд╛рд╣рд░рдг рдореЗрдВред рдЪрд╛рд╣реЗ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ 'рдиреЛрдб' рдпрд╛ 'рдПрдЬ' рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реЛ, рдЗрд╕рдХреЗ рдмрд╛рдзрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрднреА рднреА рджреВрд╕рд░реЗ рдХреЛ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рдЬрд╝рд╛рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдЧреИрд░-рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд (рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рддрдм рдЙрдирдХреЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдШреЛрд╖рдгрд╛ рдЖрджреЗрд╢ред рдлрд┐рд░ рдЖрдк рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд╛рдлрд╝ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд 'рдирдИ' рд╡рд┐рдзрд┐ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рднреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдЪреНрдЫрд╛ рд╣реЛред
рд╕рдВрднрд╡рддрдГ, comparable
рдЕрдм рдЕрдиреБрдмрдВрдз рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрди рд╕рдХрддрд╛ рд╣реИред
рдЗрдВрдЯрд░рдлреЗрд╕, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреЙрдЗрдВрдЯрд░ рд╡рд┐рдзрд┐ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдЧрд╛ (рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЗрдиреНрд╣реЗрдВ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА) рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд░рд┐рд╕реАрд╡рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреЙрдЗрдВрдЯрд░ рд╡рд┐рдзрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ (рдЬреИрд╕реЗ рддрд╛рд░рдХ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдирд╛рдо рд╕реЗ рдкрд╣рд▓реЗ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЕрдм @stevenblenkinsop рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рджрд┐рдпрд╛? рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рд╕рдордЭрджрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рдорд╛рдирддрд╛ рдХрд┐ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рдиреНрдп рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдпрджреНрдпрдкрд┐ рд╕реНрдЯреАрд╡рди рдХрд╛ рдПрдХ рд╕рдорд╛рди () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╡рд┐рдЪрд╛рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд▓рдВрдмрд╛-рдШреБрдорд╛рд╡рджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рдХреЛ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
@urandom рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдбреНрд░рд╛рдлреНрдЯ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЦрдбрд╝рд╛ рд╣реИ, рдХреЗрд╡рд▓ рдХрдВрдХреНрд░реАрдЯ (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдпрд╛ рдХреБрд▓ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЗрдВрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдПрдХреАрдХреГрдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА:
interface Foo(T) {
const type T, int64 // 'const' indicates types are exact i.e. no derived types
}
рд╣рдо рднрд╛рд╖рд╛ рдореЗрдВ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реА рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдирдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдЪрд╛рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
@griesemer рдЖрдк рдЬрд╛рдЧрд░реВрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╢реБрд░реБрдЖрдд рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд╣рд╛ рд╣реВрдВ :) рдореИрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ)ред рдФрд░ рдореБрдЭреЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ (рд╕рдВрднрд╡рддрдГ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд) рдЗрдВрдЯрд░рдлреЗрд╕ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред
@urandom
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдореИрдВ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдореБрджреНрджрд╛ рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ "рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ", рд▓реЗрдХрд┐рди "рдЖрдк рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЙрдирдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ"ред рдпрджрд┐ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг "рдореБрдЭреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рд┐рдП", рддреЛ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рд╣реА рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
@alanfo
рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЕрдЬреАрдм рдмрдирд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЧреНрд░рд╛рдлрд╝ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЕрдЬреАрдм" рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЧреНрд░рд╛рдлрд╝ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЪрд┐рддреНрд░рдг рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдПрдХ рдЧреНрд░рд╛рдл рдПрдХ рдЗрдХрд╛рдИ рд╣реИ, рди рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рдирд╛рд░реЗ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ Node.
рд▓реЗрдХрд┐рди рдЯреАрдмреАрдПрдЪ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдЕрдЬреАрдм рд╣реИ - рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдЪреАрдЬреЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡ рдХрд▓рд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░-рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рдХреА-рд▓реЗрдЦ рдмрддрд╛рддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░-рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реИред
@stevenblenkinsop
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рд░рд┐рд╕реАрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рдЙрдкрдпреЛрдЧ-рд╕рд╛рдЗрдЯ рдкрд░ рдЯрд╛рдЗрдк-рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╣реИред рдЕрд░реНрдерд╛рдд
type Adder(type T) interface {
Add(t T) T
}
func Sum(type T Adder(T)) (vs []T) T {
var t T
for _, v := range vs {
t = t.Add(v)
}
return t
}
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджреЗрдЦрднрд╛рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХреАрдХрд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ-рд╕рдВрджрд░реНрднрд┐рдд рдкреНрд░рдХрд╛рд░-рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХрд╛ 1. рдФрд░ 3. рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛, рдореБрдЭреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдХреБрдЫ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛ред
рд╡реИрд╕реЗ рднреА, рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝рдирд╛ рдереЛрдбрд╝рд╛ рдмреЗрддреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣ рд╕рд╣реА рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реНрдкреЗрд╕ рдХреЛ рдереЛрдбрд╝рд╛ рдЪреМрдбрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрд╛ :) рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрд╛ рдХрд┐ рдирдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рдж рд╕реЗ рдХреБрдЫ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
```go switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрддреНрдорд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреЛрд╢ рд╣реЛрдЧрд╛ рдЬреЛ рдЧреЛ рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╢ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдбрд╛рдЗрд╡рд┐рдВрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд╛рд░реНрдп рдЪрд░ рдХреЗ рдЕрд░реНрде рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИредрдлрд┐рд░ рдЕрдкрдиреЗ рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрднрдХрд╛рдордирд╛рдПрдБред
рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдЧреЛ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреИрдЯрди рдорд┐рд▓рд╛рди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдХрдореА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдВрдЧ рджреЗрдЦреЗрдВред
@Merovius рдкреБрди: "рдореЗрд░реЗ рд▓рд┐рдП, рдПрдХ рдЧреНрд░рд╛рдл рдПрдХ рдЗрдХрд╛рдИ рд╣реИ"
рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рдЗрдХрд╛рдИ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ? рдЕрдиреБрдмрдВрдз рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмреАрдЪ рдкреНрд░рдореБрдЦ рдЕрдВрддрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдПрдХ рдЕрдиреБрдмрдВрдз рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ рдПрдХ рдирдпрд╛, рдЕрд╕реНрдерд╛рдпреА рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкреЗрд╢ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдиреЛрдбреНрд╕/рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ (рдХрд┐рддрдиреЗ?), рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЧреНрд░рд╛рдлрд╝ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реЛрдиреЗ рдкрд░ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдВред
рдЕрдиреБрдмрдВрдз рдХреЗ рд▓рд┐рдП "рдЧреНрд░рд╛рдл" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЗ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ "рдЧреНрд░рд╛рдл" рд╡рд╕реНрддреБ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрдмрдВрдз рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдмрдЧреНрд░рд╛рдл рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ; рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЧрдгрд┐рдд рдпрд╛ рдХрд╛рдиреВрди рдореЗрдВ рдХрд░реЗрдВрдЧреЗред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдЧреНрд░рд╛рдлрд╝ рдЕрдиреБрдмрдВрдз рдФрд░ рдЧреНрд░рд╛рдлрд╝ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЛрдиреЛрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдХрд╖реНрдЯрдкреНрд░рдж рдирд╛рдо рдЯрдХрд░рд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдПрдХ рдмреЗрд╣рддрд░ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред
рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рд╡рд┐рднреЗрджрд┐рдд рд╕рдВрдШ рдПрдХ рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╛рдзрд┐рдд рди рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╕рд░рдгреА рдХреИрд╕реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рдПрди-рдЖрдЗрдЯрдо рд╕рд░рдгреА рдХреЛ рдПрди рднреЗрджрднрд╛рд╡рдХрд░реНрддрд╛ рдФрд░ рдПрди рдорд╛рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдРрд╕реЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред (рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдкрд╛рд╕ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИрдВ, рдХрднреА-рдХрднреА рднреЗрджрднрд╛рд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред)
interface{}
рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рднреА рдЬрдЧрд╣ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдХрдореА рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди |
рдСрдкрд░реЗрдЯрд░ рдХреА рдирд┐рд░рдВрддрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:
type foobar union {
int
float64
}
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдХрдИ interface{}
рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реЛрдЧрд╛ред рдХреНрд░рд┐рдкреНрдЯреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрдзреА рдЪреАрдЬреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рд╣реА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬреИрд╕реЗ рдореБрджреНрджреЗ: рдЖрд╣ рдЖрдкрдиреЗ ecdsa.PrivateKey
рдмрдЬрд╛рдп *ecdsa.PrivateKey
- рдпрд╣рд╛рдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ ecdsa.PrivateKey рд╕рдорд░реНрдерд┐рдд рд╣реИред рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реБрдЭрд╛рд╡ int|float64
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ _space_ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб-рдмреЗрд╕ рдХреЛ рдмрд╣реБрдд рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд░рдЦрдирд╛ред
interface{}
рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рднреА рдЬрдЧрд╣ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдХрдореА рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди|
рдСрдкрд░реЗрдЯрд░ рдХреА рдирд┐рд░рдВрддрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛:type foobar union { int float64 }
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдХрдИ
interface{}
рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реЛрдЧрд╛ред рдХреНрд░рд┐рдкреНрдЯреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрдзреА рдЪреАрдЬреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рд╣реА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдЬреИрд╕реЗ рдореБрджреНрджреЗ: рдЖрд╣ рдЖрдкрдиреЗ
ecdsa.PrivateKey
рдмрдЬрд╛рдп*ecdsa.PrivateKey
- рдпрд╣рд╛рдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ ecdsa.PrivateKey рд╕рдорд░реНрдерд┐рдд рд╣реИред рд╕рд╛рдзрд╛рд░рдг рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАредрд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реБрдЭрд╛рд╡
int|float64
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ _space_ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб-рдмреЗрд╕ рдХреЛ рдмрд╣реБрдд рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд░рдЦрдирд╛ред
рдпрд╣ рджреЗрдЦреЗрдВ (рдЯрд┐рдкреНрдкрдгреА) , рдпрд╣ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред
рджрд░рдЕрд╕рд▓ рд╣рдо рдЕрдкрдиреЗ рджреЛрдиреЛрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдПрдбреАрдЯреА рдХрд░рдиреЗ рдХреЗ рджреЛ рдореВрд▓ рддрд░реАрдХреЛрдВ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЗ рд╕рд╛рдеред
рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди, рдЖрдкрдХреА рд╕рдВрдЧрддрддрд╛ рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдЖрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдПред
рд▓реЗрдХрд┐рди рдпрд╣ рдУрд╡рд░рдХрд┐рд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд╣реИ рдирд╛?
рд╕рд╛рде рд╣реА, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ nil
рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕реЗ рд╣рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВ nil
рдХреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
-- рдШреЛрд╖рдгрд╛
type U enum{
A(int64),
B(string),
}
-- рдореЗрд▓ рдорд┐рд▓рд╛рдирд╛
...
var a U
...
switch a {
case A{b}:
//process b here
case B{b}:
//...
case nil:
//...
}
...
рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ - рдКрдкрд░ рд╕рд┐рд░рдХреЙрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдЦреЗрдВред
рд╕рд╛рде рд╣реА, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ
nil
рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕реЗ рд╣рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВnil
рдХреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЧреИрд░-рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рдЗрд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╛рдиреА
type U enum {
None
A(string)
B(uint64)
}
...
var a U.None
...
switch a {
case U.None: ...
case U.A(str): ...
case U.B(i): ...
}
рд╕рд╛рде рд╣реА, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ
nil
рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕реЗ рд╣рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВnil
рдХреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАредрдХреНрдпрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЧреИрд░-рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рдЗрд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╛рдиреА
рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред
рд╕рд╛рде рд╣реА, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ
nil
рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕реЗ рд╣рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВnil
рдХреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАредрдХреНрдпрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЧреИрд░-рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рдЗрд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╛рдиреА
рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдореМрдЬреВрджрд╛ рдХреЛрдб рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рддреЛ рдкрд╣рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐, рдпрд╛ рдкрд╣рд▓реА рд╡рд░реНрдгрдорд╛рд▓рд╛, рдпрд╛ рдХреБрдЫ рдФрд░ред
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдореМрдЬреВрджрд╛ рдХреЛрдб рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рддреЛ рдкрд╣рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐, рдпрд╛ рдкрд╣рд▓реА рд╡рд░реНрдгрдорд╛рд▓рд╛, рдпрд╛ рдХреБрдЫ рдФрд░ред
рдореИрдВ рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдкрд╕реЗ рд╕рд╣рдордд рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╛рдж, рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдЖрд░рдХреНрд╖рд┐рдд рдирд╛рдо рдкрд╣рд▓реЗ рдХреБрдЫ рдХреЛрдбрдмреЗрд╕ (рд╕рдВрдШ, рдПрдирдо, рдЖрджрд┐) рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реВрдиреНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рджрд╛рдпрд┐рддреНрд╡ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рджрд░реНрджрдирд╛рдХ рд╣реЛрдЧрд╛ред
рдпрд╣ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ Go2.0 . рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдореМрдЬреВрджрд╛ рдХреЛрдб рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рддреЛ рдкрд╣рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐, рдпрд╛ рдкрд╣рд▓реА рд╡рд░реНрдгрдорд╛рд▓рд╛, рдпрд╛ рдХреБрдЫ рдФрд░ред
рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореМрдЬреВрджрд╛ рдЧреЛ рдХреЛрдб рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдмрдХреБрдЫ рд╢реВрдиреНрдп рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рд╣реЛрдЧрд╛ред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдЧреЛрдлрд┐рдХреНрд╕ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЙрдкрдХрд░рдг рдХреЗрд╡рд▓ рдХрдо рд╕реЗ рдХрдо рдмрджрд╕реВрд░рдд рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдк (рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрдХреБрдЫ рддреЛрдбрд╝ рджреЗрдЧрд╛ред
рдЕрдЧрд░ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ, рддреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВ ред рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╕рд╣реА рдПрдХ рдЕрдиреБрднрд╡ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рддреАрди рдорд╛рдирджрдВрдб рдЙрд╕рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВ, рдХрд┐ рджреЛрдиреЛрдВ "рдХреЛрдИ рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдЕрдкреНрд░рд╛рд░рдВрднреАрдХреГрдд рдорд╛рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП" рдФрд░ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╣рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдирдореНрд░ рдзрд╛рдЧреЗ рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рд▓рдВрдмрд╛ рдФрд░ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред
рдЖрдЗрдП рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВредрджрдпрд╛рд▓реБред рдПрдХ рдЕрдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ int рдорд╛рди 0 рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдерд╛ рдЬреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░, рдФрд░ рдЖрдкрдиреЗ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐, рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдВред рдХрд╛рдЗрдВрдб рдХреЛ рдХрд╛рд▓реНрдкрдирд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╢реВрдиреНрдп рдорд╛рди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирд╛рдорд┐рдд рдЕрдорд╛рдиреНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм, html/template.contentType рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╕рд╛рджрд╛ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝реЙрд▓рдмреИрдХ рд╣реИред рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдпреЛрдЧ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рд╣рдореЗрд╢рд╛ рдирд╛рдорд┐рдд рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реЛрдЧрд╛, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдорд╛рди рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╣реВрдВ рдЬрд╣рд╛рдВ рдмреАрдЬрдЧрдгрд┐рдд/рднрд┐рдиреНрди/рдпреЛрдЧ/рдЬреЛ рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд▓реЗрди-рджреЗрди рдХреЗ рдмрд┐рдирд╛ рдиреЛрдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА, рд▓реЗрдирджреЗрди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) рдлрд┐рд░ рднреА рд╣рдо рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЕрдЦрдВрдбрддрд╛ рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╡рд░реНрддреА рдкрд╣реБрдВрдЪ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдПрдХрд▓ рдкрд░ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╕рд╢рд░реНрдд рдЕрджреНрдпрддрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб (рдПрдХрд▓ рд░рд┐рдХреЙрд░реНрдб рд▓рд┐рдЦрдирд╛ рдкрд░рдорд╛рдгреБ рд╣реИ)ред
рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕реЗ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдСрдкреНрд╕)ред
рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
type EntityOp oneof {
Insert Reference
NewState string
Delete struct{}
}
рд╡рд┐рдзрд┐ рдЙрдЪрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ
type DB interface {
тАж
Capture(ctx context.Context, processID string, ops map[string]EntityOp) (bool, error)
}
рдпреЛрдЧ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЙрдкрдпреЛрдЧ рдПрдПрд╕рдЯреА рдореЗрдВ рдиреЛрдбреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рд╣реИред рдПрдХ рдФрд░ nil
рдХреЛ option
рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдкрд░ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@DemiMarie рд▓реЗрдХрд┐рди рдЖрдЬ рдХреЗ рдЧреЛ рдореЗрдВ, рдпрд╣ рд░рд╛рд╢рд┐ рд╢реВрдиреНрдп рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рдПрдирдо рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдорд╛рдорд▓рд╛ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рджрд╛рдпрд┐рддреНрд╡ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╣рдо рд╕рднреА рдореМрдЬреВрджрд╛ рдЧреЛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдм рдХреБрдЫ рд╢реВрдиреНрдп рд╣реИ)
рдкрддрд╛ рдирд╣реАрдВ рдпрд╣ рдпрд╣рд╛рдБ рдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдореЗрд░реЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЬрд╣рд╛рдБ "рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЯрд░рд▓ рдЯрд╛рдЗрдкреНрд╕" рдирд╛рдордХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рдореМрдЬреВрдж рд╣реИ рдФрд░ рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
var name: "Peter" | "Consuela"; // string type with compile-time constraint
рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдирдо рдХреА рддрд░рд╣ рд╣реИ, рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдПрдирдо рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред
@рдореЗрд░реЛрд╡рд┐рдпрд╕
рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ JSON рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЬрдВрдЧ рдореЗрдВ рдЗрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдПрдирдо рд╡реИрд▓реНрдпреВ {
рд╢реВрдиреНрдп,
рдмреВрд▓ (рдмреВрд▓),
рд╕рдВрдЦреНрдпрд╛ (рд╕рдВрдЦреНрдпрд╛),
рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╕реНрдЯреНрд░рд┐рдВрдЧ),
рдРрд░реЗ(Vec
рд╡рд╕реНрддреБ(рдорд╛рдирдЪрд┐рддреНрд░
}
рджреЛ рдлрд╛рдпрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░:
go vet
рдЕрдиреБрдорддрд┐ рджреЗрдирд╛рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ Go1 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде:
type Token = int | float64 | string
рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдб рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ рдЬреИрд╕реЗ
var tok Token
switch t := tok.(type) {
case int:
// do something
}
рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрдард╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рд┐рдЪ рдореЗрдВ рд╕рднреА Token
рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ (рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ) рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдЬрд┐рдирдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ string
) рдФрд░ рдЧреИрд░-рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рд╛рде рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдЖрдЙрдЯ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдЯреАрдХ рдЬреАрд╕реА рдЪрд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рд╕рд░рд▓ рдЪрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдирд┐рд╣рд┐рдд рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХреА рд░рд╛рд╣ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдЬреИрд╕реЗ interface{}
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЧреМрд░рд╡рд╢рд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ vet
рдЪреЗрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ?
рд▓реЗрдЖрдЙрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдШ рд╕реЗ рдЯреИрдЧ рдмрд┐рдЯреНрд╕ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ рдЬреЛ рдЬреАрд╕реА рдХреЛ рдзреАрдорд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╢реБ рдЪрд┐рдХрд┐рддреНрд╕рдХ рдЬрд╛рдВрдЪ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛ рд╕рдХреЗ?
рд▓реЗрдЖрдЙрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдШ рд╕реЗ рдЯреИрдЧ рдмрд┐рдЯреНрд╕ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдпрд╣ рд╡рд╣реА рджреМрдбрд╝ рд╣реИ рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рдереА, рдЬрдм рдЙрдирдореЗрдВ рдЧреИрд░-рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛ рд╕рдХрддреЗ рдереЗред рдЙрд╕ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
go-sumtype
рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рджреЛ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ?
рд╕рдВрдХрд▓рдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдФрд░ рдПрди рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреЗрд╢ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдПрдХ рд╣реА рдкреИрдХреЗрдЬ рджреЛ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ?
рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ? рддрд░реНрдХ рдкреНрд░рддрд┐-рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрдореА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдбрдореА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдореЛрдВ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред
@skybrian IIRC рд╡рд░реНрддрдорд╛рди рдмрд┐рдЯрдореИрдк рдЬреЛ рдЯрд╛рдЗрдк рд▓реЗрдЖрдЙрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдкреНрд░рддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдРрд╕реА рдЪреАрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рдЫрд▓рд╛рдВрдЧ рд▓рдЧреЗрдЧреА, рдФрд░ рд╣рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ GC рд░реВрдЯ рдмрдирд╛ рджреЗрдЧрд╛ред
рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ (рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП) рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ (рдпрд╛ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдФрд░ рдЧреИрд░-рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ
рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдкреЙрдЗрдВрдЯрд░-рдореИрдкреНрд╕ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВред рдЬрдм рд╡реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдмрд╛рд╣рд░ рд░рдЦрдирд╛ рдпрд╛ рдкреЙрдЗрдВрдЯрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╕рдиреНрдирд┐рд╣рд┐рдд рд▓реЗрдЖрдЙрдЯ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЧреМрд░рд╡рд╢рд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ , рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ _exactly_ рдПрдХ рдЧреМрд░рд╡рд╢рд╛рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ - рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╕рдореЗрдХрд┐рдд рд╕реЗрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рдХ рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рднрдВрдбрд╛рд░рдг рд╡рд┐рдзрд┐ рдЪреБрдирдиреЗ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИ, рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рдирд╣реАрдВред
@rogpeppe - рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рдХреНрдпрд╛ рдореИрдВ рд╕реАрдзреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЗрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╣реИ, рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рдЬреЛ рдореБрдЦреНрдп рд▓рд╛рдн рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рдЕрднреА рднреА рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдПрдХ рдЕрдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдЕрдиреНрдп рд▓рд╛рдн рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд╢ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред
рдХреНрдпрд╛ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ
type FooType int | float64
func AddOne(foo FooType) FooType {
return foo + 1
}
// if this can be done, what happens here?
type FooType nil | int
func AddOne(foo FooType) FooType {
return foo + 1
}
рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛
type FooType interface{}
func AddOne(foo FooType) (FooType, error) {
switch v := foo.(type) {
case int:
return v + 1, nil
case float64:
return v + 1.0, nil
}
return nil, fmt.Errorf("invalid type %T", foo)
}
// versus
type FooType int | float64
func AddOne(foo FooType) FooType {
switch v := foo.(type) {
case int:
return v + 1
case float64:
return v + 1.0
}
// assumes the compiler knows that there is no other type is
// valid and thus this should always returns a value
// Would the compiler error out on incomplete switch types?
}
@xibz
рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рдХреНрдпрд╛ рдореИрдВ рд╕реАрдзреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЗрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╣реИ, рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
@rogpeppe , рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ ЁЯЩП
рд╣рдореЗрд╢рд╛ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп "рдХрд╛рд╕реНрдЯрд┐рдВрдЧ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЖрдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рдЪрд░ рд╕реЛрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЬрдмрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╣реИред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рдВрдЬрд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛:
const a = "1" // string "1"
const b = a + 5 // string "15" and not number 6
рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдлрд╛рдпрджреЗ рдЦреБрдж рдмрддрд╛рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?
рдореИрдВ
рдореБрдЭреЗ рдЬреЛ рдореБрдЦреНрдп рд▓рд╛рдн рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдирдорд░реНрд╢рд▓рд┐рдВрдЧ рдЕрднреА рднреА рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдПрдХ рдЕрдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдЕрдиреНрдп рд▓рд╛рдн рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд╢ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред
// Would the compiler error out on incomplete switch types?
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
@xibz рднреА рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдмрдирд╛рдо рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЬреЗрдиреЗрд░рд┐рдХ рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ, рдореЗрд░реЗ рдорд░рдиреЗ рд╕реЗ рдПрдХ рджрд┐рди рдкрд╣рд▓реЗред
@xibz
рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рдХреНрдпрд╛ рдореИрдВ рд╕реАрдзреЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдЖрдк рдЙрд╕ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рд╕рджрд╕реНрдп рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛ int | float64
рд▓реЗрддреЗ рд╣реБрдП, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛:
var x int|float64 = int(2)
var y int|float64 = float64(0.5)
fmt.Println(x * y)
рдХреНрдпрд╛ рдпрд╣ int
рд╕реЗ float64
рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд░реЗрдЧрд╛? рдпрд╛ float64
рд╕реЗ int
ред рдпрд╛ рдпрд╣ рдШрдмрд░рд╛рдПрдЧрд╛?
рддреЛ рдЖрдк рд▓рдЧрднрдЧ рд╕рд╣реА рд╣реИрдВ - рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдн рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВред рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, [](int|float64)
рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рд╢рд╛рдпрдж рд╕рдВрд░реЗрдЦрдг рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдХрд╛рд░рдг 16 рдмрд╛рдЗрдЯреНрд╕), рдЬреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рд▓рд╛рдн рджреЗрддрд╛ рд╣реИред
рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ (рд╕рдВрднрд╡рддрдГ рд╕рдВрд░реЗрдЦрдг рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдХрд╛рд░рдг 16 рдмрд╛рдЗрдЯреНрд╕) рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдореНрдо, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдЦрд░реАрджреВрдВрдЧрд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╣реА рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╕реНрдореГрддрд┐ рдЖрдХрд╛рд░ рдХреЛ рдЖрдзрд╛ рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕рд╣реЗрдЬреА рдЧрдИ рд╕реНрдореГрддрд┐ рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рд╣рдореЗрд╢рд╛ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп "рдХрд╛рд╕реНрдЯрд┐рдВрдЧ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ
рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд▓рд╛рдн рд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рд╣реИ? рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдЦреЛ рджрд┐рдпрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реЛрдЧрд╛ред
рдЙрд╕ рд╕рдм рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓реАрдирд░ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП 100% рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рд▓реБрдХ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
@xibz рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рдЯреНрд░реА-рд╡реЙрдХрд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдБ рдЖрдк рдЯреНрд░реА рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░реЛрдВ рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рд╕реЗ рдЖрдк рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рддрдХ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдиреЗрд╕реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рджреНрд╡рд┐рдШрд╛рдд рд╕рдореАрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
match Add(Add(Mult(Const(a), Power(Var(x), 2)), Mult(Const(b), Var(x))), Const(c)) {
// here a, b, c are bound to the constants and x is bound to the variable name.
// x must have been the same in both var expressions or it wouldn't match.
}
рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдХреА рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ, рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рдкрд╛рдВрдЪ рд╕реНрддрд░реЛрдВ рддрдХ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдХрдИ рд╕реНрддрд░реЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рддрдХ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд╕рд╛рде рд╣реА рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХреЛрдИ рднреА рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рд╣реИред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рддрдирд╛ рдЖрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред
@xibz
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдФрд░ рд╕рдВрдХрд▓рдХ рджреЛрдиреЛрдВ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпреЛрдЧ рдХреЗ рднреАрддрд░ рдХреМрди рд╕реЗ рдкреНрд░рдХрд╛рд░ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореВрд▓рдд: рдпрд╣реА рдЕрдВрддрд░ рд╣реИред рдЦрд╛рд▓реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рд╣реЛрдЧреА рдФрд░ рдПрдкреАрдЖрдИ рдореЗрдВ рджреБрд░реБрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрдирд╛ рд╣реЛрдЧрд╛, рд╣рдореЗрд╢рд╛ рдПрдХ рд╢рд╛рдЦрд╛ рд╣реЛрдиреЗ рд╕реЗ рдЬрд┐рд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдк рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЪреВрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдмрд╣реБрдд рдХрдо рдЙрдореНрдореАрдж рд╣реИ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдорд╛рдирдХ рдЯрд┐рдкреНрдкрдгреА рдирд┐рд░реНрджреЗрд╢, рдЬреИрд╕реЗ //go:union A | B | C
рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдФрд░ рд╕рдорд░реНрдерд┐рдд рд╣реИ go vet
ред
рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ, рдПрди рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж рдпрд╣ рдЬрд╛рдирдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рддрдиреЗ рдкреИрдХреЗрдЬ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдирд┐рдЬреА рд╡рд┐рдзрд┐ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдирд╛рдИ, рдпрд╣ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ: https://github.com/sirkon/go-oneof
рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдбреНрд░рд╛рдлреНрдЯ рдХреЗ рд╕рд╛рде, рд╢рд╛рдпрдж рдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдирд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдорд╕реМрджреЗ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
type Foo interface {
int64, int32, int, uint, uint32, uint64
}
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдореЗрдореЛрд░реА-рдкреИрдХ рдпреВрдирд┐рдпрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕реЗ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдХрд╛рд░ рдХреА рд╕реАрдорд┐рдд рд╕реВрдЪреА рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред
рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рднреАрддрд░ рдЗрди рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реЛрдЧрд╛ред
рдпрд╣ рдЖрджрд░реНрд╢ рд▓рдШреБ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг: Foo | int32 | []Bar
), рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рд╣реИред
рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдбреНрд░рд╛рдлреНрдЯ рдХреЗ рд╕рд╛рде, рд╢рд╛рдпрдж рдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдирд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдорд╕реМрджреЗ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
type Foo interface { int64, int32, int, uint, uint32, uint64 }
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдореЗрдореЛрд░реА-рдкреИрдХ рдпреВрдирд┐рдпрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕реЗ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдХрд╛рд░ рдХреА рд╕реАрдорд┐рдд рд╕реВрдЪреА рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред
рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдХреЗ рднреАрддрд░ рдЗрди рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рд╕реНрд╡рд┐рдЪ рд╕рдВрдкреВрд░реНрдг рд╣реЛрдЧрд╛ред
рдпрд╣ рдЖрджрд░реНрд╢ рд▓рдШреБ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг:
Foo | int32 | []Bar
), рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рд╣реИред
рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди: https://github.com/golang/go/issues/19412#issuecomment -520306000
type foobar union {
int
float
}
@mathieudevos рд╡рд╛рд╣, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрд╛рдлреА рдкрд╕рдВрдж рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП, рдирд╡реАрдирддрдо рдЬреЗрдирд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╡рд┐рд╖рдорддрд╛ ( рдХреЗрд╡рд▓ рд╢реЗрд╖ рд╡рд┐рд╖рдорддрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ) рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рд╣реИред рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ рдлрд┐рдЯ рдирд╣реАрдВ
union
рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк "рдмрд╛рдзрд╛рдУрдВ рдФрд░ рдХрдЪреНрдЪреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрд╛рдзрд╛" рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП union
рдХреЛ interface
рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлреЗрд╕ рдпрдерд╛рд╡рдд рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕рдВрдШ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдЬреАрдмрддрд╛ рдХреА рднрд╛рд╡рдирд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред
// Ordinary interface
type Stringer interface {
String() string
}
// Type union
type Foobar union {
int
float
}
// Equivalent to an interface with a type list
type FoobarStringer interface {
Stringer
Foobar
}
// Unions can intersect
type SuperFoo union {
Foobar
int
}
// Doesn't compile since these unions can't intersect
type Strange interface {
Foobar
union {
int
string
}
}
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╕ рдЗрд╕ рд╕реАрдПрд▓ рдХреЛ рджреЗрдЦрд╛: https://github.com/golang/go/commit/af48c2e84b52f99d30e4787b1b8d527b5cd2ab64
рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд▓рд┐рдП рджреНрд╡рд╛рд░ рдЦреЛрд▓рддрд╛ рд╣реИ
(рдЧреИрд░-рдмрд╛рдзрд╛) рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ
...рдорд╣рд╛рди! рдЗрдВрдЯрд░рдлреЗрд╕ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдирд┐рдпрдорд┐рдд рдФрд░ рдмрд╛рдзрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред (рдЬрд╛рд╣рд┐рд░ рд╣реИ рдЕрднреА рддрдХ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЧрдВрддрд╡реНрдп рд╣реИред)
рдореИрдВрдиреЗ рд╡рд░реНрддрдорд╛рди рдЬреЗрдирд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #41716 рдЦреЛрд▓рд╛ рд╣реИред
рдореИрдВ рд╕рд┐рд░реНрдл рдмреАрдЬрдЧрдгрд┐рддреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @henryas рдХрд╛ рдПрдХ рдкреБрд░рд╛рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
https://github.com/golang/go/issues/21154
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, @mvdan рджреНрд╡рд╛рд░рд╛ рдЙрд╕реА рджрд┐рди рдХрд╛рдо рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реА рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ gh рдЦрд╛рддреЗ рдкрд░ рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЙрд╕ рдЖрджрдореА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #21154 рдкрд╕рдВрдж рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдмрд╛рдд рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП @mvdan рдХреА) рдЯрд┐рдкреНрдкрдгреА рдЗрд╕реЗ
рд╣рд╛рдБ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдФрд░ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЙрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдПрдирдо-рдЬреИрд╕реЗ, рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдпреЛрдЧ рдкреНрд░рдХрд╛рд░, рдФрд░ рдЕрдиреНрдп рдореБрджреНрджреЗ рдХреА рддрд░рд╣ рд╕реБрдЭрд╛рдП рдЧрдП рд╕реНрд╡реАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдЯреВрд▓рдмреЙрдХреНрд╕ рдореЗрдВ рдХрдорд╛рд▓ рдХреЗ рд╣реЛрдВрдЧреЗред рдЧреЛ рдореЗрдВ рд╡реНрдпрд╡рд╕рд╛рдп/рдбреЛрдореЗрди рдХреЛрдб рдЗрд╕ рд╕рдордп рдХрднреА-рдХрднреА рдереЛрдбрд╝рд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИред
рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдВрджрд░ type foo,bar
рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рдФрд░ рджреНрд╡рд┐рддреАрдп рд╢реНрд░реЗрдгреА рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╢реВрдиреНрдп рдФрд░ рдЧреИрд░-рд╢реВрдиреНрдп (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ) рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@ProximaB рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдк рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ "gh рдЦрд╛рддреЗ рдкрд░ рдХреЛрдИ рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ"ред рддрдм рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдИ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдХреЛ рднреА рдмрдирд╛рдпрд╛ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдЧреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдХреЛрдИ рд╕рдмреВрдд рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рдХрд┐ рдЙрдирдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдЙрд╕ рдореБрджреНрджреЗ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдИ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдбреЗрдирд┐рдпрд▓ рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЗрд╕ рдПрдХ рдХреЗ рдбреБрдкреНрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ @andig рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреБрдЫ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ #21154 рдХреЗ рдкрд╛рда рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдБ, рдпрд╣ рдареАрдХ рдЙрд╕реА рдмрд╛рдд рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдФрд░ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдбреБрдкреНрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рд╢рд╛рдпрдж рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрддрд╛ред рдЪрд░реНрдЪрд╛ рдХрд╛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реЛрдирд╛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╛рдпрджреЗрдордВрдж рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрдИ рдореБрджреНрджреЛрдВ рдХреЛ рдЦреБрд▓рд╛ рд░рдЦрдирд╛, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪрд░реНрдЪрд╛ рдХреЗ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрд░реНрде рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдбреЗрдирд┐рдпрд▓ рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЗрд╕ рдПрдХ рдХреЗ рдбреБрдкреНрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ @andig рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреБрдЫ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ #21154 рдХреЗ рдкрд╛рда рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдБ, рдпрд╣ рдареАрдХ рдЙрд╕реА рдмрд╛рдд рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкрдврд╝рдХрд░ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рд╣реВрдВред рдореИрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреБрд░рдЬреЛрд░ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдорддрд▓рдм рдХрдареЛрд░ рдирд╣реАрдВ рдмреЛрд▓рдирд╛ рдерд╛, рдЕрдЧрд░ рдРрд╕рд╛ рдХреБрдЫ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реЛ рддреЛ рдХреГрдкрдпрд╛ рдореЗрд░реА рдорд╛рдлрд╝реА рдорд╛рдВрдЧреЗрдВред
рдореИрдВ рдПрдХ рдЗрдВрд╕рд╛рди рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрд╛рдЧрд╡рд╛рдиреА рд╕рдордп рдкрд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рд░ рддрд░рд╣ рд╕реЗ рдмрддрд╛рддреЗ рд╣реИрдВ, рдЬрдм рдореИрдВ рдПрдХ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ рд╣реВрдБ :) рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рд╣реА рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рдХрд╛рдВрдЯрд╛ рдЪрд╛рд╣рд┐рдП рд▓рдЧрддрд╛ рдХрд┐ https: / /github.com/golang/go/issues/19412#issuecomment -701625548
рдореИрдВ рдПрдХ рдЗрдВрд╕рд╛рди рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрд╛рдЧрд╡рд╛рдиреА рд╕рдордп рдкрд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рд░ рддрд░рд╣ рд╕реЗ рдмрддрд╛рддреЗ рд╣реИрдВ, рдЬрдм рдореИрдВ рдПрдХ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВ :) рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддрд░рд╣ рд╣реА рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рдХрд╛рдВрдЯрд╛ рдЪрд╛рд╣рд┐рдП рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ # 19,412 ( рдЯрд┐рдкреНрдкрдгреА)
@mvdan рдЗрдВрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдореБрдЭ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛред рдореИрдВ рдЙрд╕рдХрд╛ рдкрдбрд╝реЛрд╕реА рд╣реВрдВред рдордЬрд╛рдХ рдерд╛ред
рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рд╕реЗ рдЗрддрдирд╛ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реВрдВред рдмреЗрдЭрд┐рдЭрдХ рдЙрд▓рдЭрдиреЗ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдиреАрдЪреЗ рдЧрд┐рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдореИрдВ рдЕрд╕рд▓ рдЬрд┐рдВрджрдЧреА рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдХрд╛ рдореМрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдпрд╣ рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рдХрд┐ рд▓реЛрдЧ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред
рдореВрд▓ рдЙрджреНрджреЗрд╢реНрдп рдЙрдирдХреЗ рдбреЛрдореЗрди рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдореВрд╣рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡реЗ рдЬрд░реВрд░реА рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдерд┐рд░ рд╕рддреНрдпрд╛рдкрди рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЬрдЯрд┐рд▓ рд╕рдВрдмрдВрдз рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдЗрди рдбреЛрдореЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдирд┐рдпрдорд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {} рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЕрдм рд╕рдВрдХрд▓рди рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рд╛рд░ рд╣реИ #21154
@henryas рдЖрдкрдХреЛ
рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЕрдЧрд░ рдЧреЛрд▓рдВрдЧ рдиреЗ рдмрддрдЦ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реЛрддрд╛ рддреЛ рдЗрд╕рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдФрд░ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рд╣реЛ рдЬрд╛рддреЗ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрдирдХреЗ рдбреЛрдореЗрди рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХрд░рдг рд╡рд╕реНрддреБ рдХреЛ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИред
@henryas рдЖрдкрдХреЛ
рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЕрдЧрд░ рдЧреЛрд▓рдВрдЧ рдиреЗ рдмрддрдЦ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реЛрддрд╛ рддреЛ рдЗрд╕рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдФрд░ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рд╣реЛ рдЬрд╛рддреЗ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрдирдХреЗ рдбреЛрдореЗрди рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХрд░рдг рд╡рд╕реНрддреБ рдХреЛ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИред
рдпрд╣ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЧреЛ 1 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рд╡рд╛рджреЗ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рддреЛ рд╣рдореЗрдВ рд╢рд╛рдпрдж рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдбрдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдмреБрд░реА рдЪреАрдЬ рд╣реЛред рдпрд╣ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╣рд▓реНрдХрд╛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдмрддрдЦ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рд╣реИред
@ рд╣реЗрдирд░реА рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рдпрд╣ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреНрд░рд╢реНрди рдерд╛ред рдЧреЛ рдХреНрд░рд┐рдПрдЯрд░реНрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡реЛрдВ рдкрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рджреВрд╕рд░реА рдУрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдЬреИрд╕реА рдХреЛрдбрд┐рдВрдЧ рдЧрд╛рдЗрдб рдХрднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧреАред
https://github.com/uber-go/guide/blob/master/style.md#verify -interface-compliance
рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрдХрд░ рдЪрд░реНрдЪрд╛ рдХрд╣реАрдВ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдУрдкрди рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдВрддреБрд╖реНрдЯрд┐ рдЕрдкрдиреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж рд╕реЗ рдЧреЛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд░рд╣реА рд╣реИ рдФрд░ рдпрд╣ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реА рдирд╣реАрдВ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рд▓ рдпрд╛ рдЙрд╕рд╕реЗ рднреА рдЬреНрдпрд╛рджрд╛ рд╕рдордп рд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдПрдХ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдорд┐рд▓рд╛ рд╣реИ, рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
"рдкрд╕рдВрдж рдкреНрд░рдХрд╛рд░" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдпреЛрдЧ рдкреНрд░рдХрд╛рд░" рд╕реЗ рдмреЗрд╣рддрд░ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдИрдПрдордПрдорд╡реАред
Go . рдореЗрдВ рдпреЛрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░
рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ "|" рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдСрдкрд░реЗрдЯрд░ред
рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдзрд╛рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред NS
рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ
рдореВрд▓реНрдп рдЬреЛ рдЗрд╕реЗ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, "рд╢реВрдиреНрдп" рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рдирд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд░рдЦрддрд╛ рд╣реИ
рдЗрд╕рдХреЗ рд╕рднреА рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ, рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░
рдирд╛рдо рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ред
рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣, рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдХрд╛ рд╡рд┐рд╖рдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдгред рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪ рдореЗрдВ, рд╕реНрд╡рд┐рдЪ рдХреА рдкрд╣рд▓реА рднреБрдЬрд╛ рдЬреЛ
рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢реВрдиреНрдп рдорд╛рди рд╣реИ
рдпреЛрдЧред
рдХрд┐рд╕реА рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдпрджрд┐ рдорд╛рди рдЕрдзрд┐рдХ рдореЗрдВ рдлрд╝рд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ, рдлрд┐рд░ рдкрд╣рд▓реЗ рдХреЛ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ int рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдлреНрд▓реЛрдЯ64 рд╡рд╛рд▓рд╛ рдорд╛рди рд╣реЛрдЧрд╛ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдореВрд▓реНрдпред рдПрдХ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрддред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ
рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреИрд░-рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдпрд╛рдж рд░рдЦреЗрдВред
рд╕рдо-рдСрдл-рд╕реНрдЯреНрд░рдХреНрдЪрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЙрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП structs рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдЗрдЯреНрд╕ред