13 рджрд┐рд╕ре░ 2025┬╖8 рдорд┐рдирдЯ рдкрдврд╝рдиреЗ рдореЗрдВ

рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП Go рдмреИрдХрдПрдВрдб рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдмрдврд╝рд╛рдирд╛

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

рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП Go рдмреИрдХрдПрдВрдб рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдмрдврд╝рд╛рдирд╛

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

рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдХрд┐рд╕реА рд╣реИрдВрдбтАСрд░рд┐рдЯрди Go рд░рд┐рдкреЛ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ред AppMaster рдЬреИрд╕реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдмреИрдХрдПрдВрдб рд╡рд┐рдЬрд╝реБрдЕрд▓ рдореЙрдбрд▓ (рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛, рдмрд┐рдЬрд╝рдиреЗрд╕ рдкреНрд░реЛрд╕реЗрд╕реЗрдЬрд╝, API рд╕реЗрдЯрдЕрдк) рд╕реЗ рдЬрдирд░реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдЖрдк рдлрд┐рд░ рд╕реЗ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрдирд░реЗрдЯрд░ рдХреЛрдб рдХреЗ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯреЗрдб рдореЙрдбрд▓ рд╕реЗ рдореЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдлрд╝тАСрд╕реБрдерд░рд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдкрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

рдЧрд╝рд▓рдд рдЬрдЧрд╣ рдкрд░ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝реЗрд╢рди рд╣реЛрдиреЗ рдкрд░ рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдБ рджреЗрдЦрддреЗ рд╣реИрдВ:

  • рдЖрдкрдХреА рдПрдбрд┐рдЯреНрд╕ рдлрд┐рд░ рд╕реЗ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреЗ рдмрд╛рдж рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдпрд╛ рдЖрдк рдШрдВрдЯреЛрдВ рдХреЙрдиреНрдлреНрд▓рд┐рдХреНрдЯ рд╕реБрд▓рдЭрд╛рдиреЗ рдореЗрдВ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
  • рд░реВрдЯ рд╢рд┐рдлреНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЕрдм рдЙрд╕ рдЬрдЧрд╣ рдирд╣реАрдВ рдЪрд▓рддрд╛ рдЬрд╣рд╛рдБ рдЖрдк рдЙрдореНрдореАрдж рдХрд░рддреЗ рдереЗред
  • рд▓реЙрдЬрд┐рдХ рдиреЛтАСрдХреЛрдб рдореЙрдбрд▓ рдФрд░ Go рдХреЛрдб рдХреЗ рдмреАрдЪ рдбреБрдкреНрд▓реАрдХреЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдбреНрд░рд┐рдлреНрдЯ рдХрд░ рдЬрд╛рддрд╛ рд╣реИред
  • рдПрдХ "рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЫреЛрдЯрд╛ рдмрджрд▓рд╛рд╡" рдПрдХ рдРрд╕рд╛ рдлреЛрд░реНрдХ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЛрдИ рдЫреВрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред

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

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

рдХреЛрдбрдмреЗрд╕ рдХреА рдореИрдкрд┐рдВрдЧ: рдЬрдирд░реЗрдЯреЗрдб рдкрд╛рд░реНрдЯ рдмрдирд╛рдо рдЖрдкрдХреА рдкрд╛рд░реНрдЯреНрд╕

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

рдЬрдирд░реЗрдЯреЗрдб рдХреЛрдб рдЕрдХреНрд╕рд░ рдЦреБрдж рдХреЛ рджрд┐рдЦрд╛ рджреЗрддрд╛ рд╣реИ: "Code generated" рдпрд╛ "DO NOT EDIT" рдЬреИрд╕реЗ рд╣реЗрдбрд░ рдХрдореЗрдВрдЯ, рд▓рдЧрд╛рддрд╛рд░ рдирд╛рдордХрд░рдг рдкреИрдЯрд░реНрди, рдФрд░ рдмрд╣реБрдд рдпреВрдирд┐рдлреЙрд░реНрдо рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╣реА рдЗрдВрд╕рд╛рдиреА рдХрдореЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВред

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

  • Generated (read-only): рд╡реЗ рдлрд╛рдЗрд▓реЗрдВ рдЬрд┐рди рдкрд░ рд╕реНрдкрд╖реНрдЯ рдЬрдирд░реЗрдЯрд░ рдорд╛рд░реНрдХрд░реНрд╕ рд╣реЛрдВ, рджреЛрд╣рд░рд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди рд╣реЛрдВ, рдпрд╛ рдРрд╕реЗ рдлрд╝реЛрд▓реНрдбрд░ рдЬреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЙрдлрд╝реНрдЯ рдХреЗ рдХрдВрдХрд╛рд▓ рдЬреИрд╕рд╛ рд▓рдЧрддреЗ рд╣реЛрдВред
  • Owned by you: рдкреИрдХреЗрдЬ рдЬреЛ рдЖрдкрдиреЗ рдмрдирд╛рдП рд╣реИрдВ, рд░реИрдкрд░ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬрд┐рд╕реЗ рдЖрдк рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  • Shared seams: рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдмрдиреЗ рд╣реБрдП рд╡рд╛рдпрд░рд┐рдВрдЧ рдкреЙрдЗрдВрдЯтАФрд░реВрдЯреНрд╕, рдорд┐рдбрд▓рд╡реЗрдпрд░, рд╣реБрдХтАФрдЬрд╣рд╛рдБ рдХрднреАтАСрдХрднрд╛рд░ рдЫреЛрдЯреЗ рдПрдбрд┐рдЯреНрд╕ рдЬрд╝рд░реВрд░реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдкрд░ рд╡реЗ рдиреНрдпреВрдирддрдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

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

рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЗрд╕ рдмреЙрдЙрдВрдбрд░реА рдХреЛ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдиреЗ рд╣реЗрддреБ рд░рд┐рдкреЛ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдиреЛрдЯ рд░рдЦреЗрдВ (рдЬреИрд╕реЗ рд░реВрдЯ README)ред рд╕рд░рд▓ рд░рдЦреЗрдВ:

"Generator-owned files: anything with a DO NOT EDIT header and folders X/Y. Our code lives under internal/custom (or similar). Only touch wiring points A/B, and keep changes there small. Any wiring edit needs a comment explaining why it can't live in our own package."

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

рдХрд╕реНрдЯрдо рдХреЛрдб рдХрд╣рд╛рдБ рд░рдЦреЗрдВ рддрд╛рдХрд┐ рдЕрдкрдЧреНрд░реЗрдб рд╕рд░рд▓ рд░рд╣реЗрдВ

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

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

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓реЗрдЖрдЙрдЯ:

  • internal/custom/ тАФ рдорд┐рдбрд▓рд╡реЗрдпрд░, рд╣реИрдВрдбрд▓рд░реНрд╕, рдФрд░ рдЫреЛрдЯреЗ рд╣реЗрд▓реНрдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП
  • internal/custom/routes.go тАФ рдПрдХ рдЬрдЧрд╣ рдкрд░ рдХрд╕реНрдЯрдо рд░реВрдЯреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • internal/custom/middleware/ тАФ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ/рд░реЗрд╕реНрдкреЙрдиреНрд╕ рд▓реЙрдЬрд┐рдХ рдХреЗ рд▓рд┐рдП
  • internal/custom/README.md тАФ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдбрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд┐рдпрдо

рд╕рд░реНрд╡рд░ рд╡рд╛рдпрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рдБрдЪ рдЕрд▓рдЧтАСрдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рдПрдбрд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВред рдПрдХ рдкрддрд▓рд╛ "рд╣реБрдХ рдкреЙрдЗрдВрдЯ" рд░рдЦреЗрдВ рдЬрд╣рд╛рдБ рдЖрдк рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЕрдЯреИрдЪ рдХрд░ рдХреЗ рдПрдХреНрд╕реНрдЯреНрд░рд╛ рд░реВрдЯреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЬрдирд░реЗрдЯреЗрдб рд╕рд░реНрд╡рд░ рдПрдХ рд░рд╛рдЙрдЯрд░ рдпрд╛ рд╣реИрдВрдбрд▓рд░ рдЪреЗрди рдПрдХреНрд╕реНрдкреЛрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣рд╛рдБ рдкреНрд▓рдЧтАСрдЗрди рдХрд░реЗрдВред рдЕрдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛, рддреЛ рдПрдВрдЯреНрд░реАтАСрдкреЙрдЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдХреБрдЫ рдРрд╕рд╛ рдХреЙрд▓ рдХрд░реЗ: custom.Register(router).

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

рдЪрд░рдг рджрд░ рдЪрд░рдг: рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝рдирд╛

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

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

рдПрдХ рдЫреЛрдЯрд╛ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдВ (рдЙрджрд╛., internal/custom/middleware) рдЬреЛ рдкреВрд░реЗ рдРрдк рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЬрд╝рд░реВрд░рдд рди рд╣реЛред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рддрд╣ рдЫреЛрдЯреА рд░рдЦреЗрдВ: рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдорд╛рдирдХ Go рд╣реИрдВрдбрд▓рд░ рд░реИрдкрд░ рд▓реМрдЯрд╛рдПред

