рдЗрддрдирд╛ рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдПрдХ рд╕рд╣рдХрд░реНрдореА рдиреЗ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдкреЛрд╕реНрдЯ
рд░рд┐рдЯреНрд╡реАрдЯ рдХреА рдереА рдХрд┐ рдЧреЛ рдЗрдВрдЯрд░рдлреЗрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ ред рдпрд╣ рдЧреЛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рдмрдЧреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ рднреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЕрднреА рднреА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд▓реЗрдЦ рдореЗрдВ, рд▓реЗрдЦрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ
рд╕реЙрд░реНрдЯ рдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдПрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдЧреЛ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдХреНрд╕рд░ overengineering рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рд╣реЛрддреА рд╣реИред рдФрд░ рдРрд╕рд╛ рднреА рд╣реЛрддрд╛ рд╣реИ рдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд▓реЛрдЧ рди рдХреЗрд╡рд▓ рдЧрд╛рд▓реА рджреЗрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рд╡реЗ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реЗ рдЦреБрдж рдХреЛ рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ (рдФрд░ рдЧреЛ рдХреА рддрд╛рдХрдд рдореЗрдВ рд╕реЗ рдПрдХ) рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ)ред рдЧреЛ рдореЗрдВ рдареЗрда рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░, рд╡реИрд╕реЗ, рдбреЙрдХрдПрд░ рд╕реЗ рд╕реНрдЯрд┐рд╡ рдлреНрд░рд╛рдВрд╕рд┐рдпрд╛ рдХреА рдПрдХ
рдЕрдЪреНрдЫреА рд░рд┐рдкреЛрд░реНрдЯ рд╣реИред рд╡рд╣рд╛рдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрдИ рдмрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдлрд┐рд░ рднреА, рдпрд╣ рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╖рдп рдХрд╛рдлреА рд╕рддрд╣реА рд░реВрдк рд╕реЗ рдкреНрд░рдХрдЯ рд╣реБрдЖ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реВрдВрдЧрд╛ред
рдореВрд▓ рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдВ
рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд▓реЗрдЦрдХ рдПрдХ рдЫреЛрдЯрд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рд╡рд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдХреНрд╕рд░ рдмрдирд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИред
package animal type Animal interface { Speaks() string }
package circus import "animal" func Perform(a animal.Animal) string { return a.Speaks() }
рд▓реЗрдЦрдХ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ
"рдЬрд╛рд╡рд╛-рд╢реИрд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрдкрдпреЛрдЧ" рдХрд╣рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХрдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рд▓реЗрдЦрдХ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд-рд╕рд╛ рд╣реИред рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
package animal
package circus type Speaker interface { Speaks() string } func Perform(a Speaker) string { return a.Speaks() }
рдпрд╣рд╛рдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдореВрд▓ рд╡рд┐рдЪрд╛рд░:
"рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ ред
" рдпрд╣ рд╕рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЕрдм рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрдореВрд░реНрдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦрдХ, рд╕рдВрдпреЛрдЧ рд╕реЗ, рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
"рдЕрдкрдлреНрд░рдВрдЯ" рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред рд╣рдо рдПрдХ рд╣реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рдЪрд▓рд┐рдП рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ
рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░реНрдХрд╕ рд╣реИ рдФрд░ рдЬрд╛рдирд╡рд░ рд╣реИрдВред рд╕рд░реНрдХрд╕ рдХреЗ рдЕрдВрджрд░
`рдкрд░рдлреЙрд░реНрдо` рдирд╛рдо рдХреА рдПрдХ рдЕрдореВрд░реНрдд рдкрджреНрдзрддрд┐ рд╣реИ,
рдЬреЛ` рд╕реНрдкреАрдХрд░` рдЗрдВрдЯрд░рдлреЗрд╕
рд▓реЗрддреА рд╣реИ рдФрд░ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЛ рдЖрд╡рд╛рдЬрд╝ рджреЗрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреБрддреНрддреЗ рдХреА рдЫрд╛рд▓ рдмрдирд╛рдПрдЧрд╛ред рдПрдХ рдЬрд╛рдирд╡рд░ рдЗрдорд▓реА рдмрдирд╛рдПрдБред рдЪреВрдВрдХрд┐ рд╡рд╣ рдпрд╣рд╛рдВ рдЧреВрдВрдЧрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдЙрд╕реЗ рдЖрд╡рд╛рдЬреЗрдВ рднреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рдлреА рд╕рд╛рд░ рд╣реИред :)
package circus type Tamer struct{} func (t *Tamer) Speaks() string { return "WAT?" }
рдЕрдм рддрдХ, рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ред рд╣рдо рдФрд░ рдЖрдЧреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЖрдЗрдП рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЛ рдХрдорд╛рдВрдб рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЯреИрдорд░ рд╕рд┐рдЦрд╛рдПрдВ? рдЕрдм рддрдХ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ
рд╡реЙрдЗрд╕ рдХрдорд╛рдВрдб рд╣реЛрдЧреАред :)
package circus const ( ActVoice = iota ) func (t *Tamer) Command(action int, a Speaker) string { switch action { case ActVoice: return a.Speaks() } return "" }
package main import ( "animal" "circus" ) func main() { d := &animal.Dog{} t := &circus.Tamer{} t2 := &circus.Tamer{} t.Command(circus.ActVoice, d)
рдордореНрдо, рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдирд╛? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рд╣рдпреЛрдЧреА рдЦреБрд╢ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░ рдмрди рдЧрдпрд╛? : рдбреА рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
рдЕрдзреНрдпрдХреНрд╖ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдореВрд░реНрдд рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рд╣рдо рдПрдХ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдПрдХ (рдпрд╛ рдмрд▓реНрдХрд┐, рд╣рдо
"рдЧрд▓рдд рдЙрджрд╛рд╣рд░рдг" рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг) рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╡рд┐рдзрд┐ рд╕рдВрдХреЗрддрди рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
package circus type Animal interface { Speaker } func (t *Tamer) Command(action int, a Animal) string { }
рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдХреЛрдб рдЕрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реЛрдВрдЧреЗред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЬрдм рд╣рдо рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрджрд░реНрдн рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдПрдХ рдирдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рд╢реБрд░реВрдЖрдд, рдХрдо рд╕реЗ рдХрдо, рдХреЛрдб рдХреЛ рдкрд░рд┐рдорд╛рдг рдХреЗ рдХреНрд░рдо рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдкрдардиреАрдп рдмрдирд╛ рджрд┐рдпрд╛ред
рд╡реИрд╕реЗ, рдЯреИрдорд░ рдХреЛ
"рд╡реЙрдпрд╕" рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрд╕ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЬреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдРрд╕реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдкрд╛рд▓рддреВ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реИред
package circus type Animal interface { Speaker IsTrained() bool }
рдЕрдм рдПрдХ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЯреИрдорд░ рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ
рд╣рдо рдЕрдкрдиреЗ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВрдЧреЗ, рдЕрдиреНрдп рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд▓реЛ рдПрдХ рдмрд┐рд▓реНрд▓реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
package animal type Dog struct{} func (d Dog) IsTrained() bool { return true } func (d Dog) Speaks() string { return "woof" } func (d Dog) Jump() string { return "jumps" } func (d Dog) Sit() string { return "sit" } type Cat struct{} func (c Cat) IsTrained() bool { return false } func (c Cat) Speaks() string { return "meow!" } func (c Cat) Jump() string { return "meow!!" } func (c Cat) Sit() string { return "meow!!!" }
package circus const ( ActVoice = iota ActSit ActJump ) type Animal interface { Speaker IsTrained() bool Jump() string Sit() string } func (t *Tamer) Command(action int, a Animal) string { switch action { case ActVoice: return a.Speaks() case ActSit: return a.Sit() case ActJump: return a.Jump() } return "" }
рдорд╣рд╛рди, рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдорд╛рдВрдб рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗред рдПрдХ рдбрд┐рдЧреНрд░реА рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП ...: рдбреА
package main import ( "animal" "circus" ) func main() { t := &circus.Tamer{} d := &animal.Dog{} t.Command(circus.ActVoice, d)
рд╣рдорд╛рд░реА рдШрд░реЗрд▓реВ рдмрд┐рд▓реНрд▓рд┐рдпрд╛рдБ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рджрд╛рдпреА рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЯреИрдорд░ рдХреА рдорджрдж рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡рд╣ рдЙрдирдХреЗ рд╕рд╛рде рдкреАрдбрд╝рд┐рдд рди рд╣реЛред
package circus func (t *Tamer) Command(action int, a Animal) string { if !a.IsTrained() { panic("Sorry but this animal doesn't understand your commands") }
рдпрд╣реА рдмреЗрд╣рддрд░ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ
рдкрд╢реБ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ
рд╕реНрдкреАрдХрд░ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕
`Animal` рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ) рдЬреЛ рдХрд╛рдлреА рд╕рд╛рд░реНрдердХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдХрд╛рд░реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ
рдЕрдм рд╣рдо рд╡реНрдпрд╛рдкрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:
"рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред
"рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрджрд░реНрдн рдлрд┐рд░ рд╕реЗ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рдЖрдЗрдП рдЕрдкрдиреЗ рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЛ
" рдкрд╛рд▓рддреВ
" рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░реЗрдВ ред
рдкреНрд░рд╢рдВрд╕рд╛ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ, рдкрд╛рд▓рддреВ рдПрдХ рдЖрд╡рд╛рдЬ рдбрд╛рд▓реЗрдЧрд╛ред
package circus func (t *Tamer) Praise(a Speaker) string { return a.Speaks() }
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд╣рдо рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрддрд┐рд╢рдп рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдлрд┐рд░ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд▓рд╛рдирдд рд╣реИ, рдЕрдм рд╣рдо рджреВрд╕рд░реЗ рдХреЛрдЪ рдХреА
"рдкреНрд░рд╢рдВрд╕рд╛" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣
"рдЖрд╡рд╛рдЬ рджреЗрдЧрд╛" ред : D рдЗрд╕реЗ рдкрдХрдбрд╝реЛ? .. рд╕рдВрджрд░реНрдн рд╣рдореЗрд╢рд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред
package main import ( "animal" "circus" ) func main() { t := &circus.Tamer{} t2 := &circus.Tamer{} d := &animal.Dog{} c := &animal.Cat{} t.Praise(d)
рдореИрдВ рдХреНрдпреЛрдВ рд╣реВрдБ? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЕрднреА рднреА рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (
"рдкрд╛рд▓рддреВ" рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рд╣рдо рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ, рди рдХрд┐ рдХреЛрдИ рдкреНрд░рд╛рдгреА рдЬреЛ рдЖрд╡рд╛рдЬ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред
package circus
рдЗрддрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд╣рдо рдкрд╛рд▓рддреВ рдкрд╢реБ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рддрд╛рдореНрд░ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдХреЛрдб рдлрд┐рд░ рд╕реЗ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ред
рдЕрдм рдереЛрдбрд╝рд╛ рдмреЗрдб рдХреЗ рдХрд╛рдиреВрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдЬрд┐рд╕реЗ рдореИрдВ рдЫреВрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╡рд╣ рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ, рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рддрдерд╛рдХрдерд┐рдд
рдбрд╛рдХ рдХреЗ рдХрд╛рдиреВрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдЦрдХ рдЦреБрдж рдХрд╛рдиреВрди рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддрд╛ рд╣реИ:ред
"рдЖрдк рдЬреЛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд╕рд╛рде рд░реВрдврд╝рд┐рд╡рд╛рджреА рд░рд╣реЗрдВ, рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд░ рдмрдиреЗрдВ"
рдФрд░ рдЗрд╕реЗ рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ
"рдЬрд╛рдУ": "рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ, рд╡рд╛рдкрд╕реА рд╕рдВрд░рдЪрдирд╛"
func funcName(a INTERFACETYPE) CONCRETETYPE
рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕реЗ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рди рд▓реЗрдВред рд╢реИрддрд╛рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╕рдВрджрд░реНрдн рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рд╣рдореЗрд╢рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред рдЕрдореВрд░реНрддрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдПрдХ рд╣рд╛рдереА рдкрд╛рд╕ рдХреЗ
"рдЕрдлреНрд░реАрдХреА" рд╕рд░реНрдХрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдФрд░ рдЖрдкрдиреЗ рд╕рд░реНрдХрд╕ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЛ рдПрдХ рдирдП рд╢реЛ рдореЗрдВ рдПрдХ рд╣рд╛рдереА рдХреЛ рдЙрдзрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред рдЖрдкрдХреЗ рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд╛рдереА рдЕрдиреНрдп рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЗ рд╕рдорд╛рди рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╣рд╛рдереА рдХрд╛ рдЖрдХрд╛рд░ рдпрд╛ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЯреНрд░рдВрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред
package african import "circus" type Elephant struct{} func (e Elephant) Speaks() string { return "pawoo!" } func (e Elephant) Jump() string { return "o_O" } func (e Elephant) Sit() string { return "sit" } func (e Elephant) IsTrained() bool { return true } func GetElephant() circus.Animal { return &Elephant{} }
package main import ( "african" "circus" ) func main() { t := &circus.Tamer{} e := african.GetElephant() t.Command(circus.ActVoice, e)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЪреВрдВрдХрд┐ рд╣рд╛рдереА рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдЗрд╕реЗ рдЕрдиреНрдп рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛
рдЬрдм рдЧрд░реНрднрдкрд╛рдд рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рддреЛ рд╕рдВрджрд░реНрдн рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдореВрд░реНрддрддрд╛ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рди рдХрд░реЗрдВ рдФрд░ рдЙрдирд╕реЗ рдбрд░реЗрдВ, рдЬреИрд╕реЗ рдЖрдкрдХреЛ рдЙрдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреЛ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдирд╣реАрдВ рд▓реЗрдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ рдЬреЛ рд╕рдордп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдРрд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдмрд╛рдХреА рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рдЦреЛрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рджреВрд░ рд╣реЛ рдЧрдпрд╛ред
рдмреЗрд╢рдХ, рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреЛрд╕реНрдЯ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЙрдВрдЧрд▓реА рд╕реЗ рдЪреВрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рддрд░реНрдХ рдЕрд╕рдВрдмрджреНрдз рд╣реЛрдВрдЧреЗред рдлрд┐рд░ рднреА, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдкреНрд░реЗрд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рди рдХреЗрд╡рд▓ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдореВрд░реНрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЦреНрдп рдмрд╛рдд, рджреЛрд╕реНрддреЛрдВ, рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рд╕реЗ рд╕рдЪреНрдЪрд╛ рдЖрдирдВрдж рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛!
рдкреБрдирд╢реНрдЪред рдирдореВрдирд╛ рдХреЛрдб рдФрд░ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг
GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред