рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд╡рд┐рд╖рдп рдкрд░, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдХрдИ рдХрд┐рддрд╛рдмреЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдИ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╡рд┐рд╖рдп рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреИрдЯрд░реНрди рд╣рдореЗрдВ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд, рд╕рдордп-рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдФрд░ рддрдХрдиреАрдХреА рдЛрдгреЛрдВ рдХреЛ рдХрдо рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рдЖрдЧрдорди рдХреЗ рдмрд╛рдж рд╕реЗ, рдЙрдирдХреЗ рдкреНрд░рднрд╛рд╡реА рдЙрдкрдпреЛрдЧ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдФрд░ рдпрд╣ рдЕрджреНрднреБрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдорд░рд╣рдо рдореЗрдВ рдПрдХ рдордХреНрдЦреА рдереА: рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╣реИред рдФрд░ рдЧреЛрд▓рдВрдЧ - рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ (рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдУрдУрдкреА рдореЙрдбрд▓ рднреА рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдкреИрдЯрд░реНрди рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдВ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЧреЛрд▓рдВрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдбреЗрдХреЛрд░реЗрдЯрд░
рдбреЗрдХреЛрд░реЗрдЯрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрдкрдХреЛ рдЙрд╕реА рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ (рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ) рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ, рдЧреЛрд▓рдВрдЧ рдореЗрдВ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рднреА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд╡реЗрд░реА рд░реВрдкрд░реЗрдЦрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
func ProfileMiddleware(next http.Handler) http.Handler { started := time.Now() next.ServeHTTP() elapsed := time.Now().Sub(started) fmt.Printf("HTTP: elapsed time %d", elapsed) }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдХреЛрд░реЗрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХрдорд╛рддреНрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдорд╛рдВрдЧ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрд╛рдкрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╛рд▓рд╛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдбреЗрдЯрд╛рдмреЗрд╕ (рдкреИрдХреЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ / sql) рддрдХ рдкрд╣реБрдВрдЪ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реАрдЬрд╝ рдХреА рд╕рдорд╛рди рд░реВрдкрд░реЗрдЦрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред
- SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдПрдБред
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд╛рдн рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд╣реИрдВ:
- рдХреЛрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рдШрдЯрдХ рдХреА рдХреЛрдб рд╕рдлрд╛рдИ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рд╣реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛрддреА рд╣реИред
- рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреА рд░рдЪрдирд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдореЗрдВ рдПрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдореЙрдбрд▓ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред
- рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╢рдЯрдбрд╛рдЙрди рдХреЗ рдХрд╛рд░рдг рд╣рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдореЛрдб рдореЗрдВ рд╢реВрдиреНрдп рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдорд┐рд▓рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрдиред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рдЬреАрд╡рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкрд┐рдВрдЧ рдХрд░рдирд╛ред
- рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ред рдЕрдиреБрд░реЛрдз рд╢рд░реАрд░ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рджреЛрдиреЛрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯред
- рд╕реНрдирд┐рдлрд░ред рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ред
- рдХреНрд▓реЛрдиред рдбрд┐рдмрдЧрд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдХреНрд▓реЛрдирд┐рдВрдЧред
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрдм рдЕрдореАрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ: рдпрд╣ рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╡рд╕реНрддреБ рдХреЛ рд╕реМрдВрдкрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП DML рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (INSERT / UPDATE / DELETE рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдПрдХ рдЙрдиреНрдирдд рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдкреВрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдХреЗрд╡рд▓ рдПрдХреНрдЬреЗрдХ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░реЗрдВред
type MyDatabase interface{ Query(...) (sql.Rows, error) QueryRow(...) error Exec(query string, args ...interface) error Ping() error } type MyExecutor struct { MyDatabase } func (e *MyExecutor) Exec(query string, args ...interface) error { ... }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЧреЛрд▓рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╕рдореГрджреНрдз рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдирд╛ рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдард┐рди рдирд╣реАрдВ рд╣реИред
рдЦрд╛рдХрд╛ рд╡рд┐рдзрд┐
рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐ (Engред рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐) - рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдЬреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЖрдзрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рд╕рдордЧреНрд░ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЧреЛрд▓рдВрдЧ рднрд╛рд╖рд╛ OOP рдкреНрд░рддрд┐рдорд╛рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЗрд╕рдХреЗ рд╢реБрджреНрдз рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рднреА рд╣рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
func Method(s string) error
рдЬрдм рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд╛рдкрддрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХреЛ рдкреВрд░рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рдиред
type MyStruct struct { MethodImpl func (me *MyStruct, s string) error } // Wrapper for template method func (ms *MyStruct) Method(s string) error { return ms.MethodImpl(ms, s) }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рд╢рд╛рд╕реНрддреНрд░реАрдп OOP рд╕реЗ рд▓рдЧрднрдЧ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред
рдЕрдиреБрдХреВрд▓рдХ
"рдПрдбреЗрдкреНрдЯрд░" рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рджреВрд╕рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд░реНрдЧ рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдбреЗрдкреНрдЯрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреВрд░реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд╡рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ, рддреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд╣реИрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдХреБрдЫ рдРрд╕реА рд╕реЗрд╡рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рдПрдкреАрдЖрдИ рд╣реИрдВ:
type MyService interface { Create(ctx context.Context, order int) (id int, err error) }
рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (gRPC рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╡рд╛рд▓реЗ рдПрдбрд╛рдкреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
type Endpoint func(ctx context.Context, request interface{}) (interface{}, error) type CreateRequest struct { Order int } type CreateResponse struct { ID int, Err error } func makeCreateEndpoint(s MyService) Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) {
MakeCreateEndpoint рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддреАрди рдорд╛рдирдХ рдЪрд░рдг рд╣реИрдВ:
- рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдорд╛рди
- рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд░рд╣реА рд╕реЗрд╡рд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдПрдкреАрдЖрдИ рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛
- рдореВрд▓реНрдп рдПрдиреНрдХреЛрдбрд┐рдВрдЧ
рдЧреЛрдХрд┐рдЯ рдкреИрдХреЗрдЬ рдХреЗ рд╕рднреА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред
рдЖрдЧрдВрддреБрдХ
"рд╡рд┐рдЬрд╝рд┐рдЯрд░" рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкреГрдердХреНрдХрд░рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдирдП рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрд╣ рдЦреБрд▓реЗ / рдмрдВрдж рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред
рдЬреНрдпрд╛рдорд┐рддреАрдп рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдкреНрд░рд╕рд┐рджреНрдз рдЖрдЧрдВрддреБрдХ рдкреИрдЯрд░реНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
type Geometry interface { Visit(GeometryVisitor) (interface{}, error) } type GeometryVisitor interface { VisitPoint(p *Point) (interface{}, error) VisitLine(l *Line) (interface{}, error) VisitCircle(c *Circle) (interface{}, error) } type Point struct{ X, Y float32 } func (point *Point) Visit(v GeometryVisitor) (interface{}, error) { return v.VisitPoint(point) } type Line struct{ X1, Y1 float32 X2, Y2 float32 } func (line *Line) Visit(v GeometryVisitor) (interface{}, error) { return v.VisitLine(line) } type Circle struct{ X, Y, R float32 } func (circle *Circle) Visit(v GeometryVisitor) (interface{}, error) { return v.VisitCircle(circle) }
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдмрд┐рдВрджреБ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдХрд╛рд░ рддрдХ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдгрдиреАрддрд┐ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
type DistanceStrategy struct { X, Y float32 } func (s *DistanceStrategy) VisitPoint(p *Point) (interface{}, error) {
рдЗрд╕реА рддрд░рд╣, рд╣рдо рдЙрди рдЕрдиреНрдп рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рд▓рдВрдмрд╡рдд рд╕реАрдорд╛
- рд╡рд╕реНрддреБ рдХреА рдХреНрд╖реИрддрд┐рдЬ рд╕реАрдорд╛
- рдиреНрдпреВрдирддрдо рдлреИрд▓реЗ рд╣реБрдП рд╡рд░реНрдЧ (MBR) рдХрд╛ рдирд┐рд░реНрдорд╛рдг
- рдЕрдиреНрдп рдЖрджрд┐рдо рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЖрдВрдХрдбрд╝реЗ (рдкреНрд╡рд╛рдЗрдВрдЯ, рд▓рд╛рдЗрди, рд╕рд░реНрдХрд▓ ...) рдЗрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЬреНрдЮрд╛рди рдЬреНрдпрд╛рдорд┐рддрд┐ рд╡рд┐рд╕рд╛рд░рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдХ рд╕рдордп рдореЗрдВ, рдПрдХ рдХрд╛рд░реНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рджреЛ рдордирдорд╛рдирд╛ рднреМрдЧреЛрд▓рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдерд╛ред рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рдЕрд▓рдЧ рдереЗ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдкрд░реНрдпрд╛рдкреНрдд рдХреБрд╢рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рдереЗред рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд▓рдХреНрд╖реНрдп рдкрджреНрдзрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдПрдХ рдЕрд▓рдЧ рдкреБрдирд░рд╛рд╡рд░реНрддрди рдХрджрдо рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдиреЗ рдореБрдЭреЗ рдбрдмрд▓ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдореЗрд░реЗ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
type geometryStrategy struct{ G Geometry } func (s *geometryStrategy) VisitPoint(p *Point) (interface{}, error) { return sGVisit(&pointStrategy{Point: p}) } func (d *geometryStrategy) VisitLine(l *Line) (interface{}, error) { return sGVisit(&lineStrategy{Line: l}) } func (d *geometryStrategy) VisitCircle(c *Circle) (interface{}, error) { return sGVisit(&circleStrategy{Circle: c}) } type pointStrategy struct{ *Point } func (point *pointStrategy) Visit(p *Point) (interface{}, error) {
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рджреЛ-рд╕реНрддрд░реАрдп рдЪрдпрдирд╛рддреНрдордХ рддрдВрддреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рджреЛ рдЖрджрд┐рдореЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдПрдЧрд╛ред рд╣рдо рдХреЗрд╡рд▓ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рд░реВрдк рд╕реЗ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдИ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЧреЛрд▓рдВрдЧ рдореЗрдВ рдХреЛрдИ рд╢рд╛рд╕реНрддреНрд░реАрдп рдУрдУрдкреА рдирд╣реАрдВ рд╣реИ, рднрд╛рд╖рд╛ рдЕрдкрдиреА рдЦреБрдж рдХреА рдмреЛрд▓реА рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреА рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдХреА рддрд╛рдХрдд рдкрд░ рдЦреЗрд▓рддреА рд╣реИред рдпреЗ рдкреИрдЯрд░реНрди рдЗрдирдХрд╛рд░ рд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕реНрд╡реАрдХреГрддрд┐ рддрдХ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред
рдпрджрд┐ рд╕рдореНрдорд╛рдирд┐рдд рд╣рд╛рдмреНрд░реЛрдЬрд╝рд┐рдЯреЗрд▓реА рдкреИрдЯрд░реНрди рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд╢рд░реНрдореАрд▓реА рди рд╣реЛрдВ рдФрд░ рдЗрд╕ рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░реЗрдВред