package middleware

import "net/http"

func RequestID(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// Add header, log, or attach to context here.
		next.ServeHTTP(w, r)
	})
}

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

рд╡реЗрд░рд┐рдлрд┐рдХреЗрд╢рди рд▓реВрдк рдЫреЛрдЯрд╛ рд░рдЦреЗрдВ:

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

рдЫреЛрдЯрд╛ рдбрд┐рдлрд╝, рдПрдХ рд╡рд╛рдпрд░рд┐рдВрдЧ рдкреЙрдЗрдВрдЯ, рдЖрд╕рд╛рди рд░реАтАСрдПрдХреНрд╕рдкреЛрд░реНрдЯред

рдЪрд░рдг рджрд░ рдЪрд░рдг: рдирдпрд╛ рдПрдиреНрдбрдкреЙрдЗрдВрдЯ рдЬреЛрдбрд╝рдирд╛ рдмрд┐рдирд╛ рд╕рдм рдХреБрдЫ рдлреЛрд░реНрдХ рдХрд┐рдП

Ship custom endpoints cleanly
Prototype a new endpoint in AppMaster, then attach a small custom handler where it belongs.
Try Now

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

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд▓рд┐рдЦреЗрдВ: рдПрдиреНрдбрдкреЙрдЗрдВрдЯ рдХреНрдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ (рдХреНрд╡реЗрд░реА рдкреЗрд░рд╛рдореАрдЯрд░реНрд╕, JSON рдмреЙрдбреА, рд╣реЗрдбрд░)? рдХреНрдпрд╛ рд░рд┐рдЯрд░реНрди рдХрд░реЗрдЧрд╛ (JSON рд╢реЗрдк)? рд╕реНрдЯреЗрдЯрд╕ рдХреЛрдбреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдЪреБрди рд▓реЗрдВ рддрд╛рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ "рдЬреЛ рднреА рдХрд╛рдо рдХрд┐рдпрд╛" рдЬреИрд╕рд╛ рди рд░рд╣реЗред

рдХрд╕реНрдЯрдо рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдПрдВред рдмреЛрд░рд┐рдВрдЧ рд░рдЦреЗрдВ: рдЗрдирдкреБрдЯ рдкрдврд╝реЗрдВ, рд╡реЗрд▓рд┐рдбреЗрдЯ рдХрд░реЗрдВ, рдореМрдЬреВрджрд╛ рд╕рд░реНрд╡рд┐рд╕реЗрд╕ рдпрд╛ DB рд╣реЗрд▓реНрдкрд░реНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдФрд░ рдЬрд╡рд╛рдм рд▓рд┐рдЦреЗрдВред

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

рдПрдХ рдЫреЛрдЯрд╛ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реБрд╕рдВрдЧрдд рд░рдЦрддрд╛ рд╣реИ:

  • рдЗрдирдкреБрдЯ рдЬрд▓реНрджреА рд╡реЗрд▓рд┐рдбреЗрдЯ рдХрд░реЗрдВ (required рдлрд╝реАрд▓реНрдб, рдлреЙрд░рдореИрдЯ, рдорд┐рди/рдореИрдХреНрд╕)ред
  • рдПрдХ рд╣реА рдПрд░рд░ рд╢реЗрдк рд╣рд░ рдЬрдЧрд╣ рд░рд┐рдЯрд░реНрди рдХрд░реЗрдВ (message, code, details)ред
  • рдЬрд╣рд╛рдБ рдХрд╛рдо рд╣реИрдВрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣рд╛рдБ context timeouts рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (DB, рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓)ред
  • рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдПрд░рд░ рдХреЛ рдПрдХ рдмрд╛рд░ рд▓реЙрдЧ рдХрд░реЗрдВ, рдлрд┐рд░ рдПрдХ рд╕рд╛рдлрд╝ 500 рд░рд┐рдЯрд░реНрди рдХрд░реЗрдВред
  • рдирдпрд╛ рд░реВрдЯ рд╣рд┐рдЯ рдХрд░рдХреЗ рдПрдХ рдЫреЛрдЯрд╛ рдЯреЗрд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд╕реНрдЯреЗрдЯрд╕ рдФрд░ JSON рдЪреЗрдХ рдХрд░реЗред

рд╕рд╛рде рд╣реА рдХрдиреНрдлрд╝рд░реНрдо рдХрд░реЗрдВ рдХрд┐ рд░рд╛рдЙрдЯрд░ рдЖрдкрдХрд╛ рдПрдиреНрдбрдкреЙрдЗрдВрдЯ рдареАрдХтАСрдареАрдХ рдПрдХ рдмрд╛рд░ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдбреБрдкреНрд▓реАрдХреЗрдЯ рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рдкреЛрд╕реНрдЯтАСрдорд░реНрдЬ рдЖрдо рд╣реЛрддрд╛ рд╣реИред

рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдкреИрдЯрд░реНрди рдЬреЛ рдЪреЗрдВрдЬреЗрдЬрд╝ рдХреЛ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВ

Stop forking generated code
Save time by generating the core app, then only hand-code the integrations you need.
Build With No Code

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

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдХрдВрдкреЛрдЬрд╝рд┐рд╢рди рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ

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

рдпрджрд┐ рдЖрдкрдХреЛ рдирдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рд┐рдП (рд░реЗрдЯтАСрд▓рд┐рдорд┐рдЯрд┐рдВрдЧ, рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ, рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ IDs), рдЗрд╕реЗ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдПрдХ рд╕рд┐рдВрдЧрд▓ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВред рд░рд┐рд╡реНрдпреВ рдореЗрдВ рдпрд╣ рд╕рдордЭрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: "one new package, one registration point."

рдПрдбреИрдкреНрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЬрдирд░реЗрдЯреЗрдб рдЯрд╛рдЗрдкреНрд╕ рд▓реАрдХ рди рд╣реЛрдВ

рдЬрдирд░реЗрдЯреЗрдб рдореЙрдбрд▓ рдФрд░ DTOs рдЕрдХреНрд╕рд░ рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВред рдЕрдкрдЧреНрд░реЗрдб рджрд░реНрдж рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЙрдЙрдВрдбрд░реА рдкрд░ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░реЗрдВ:

  • рдЬрдирд░реЗрдЯреЗрдб рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдЯрд╛рдЗрдкреНрд╕ рдХреЛ рдЕрдкрдиреА рдЗрдВрдЯрд░рдирд▓ рд╕реНрдЯреНрд░рдХреНрдЯ рдореЗрдВ рдмрджрд▓реЗрдВред
  • рдбреЛрдореЗрди рд▓реЙрдЬрд┐рдХ рдХреЗрд╡рд▓ рдЕрдкрдиреА рд╕реНрдЯреНрд░рдХреНрдЯреНрд╕ рдкрд░ рдЪрд▓рд╛рдПрдБред
  • рд░рд┐рдЬрд╝рд▓реНрдЯреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдЬрдирд░реЗрдЯреЗрдб рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдЯрд╛рдЗрдкреНрд╕ рдореЗрдВ рдмрджрд▓реЗрдВред

рдЗрд╕ рддрд░рд╣ рдЕрдЧрд░ рдЬрдирд░реЗрдЯреЗрдб рдЯрд╛рдЗрдкреНрд╕ рд╢рд┐рдлреНрдЯ рдХрд░реЗрдВ, рддреЛ рдХрдореНрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЛ рдПрдХ рдЬрдЧрд╣ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рджреЗрдЧрд╛ред

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

// internal/integrations/http.go
func RegisterCustom(r *mux.Router) {
    r.Use(RequestIDMiddleware)
    r.Use(AuditLogMiddleware)
}

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд┐рдпрдо: рдпрджрд┐ рдЖрдк рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ 2тАУ3 рд╡рд╛рдХреНрдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рддреЛ рд╡рд╣ рд╢рд╛рдпрдж рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред

рд╕рдордп рдХреЗ рд╕рд╛рде рдбрд┐рдлреНрд╕ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ

рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рд░реАтАСрдПрдХреНрд╕рдкреЛрд░реНрдЯ рд╕рдкреНрддрд╛рд╣ рднрд░ рдХреЗ рдХреЙрдиреНрдлреНрд▓рд┐рдХреНрдЯ рдореЗрдВ рди рдмрджрд▓ рдЬрд╛рдПред рдПрдбрд┐рдЯреНрд╕ рдХреЛ рдЫреЛрдЯреЗ, рдвреВрдБрдврдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рд╕рд░рд▓ рд░рдЦреЗрдВред

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

рдПрдХ рдХрдорд┐рдЯ рд░реВрдЯреАрди рдЬреЛ рдкрдардиреАрдп рд░рд╣реЗ:

  • рд╣рд░ рдХрдорд┐рдЯ рдХрд╛ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рд╣реЛ ("Add request ID middleware", рди рдХрд┐ "misc fixes").
  • рдлреЙрд░реНрдореИрдЯрд┐рдВрдЧтАСрдУрдирд▓реА рдЪреЗрдВрдЬреЗрдЬрд╝ рдХреЛ рд▓реЙрдЬрд┐рдХ рдЪреЗрдВрдЬреЗрдЬрд╝ рдХреЗ рд╕рд╛рде рдорд┐рдХреНрд╕ рди рдХрд░реЗрдВред
  • рд╣рд░ рд░реАтАСрдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреЗ рдмрд╛рдж, рдкрд╣рд▓реЗ рдЬрдирд░реЗрдЯреЗрдб рдЕрдкрдбреЗрдЯ рдХреЛ рдХрдорд┐рдЯ рдХрд░реЗрдВ, рдлрд┐рд░ рдЕрдкрдиреА рдХрд╕реНрдЯрдо рдПрдбрдЬрд╕реНрдЯрдореЗрдВрдЯреНрд╕ рдХреЛ рдХрдорд┐рдЯ рдХрд░реЗрдВред
  • рдХрдорд┐рдЯ рдореИрд╕реЗрдЬ рдореЗрдВ рдЬрд┐рд╕ рдкреИрдХреЗрдЬ рдпрд╛ рдлрд╛рдЗрд▓ рдХреЛ рдЖрдкрдиреЗ рдЫреБрдЖ рдЙрд╕рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░реЗрдВред

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

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

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

рдЕрдкрдЧреНрд░реЗрдб рдХреА рдпреЛрдЬрдирд╛: рд░реАтАСрдПрдХреНрд╕рдкреЛрд░реНрдЯ, рдорд░реНрдЬ, рдФрд░ рд╡реЗрд░рд┐рдлрд╝рд╛рдИ

Export code without surprises
Model data and workflows visually, then export a Go backend you can extend safely.
Try AppMaster

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

рдЕрдкрдЧреНрд░реЗрдб рдХреА рд░рд┐рджрдо рдЪреБрдиреЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд░рд┐рд╕реНрдХ рдЯреЛрд▓рд░реЗрдВрд╕ рдФрд░ рдРрдк рдХреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реЛ:

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

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

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

рдПрдХ рдЫреЛрдЯрд╛ рд░рд┐рдЧреНрд░реЗрд╢рди рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╡реЗрд░рд┐рдлрд╝рд╛рдИ рдХрд░реЗрдВ:

  • рдСрде рдлреНрд▓реЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд▓реЙрдЧрд┐рди, рдЯреЛрдХрди рд░рд┐рдлреНрд░реЗрд╢, рд▓реЙрдЧрдЖрдЙрдЯ)
  • 3тАУ5 рдкреНрд░рдореБрдЦ API рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рд╡рд╣реА рд╕реНрдЯреЗрдЯрд╕ рдХреЛрдб рдФрд░ рд╢реЗрдк рд░рд┐рдЯрд░реНрди рдХрд░рддреЗ рд╣реИрдВ
  • рд╣рд░ рдПрдиреНрдбрдкреЙрдЗрдВрдЯ рдХрд╛ рдПрдХ рдЕрдирд╣реИрдкреНрдкреА рдкрд╛рде (рдЦрд░рд╛рдм рдЗрдирдкреБрдЯ, рдорд┐рд╕рд┐рдВрдЧ рдСрде)
  • рдмреИрдХрдЧреНрд░рд╛рдЙрдгреНрдб рдЬреЙрдмреНрд╕ рдпрд╛ рд╢реЗрдбреНрдпреВрд▓реНрдб рдЯрд╛рд╕реНрдХ рдЕрднреА рднреА рдЪрд▓рддреЗ рд╣реИрдВ
  • рд╣реЗрд▓реНрде/рд░реАрдбрд┐рдиреЗрд╕ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЖрдкрдХреЗ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реЗрдЯрдЕрдк рдореЗрдВ OK рд░рд┐рдЯрд░реНрди рдХрд░реЗ

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

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

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

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

рдЬрдирд░реЗрдЯреЗрдб рдЗрдиреНрдЯрд░реНрдирд▓ рдкрд░ рдЯрд╛рдЗрдЯ рдХрдкрд▓рд┐рдВрдЧ

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

рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реАрдорд╛рдПрдБ:

  • рдХрд╕реНрдЯрдо рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдпрдВрддреНрд░рд┐рдд request/response DTOs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рдЬрдирд░реЗрдЯреЗрдб рд▓реЗрдпрд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕рдкреЛрд░реНрдЯреЗрдб рдЗрдВрдЯрд░рдлреЗрд╕реЗрдЬрд╝ рдпрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░реЗрдВ, рди рдХрд┐ internal рдЯрд╛рдЗрдкреНрд╕ рдХреЗ рд╕рд╛рдеред
  • рдорд┐рдбрд▓рд╡реЗрдпрд░ рдирд┐рд░реНрдгрдп HTTP рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡реНрд╕ (рд╣реЗрдбрд░, рдореЗрдердб, рдкрд╛рде) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд░рдЦреЗрдВ рдЬрд╣рд╛рдБ рд╕рдВрднрд╡ рд╣реЛред

рдЬрд╣рд╛рдБ рдЬрд╝рд░реВрд░рдд рд╣реЛ рд╡рд╣рд╛рдБ рдЯреЗрд╕реНрдЯ рд╕реНрдХрд┐рдк рдХрд░рдирд╛

рдорд┐рдбрд▓рд╡реЗрдпрд░ рдФрд░ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдмрдЧ рдЯрд╛рдЗрдо рдмрд░реНрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдлреЗрд▓реНрдпреЛрд░ рдЕрдХреНрд╕рд░ рд░реИрдВрдбрдо 401s рдпрд╛ "рдПрдиреНрдбрдкреЙрдЗрдВрдЯ рдиреЙрдЯ рдлрд╛рдЙрдВрдб" рдЬреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВред рдХреБрдЫ рдлреЛрдХрд╕реНрдб рдЯреЗрд╕реНрдЯ рдШрдВрдЯреЛрдВ рдмрдЪрд╛рддреЗ рд╣реИрдВред

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

рдкреНрд░реАтАСрд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рд┐рдд рдЪреЗрдХрд▓рд┐рд╕реНрдЯ

Build internal tools faster
Build an internal tool or admin portal fast, then extend it with custom Go middleware.
Start Free

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

  • рд╕рд╛рд░рд╛ рдХрд╕реНрдЯрдо рдХреЛрдб рдПрдХ рд╕реНрдкрд╖реНрдЯ рдирд╛рдо рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдпрд╛ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдВ (рдЙрджрд╛., internal/custom/).
  • рдЬрдирд░реЗрдЯреЗрдб рд╡рд╛рдпрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЫреВрдиреЗ рдХреЗ рдкреЙрдЗрдВрдЯреНрд╕ рдХреЛ рдПрдХ рдпрд╛ рджреЛ рдлрд╛рдЗрд▓реЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рдЦреЗрдВред рдЙрдиреНрд╣реЗрдВ рдмреНрд░рд┐рдЬ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ: рдПрдХ рдмрд╛рд░ рд░реВрдЯреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ, рдПрдХ рдмрд╛рд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВред
  • рдорд┐рдбрд▓рд╡реЗрдпрд░ рдСрд░реНрдбрд░ рдФрд░ рдЙрд╕рдХрд╛ рдХрд╛рд░рдг рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХрд░реЗрдВ ("Auth before rate limiting" рдФрд░ рдХреНрдпреЛрдВ)ред
  • рдкреНрд░рддреНрдпреЗрдХ рдХрд╕реНрдЯрдо рдПрдиреНрдбрдкреЙрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЯреЗрд╕реНрдЯ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  • рдПрдХ рд░рд┐рдкреАрдЯреЗрдмрд▓ рдЕрдкрдЧреНрд░реЗрдб рд░реВрдЯреАрди рд▓рд┐рдЦреЗрдВ: рд░реАтАСрдПрдХреНрд╕рдкреЛрд░реНрдЯ, рдХрд╕реНрдЯрдо рд▓реЗрдпрд░ рдлрд┐рд░ рд╕реЗ рд▓рдЧрд╛рдПрдБ, рдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рдПрдБ, рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВред

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

рдЙрджрд╛рд╣рд░рдг: рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдПрдХ рд╣реЗрд▓реНрде рдПрдиреНрдбрдкреЙрдЗрдВрдЯ рдЬреЛрдбрд╝рдирд╛

Keep your repo upgrade friendly
Get real source code and keep upgrades predictable with a clean customization boundary.
Export Source

рдорд╛рди рд▓реЗрдВ рдЖрдкрдиреЗ рдПрдХ Go рдмреИрдХрдПрдВрдб рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ (рдЙрджрд╛., AppMaster рд╕реЗ) рдФрд░ рдЖрдк рджреЛ рдЬреЛрдбрд╝рд┐рдпрд╛рдБ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ ID рдкреНрд▓рд╕ рдПрдбрдорд┐рди рдПрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ, рдФрд░ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ /health рдПрдиреНрдбрдкреЙрдЗрдВрдЯред рд▓рдХреНрд╖реНрдп рд╣реИ рдХрд┐ рдЖрдкрдХреА рдЪреЗрдВрдЬреЗрдЬрд╝ рд░реАтАСрдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреЗ рдмрд╛рдж рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХреЗрдВред

рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ internal/custom/middleware/ рдЬреИрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рд╕реНрдерд╛рди рдкрд░ рд░рдЦреЗрдВред рдорд┐рдбрд▓рд╡реЗрдпрд░ рдмрдирд╛рдПрдБ рдЬреЛ (1) X-Request-Id рдкрдврд╝реЗ рдпрд╛ рдЬрдирд░реЗрдЯ рдХрд░реЗ, (2) рдЙрд╕реЗ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЙрдиреНрдЯреЗрдХреНрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗ, рдФрд░ (3) рдПрдбрдорд┐рди рд░реВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдСрдбрд┐рдЯ рд▓рд╛рдЗрди рд▓реЙрдЧ рдХрд░реЗ (method, path, user ID рдЕрдЧрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛ, рдФрд░ result)ред рд╣рд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрди рд░рдЦреЗрдВ рдФрд░ рдмрдбрд╝реЗ рдкреЗрд▓реЛрдб рдХреЛ рдбрдореНрдк рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВред

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

/health рдХреЗ рд▓рд┐рдП, internal/custom/handlers/health.go рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВред 200 OK рд░рд┐рдЯрд░реНрди рдХрд░реЗрдВ рдФрд░ рдЫреЛрдЯрд╛ рдмреЙрдбреА рдЬреИрд╕реЗ ok рднреЗрдЬреЗрдВред рдЕрдЧрд░ рдореЙрдирд┐рдЯрд░реНрд╕ рдХреЛ рдСрде рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддреЛ рд╣реА рдСрде рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрд╕реЗ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХрд░реЗрдВред

рдЪреЗрдВрдЬ рдХреЛ рд░реАтАСрдЕрдкреНрд░рд╛рдпрдмрд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд┐рдЯ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрд╕ рддрд░рд╣ рд░рдЦреЗрдВ:

  • Commit 1: Add internal/custom/middleware/audit.go and tests
  • Commit 2: Wire middleware into admin routes (smallest diff possible)
  • Commit 3: Add internal/custom/handlers/health.go and register /health

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

рдЕрдЧрд▓реЗ рдХрджрдо: рдПрдХ рдореЗрдВрдЯреЗрдиреЗрдмрд▓ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реЗрдЯ рдХрд░реЗрдВ

рд╣рд░ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреЛ рдПрдХ рддрд╛рдЬрд╛ рдмрд┐рд▓реНрдб рдорд╛рдиреЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рджреЛрд╣рд░рд╛рдХрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдХрд╕реНрдЯрдо рдХреЛрдб рдПрдХ рдРрдбтАСрдСрди рд▓реЗрдпрд░ рдЬреИрд╕рд╛ рдорд╣рд╕реВрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдПрдХ рд░реАтАСрд░рд╛рдЗрдЯред

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

рдЕрдЧрд░ рдЖрдк AppMaster (appmaster.io) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдХрд╛рдо рдХреЛ рдЬрдирд░реЗрдЯреЗрдб Go рдмреИрдХрдПрдВрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╕рд╛рдлрд╝ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВ: рдорд┐рдбрд▓рд╡реЗрдпрд░, рд░реВрдЯреНрд╕ рдФрд░ рд╣реЗрд▓реНрдкрд░реНрд╕ рдХреЛ рдХреБрдЫ рдЫреЛрдЯреЗ рдлреЛрд▓реНрдбрд░реНрд╕ рдореЗрдВ рд░рдЦреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд░реАтАСрдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ рдХреЗ рдкрд╛рд░ рдЖрдЧреЗ рд▓реЗ рдЬрд╛ рд╕рдХреЗрдВ, рдФрд░ рдЬрдирд░реЗрдЯрд░тАСрдУрдирд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрд┐рдирд╛ рдЫреБрдП рд░рдЦреЗрдВред

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

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди

рдХреНрдпрд╛ рдореИрдВ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреА рдЧрдИ Go рдлрд╛рдЗрд▓реЗрдВ рд╕реАрдзреЗ рдПрдбрд┐рдЯ рдХрд░ рд╕рдХрддрд╛/рд╕рдХрддреА рд╣реВрдБ?

DonтАЩt edit generator-owned files. Put your changes in a clearly owned package (for example, internal/custom/) and connect them through one small integration point near server startup. That way a re-export mostly replaces generated code while your custom layer stays intact.

рдореИрдВ рдХреИрд╕реЗ рдкрддрд╛ рдХрд░реВрдБ рдХрд┐ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рд░рд┐рдкреЛ рдХрд╛ рдХреМрди рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдлрд┐рд░ рд╕реЗ рдЬрдирд░реЗрдЯ рд╣реЛрдЧрд╛?

Assume anything marked with comments like тАЬCode generatedтАЭ or тАЬDO NOT EDITтАЭ will be rewritten. Also watch for very uniform folder structures, repetitive naming, and minimal human comments; those are typical generator fingerprints. Your safest rule is to treat all of that as read-only even if it compiles after you edit it.

рдПрдХ рдЕрдЪреНрдЫрд╛ тАЬsingle integration pointтАЭ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

Keep one тАЬhookтАЭ file that imports your custom package and registers everything: middleware, extra routes, and any small wiring. If you find yourself touching five routing files or multiple generated handlers, youтАЩre drifting toward a fork that will be painful to upgrade.

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

Write middleware in your own package and keep it narrow, like request IDs, audit logging, rate limits, or special headers. Then register it once at the router or HTTP stack creation point, not per-route inside generated handlers. A quick httptest check for one expected header or status code is usually enough to catch regressions after re-export.

рдореИрдВ рдирдпрд╛ рдПрдиреНрдбрдкреЙрдЗрдВрдЯ рдЬреЛрдбрд╝рдХрд░ рдмрд┐рдирд╛ рдкреВрд░реЗ рдЬрдирд░реЗрдЯреЗрдб рдмреИрдХрдПрдВрдб рдХреЛ рдлреЛрд░реНрдХ рдХрд┐рдП рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛/рд╕рдХрддреА рд╣реВрдБ?

Define the endpoint contract first, then implement the handler in your custom package and register the route at the same integration point you use for middleware. Keep the handler simple: validate input, call existing services, return a consistent error shape, and avoid copying generated handler logic. This keeps your change portable to a fresh export.

рдХреНрдпреЛрдВ рд░реВрдЯреНрд╕ рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдСрд░реНрдбрд░ рдлрд┐рд░ рд╕реЗ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреЗ рдмрд╛рдж рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ?

Routes can shift when the generator changes route registration order, grouping, or middleware chains. To protect yourself, rely on a stable registration seam and keep middleware order documented right next to the registration line. If ordering matters (for example, auth before audit), encode it intentionally and verify behavior with a small test.

рдореИрдВ рдиреЛтАСрдХреЛрдб рдореЙрдбрд▓ рдФрд░ рдХрд╕реНрдЯрдо Go рдХреЛрдб рдХреЗ рдмреАрдЪ рд▓реЙрдЬрд┐рдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реЛрдиреЗ рд╕реЗ рдХреИрд╕реЗ рдмрдЪреВрдБ?

If you implement the same rule in both places, they will drift over time and youтАЩll get confusing behavior. Put business rules that non-developers should adjust (fields, validation, workflows, permissions) in the no-code model, and keep infrastructure concerns (logging, auth integration, rate limits, headers) in your custom Go layer. The split should be obvious to anyone reading the repo.

рдореИрдВ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдХреЛрдб рдХреЛ рдЬрдирд░реЗрдЯреЗрдб internal types рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рд╕реЗ рдХреИрд╕реЗ рд░реЛрдХреВрдБ?

Generated DTOs and internal structs can change across exports, so isolate that churn at the boundary. Convert inputs into your own internal structs, run your domain logic on those, then convert outputs back at the edge. When types shift after re-export, you update one adapter instead of chasing compile errors across your whole custom layer.

re-exports рдФрд░ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ Git рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреНрдпрд╛ рд╣реИ?

Separate generated updates from your custom work in Git so you can see what changed and why. A practical flow is to commit the re-exported generated changes first, then commit the minimal wiring and custom-layer adjustments. Keeping a short custom changelog that says what you added and where it lives makes the next upgrade much faster.

рдореИрдВ рдЕрдкрдЧреНрд░реЗрдб рдХреА рдкреНрд▓рд╛рдирд┐рдВрдЧ рдХреИрд╕реЗ рдХрд░реВрдБ рддрд╛рдХрд┐ re-exports рджрд┐рдиреЛрдВ рддрдХ рдХреА рдЭрдВрдЭрдЯ рди рдмрдиреЗрдВ?

Do a dry-run re-export in a separate branch, build it, and run a short regression pass before merging your custom layer back in. After that, reapply customizations through the same seams each time, then validate a few key endpoints plus one unhappy path per endpoint. If something canтАЩt be expressed through a seam, add one new seam once and keep future changes flowing through it.

рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди
рдХреБрдЫ рдмрдирд╛рдПрдВ рдЕрджреНрднреБрдд

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

рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ
рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП Go рдмреИрдХрдПрдВрдб рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдмрдврд╝рд╛рдирд╛ | AppMaster