рдкреНрд░реИрдХреНрдЯрд┐рдХрд▓ рдЧреЛ: рд░рд┐рдпрд▓ рд╡рд░реНрд▓реНрдб рдореЗрдВ рд╕рдкреЛрд░реНрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрд╕

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

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

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

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

рд╕рд╛рдордЧреНрд░реА



1. рдореМрд▓рд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрдд


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

  1. рдЖрд░рд╛рдо
  2. рдкрдардиреАрдпрддрд╛
  3. рдЙрддреНрдкрд╛рджрдХрддрд╛

рдиреЛрдЯред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ, рдореИрдВрдиреЗ "рдкреНрд░рджрд░реНрд╢рди" рдпрд╛ "рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЧреЛ рд╕реЗ рднреА рддреЗрдЬ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рддреБрд▓рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рд▓рддрд╛ рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАред рдРрд╕реА рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рдирддрд╛ рдХреЛ рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рддреБрд▓рдирд╛ рдкрдардиреАрдпрддрд╛ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАред

рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕рдВрдЧреЛрд╖реНрдареА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА, рдкрдардиреАрдпрддрд╛ рдФрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред

рдЖрд░рд╛рдо


"рд╕рд╛рджрдЧреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛ рд╣реИ" - рдПрджреНрдЧрд░ рджрд┐рдЬреНрдХреНрд╕реНрдЯреНрд░рд╛

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

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

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

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

1.2ред рдкрдардиреАрдпрддрд╛


"рдкрдардиреАрдпрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реИ" - рдорд╛рд░реНрдХ рд░реЗрдирд╣реЛрд▓реНрдб, рдЬреЗрд╡реАрдПрдо рд╕рдореНрдореЗрд▓рди, 2018

рдпрд╣ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреЛрдб рдкрдардиреАрдп рд╣реИ? рд╣рдореЗрдВ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

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

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

рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╛рд░-рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛: рд╕реИрдХрдбрд╝реЛрдВ, рдпрджрд┐ рд╣рдЬрд╛рд░реЛрдВ рдмрд╛рд░ рдирд╣реАрдВред

"рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреМрд╢рд▓ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред" - рдЧреИрд╕реНрдЯрди рд╣реЛрд░реНрдХрд░

рдкрдардиреАрдпрддрд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреБрдВрдЬреА рд╣реИ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЛ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдП рд░рдЦреЗрдВ? рдпрджрд┐ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛; рдФрд░ рдпрд╣ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреА рдХрдВрдкрдиреА Go рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

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

рд╕рдорд░реНрдерд┐рдд рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реИред

1.3ред рдЙрддреНрдкрд╛рджрдХрддрд╛


"рдбрд┐рдЬрд╛рдЗрди рдХреЛрдб рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдХрд▓рд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЖрдЬ рдХрд╛рдо рдХрд░реЗ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдмрджрд▓рд╛рд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред" - рд╕реИрдВрдбреА рдореЗрдЯреНрд╕

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

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

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

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

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

2. рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛


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

"рдЦрд░рд╛рдм рдирд╛рдо рдЦрд░рд╛рдм рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдПрдХ рд▓рдХреНрд╖рдг рд╣реИ" - рдбреЗрд╡ рдЪреЗрдиреА

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

2.1ред рдирд╛рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░


тАЬрдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рддреАрди рдореЗрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред тАЭ - рдЙрдХреА рд╕реНрдорд┐рде

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

тАЬрдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдПрдХ рдЕрдЪреНрдЫреЗ рдордЬрд╛рдХ рдХреА рддрд░рд╣ рд╣реИред рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рдпрд╣ рдЕрдм рдордЬрд╝реЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИред тАЭ - рдбреЗрд╡ рдЪреЗрдиреА

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

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

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

2.2ред рдЖрдИрдбреА рдХреА рд▓рдВрдмрд╛рдИ


рдХрднреА-рдХрднреА рд▓рдШреБ рдЪрд░ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреА рд╢реИрд▓реА рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд░реЛрдм рдкрд╛рдЗрдХ рдиреЗ рдХрд╣рд╛ , "рдЬрд╛рдУ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рд╣реА рд▓рдВрдмрд╛рдИ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред"

рдПрдВрдбреНрд░рдпреВ рдЧреЗрд░реИрдВрдб рдорд╣рддреНрд╡ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреА рдкрд╣рдЪрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

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

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреБрдЫ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ:

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

type Person struct { Name string Age int } // AverageAge returns the average age of people. func AverageAge(people []Person) int { if len(people) == 0 { return 0 } var count, sum int for _, p := range people { sum += p.Age count += 1 } return sum / count } 

рджрд╕рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд░реЗрдВрдЬ p рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЪрд░ рдмрд╣реБрдд рдХрдо рд╕рдордп рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдкрд░ рд░рд╣рддрд╛ рд╣реИред рдпрджрд┐ рдкрд╛рдардХ рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ p рдХреА рднреВрдорд┐рдХрд╛ рдореЗрдВ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рдЙрд╕реЗ рдХреЗрд╡рд▓ рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, people рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ people рдФрд░ рд╕рд╛рдд рд▓рд╛рдЗрдиреЗрдВ рд▓рд╛рдЗрд╡ рд╣реЛрддреА рд╣реИрдВред рд╡рд╣реА sum рдФрд░ count рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЕрдкрдиреЗ рд▓рдВрдмреЗ рдирд╛рдореЛрдВ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддреЗ рд╣реИрдВред рдкрд╛рдардХ рдХреЛ рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреЛрдб рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпрд╣ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдирд╛рдореЛрдВ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддрд╛ рд╣реИред

рдЖрдк count рд▓рд┐рдП sum рдФрд░ c (рдпрд╛ n ) рдХреЗ рд▓рд┐рдП s рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕рднреА рдЪрд░ рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рд╕рдорд╛рди рд╕реНрддрд░ рддрдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рдЖрдк p рд╕рд╛рде people рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА, рдХреНрдпрд╛ for ... range рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЪрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ for ... range ред рдПрдХ рдЕрдХреЗрд▓рд╛ person рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдЪрд▓рдирд╛ рдЪрд░ рдХреЛ рдХрдИ рдорд╛рдиреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

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

2.2.1ред рдореБрдЦреНрдп рдмрд╛рдд рд╕рдВрджрд░реНрдн рд╣реИ


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

i рдФрд░ index рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЕрд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ

 for index := 0; index < len(s); index++ { // } 

рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ

 for i := 0; i < len(s); i++ { // } 

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдХреЛрдИ рднреА рдмрджрддрд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрд╖реЗрддреНрд░ i рдпрд╛ index рд▓реВрдк рдХреЗ рд╢рд░реАрд░ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИ, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдордЭ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЗрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдХрд╛рд░реНрдп рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ?

 func (s *SNMP) Fetch(oid []int, index int) (int, error) 

рдпрд╛

 func (s *SNMP) Fetch(o []int, i int) (int, error) 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, oid рдПрд╕рдПрдирдПрдордкреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИ, рдФрд░ o рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдЖрдкрдХреЛ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрдб рдиреЛрдЯреЗрд╢рди рд╕реЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реА рдкреНрд░рдХрд╛рд░, i рдХреЛ рд╕рд┐рдХреБрдбрд╝рддреЗ рд╣реБрдП index рдХреЛ рд╕рдордЭрдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ SNMP рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ OID рдХреЗ рдЙрдк рдореВрд▓реНрдп рдХреЛ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЯрд┐рдк ред рдПрдХ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдореЗрдВ рд▓рдВрдмреЗ рдФрд░ рдЫреЛрдЯреЗ рдФрдкрдЪрд╛рд░рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рди рдХрд░реЗрдВред

2.3ред рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЪрд░ рдХрд╛ рдирд╛рдо рди рд▓реЗрдВ


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

 var usersMap map[string]*User 

рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд┐рддрдиреА рдЕрдЪреНрдЫреА рд╣реИ? рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдирдХреНрд╢рд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ *User рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ: рдпрд╣ рд╢рд╛рдпрдж рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди usersMap рдорд╛рдирдЪрд┐рддреНрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирдХреНрд╢рд╛ рд╣реИ, рдФрд░ рдЧреЛ, рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдЧрд▓рддреА рд╕реЗ рдЗрд╕ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдПрдХ рд╕реНрдХреЗрд▓рд░ рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП Map рдкреНрд░рддреНрдпрдп рдмреЗрдорд╛рдиреА рд╣реИред

рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЕрдиреНрдп рдЪрд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ:

 var ( companiesMap map[string]*Company productsMap map[string]*Products ) 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдк рдореИрдк рдХреЗ рддреАрди рд╡реИрд░рд┐рдПрдмрд▓реНрд╕ рд╣реИрдВ: usersMap рдореИрдк, companiesMap usersMap рдФрд░ productsMap рдореИрдк, рдФрд░ рд╕рднреА рд▓рд╛рдЗрдиреЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдореИрдк рдХреА рдЬрд╛рддреА рд╣реИрдВред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рдирдХреНрд╢реЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдпрд╣ рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ рдпрджрд┐ рд╣рдо рдЙрди companiesMap map[string]*User рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ companiesMap рдЬрд╣рд╛рдВ рдХреЛрдб map[string]*User рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ Map рдкреНрд░рддреНрдпрдп рдХреЛрдб рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпреЗ рдХреЗрд╡рд▓ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдг рд╣реИрдВред

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

рдЯрд┐рдк ред рдпрджрд┐ рдирд╛рдо рд╡рд╛рд▓реЗ users рд╕рд╛рд░ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ usersMap рднреАред

рдпрд╣ рдЯрд┐рдк рдлрдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 type Config struct { // } func WriteConfig(w io.Writer, config *Config) 

*Config рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП config рдирд╛рдо рдмреЗрдорд╛рдиреА рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ *Config , рдпрд╣ рддреБрд░рдВрдд рдЗрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ *Config , рддреЛ conf1 рдФрд░ conf2 рдирд╛рдо original рдФрд░ updated рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕рд╛рд░реНрдердХ conf2 , рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдорд┐рд╢реНрд░рдг рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред

рдиреЛрдЯред рдкреИрдХреЗрдЬ рдирд╛рдореЛрдВ рдХреЛ рдЕрдЪреНрдЫреЗ рдЪрд░ рдирд╛рдореЛрдВ рдХреЛ рдЪреЛрд░реА рди рдХрд░рдиреЗ рджреЗрдВред

рдЖрдпрд╛рддрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдореЗрдВ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, context рдкреИрдХреЗрдЬ рдореЗрдВ Context рдкреНрд░рдХрд╛рд░ рдХреЛ context рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред context.Context ред рдпрд╣ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдЪрд░ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ context рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред

 func WriteLog(context context.Context, message string) 

рдпрд╣ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕реАрд▓рд┐рдП рдЬрдм context.Context рдШреЛрд╖рдгрд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ context.Context рдкреНрд░рдХрд╛рд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ctx рдЬреИрд╕реЗ рдирд╛рдо рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

 func WriteLog(ctx context.Context, message string) 

2.4ред рдПрдХрд▓ рдирд╛рдордХрд░рдг рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдб рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рд░ рдмрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдкрд░, рдЙрд╕рдХрд╛ рдирд╛рдо рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред d *sql.DB , dbase *sql.DB , DB *sql.DB рдФрд░ database *sql.DB рдЬреИрд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:

 db *sql.DB 

рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдЖрдк db рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ *sql.DB рдФрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рд▓рд╛рд╣; рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдиреЛрдЯред рдЬрд╛рдУ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╕рдордЭреМрддрд╛ рдкрд╣рд▓реЗ рдХреА рдЧрдИ рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХрд╛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИред рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд┐рдХрд▓реНрдк рдорд╛рдирдХ рд╢реИрд▓реА рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ snake_case рдмрдЬрд╛рдп CamelCase рдХрд╛ рдЙрдкрдпреЛрдЧ snake_case ред

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

рдЕрдВрдд рдореЗрдВ, рдХреБрдЫ рдПрдХ-рдЕрдХреНрд╖рд░ рдЪрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЫреЛрд░реЛрдВ рдФрд░ рдЧрд┐рдирддреА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, i , j рдФрд░ k рдЖрдорддреМрд░ рдкрд░ рдЫреЛрд░реЛрдВ рдХреЗ for рдЖрдЧрдордирд╛рддреНрдордХ рдЪрд░ рд╣реЛрддреЗ рд╣реИрдВ, n рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдпрд╛ рд╕рдВрдЪрдпреА рдпреЛрдЬрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, v рдПрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдореИрдк рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП k рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ s рдЕрдХреНрд╕рд░ рдЯрд╛рдЗрдк string рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ db рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ i рдПрдХ рдЗрдВрдбрдХреНрдЯрд┐рд╡ рд╡реЗрд░рд┐рдПрдмрд▓ рдмрдиреВрдВрдЧрд╛ред рдпрджрд┐ рд╡реЗ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЬрд▓реНрдж рд╣реА рдПрдХ рд▓реВрдк рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред

рдЯрд┐рдк ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рд╣реИрдВ рдЬреЛ рдЖрдкрдиреЗ i , j рдФрд░ k рд╡реИрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдлрдВрдХреНрд╢рди рдХреЛ рдЫреЛрдЯреА рдпреВрдирд┐рдЯреНрд╕ рдореЗрдВ рддреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред

2.5ред рдПрдХрд▓ рдШреЛрд╖рдгрд╛ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рдЫрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВред

  •  var x int = 1 
  •  var x = 1 
  •  var x int; x = 1 
  •  var x = int(1) 
  •  x := 1 

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

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

  • рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, var рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред

     var players int // 0 var things []Thing // an empty slice of Things var thing Thing // empty Thing struct json.Unmarshall(reader, &thing) 

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

    рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐, рд╣рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

     var players int = 0 var things []Thing = nil var thing *Thing = new(Thing) json.Unmarshall(reader, thing) 

рдЪреВрдВрдХрд┐ рдЧреЛ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдФрд░ рддреАрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рджрд╛рдИрдВ рдУрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрдХрд▓рдХ рджрд╛рдИрдВ рдУрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдШреЛрд╖рд┐рдд рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 var players = 0 var things []Thing = nil var thing = new(Thing) json.Unmarshall(reader, thing) 

рдпрд╣рд╛рдВ, players рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ 0 рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░рд░реНрдердХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ players рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реВрдиреНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 var players int 

рджреВрд╕рд░реЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╣рдо рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

 var things = nil 

рдХреНрдпреЛрдВрдХрд┐ nil рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ: рдпрд╛ рд╣рдо рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ...

 var things []Thing 

... рдпрд╛ рд╢реВрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдмрдирд╛рдПрдВ?

 var things = make([]Thing, 0) 

рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдардХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 things := make([]Thing, 0) 

рдпрд╣ рдкрд╛рдардХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ things рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред

рддреЛ рд╣рдо рддреАрд╕рд░реА рдШреЛрд╖рдгрд╛ рдкрд░ рдЖрддреЗ рд╣реИрдВ:

 var thing = new(Thing) 

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

 thing := new(Thing) 

рдЗрд╕рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ thing new(Thing) рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ new рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 thing := &Thing{} 

рдЬреЛ new(Thing) рд╕рдорд╛рди рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХреБрдЫ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдкрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ thing рдХреЛ рдкреЙрдЗрдВрдЯрд░ Thing{} рдФрд░ рд╢реВрдиреНрдп рдХреЗ Thing рдорд╛рди рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ thing рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ json.Unmarshall рдореЗрдВ json.Unmarshall thing рдХрд╛ рдкрддрд╛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ:

 var thing Thing json.Unmarshall(reader, &thing) 

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

 var min int max := 1000 

рдЕрдзрд┐рдХ рдкрдардиреАрдп рдШреЛрд╖рдгрд╛:

 min, max := 0, 1000 

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:

  • рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, var рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реБрдП, рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ :=

рдЯрд┐рдк ред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред

 var length uint32 = 0x80 

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

 length := uint32(0x80) 

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

2.6ред рдЯреАрдо рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдВ


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

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

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

3. рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд┐рдирдЯ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

"рдПрдХ рдЕрдЪреНрдЫреЗ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдПрдХ рдмреБрд░реЗ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред" - рдбреЗрд╡ рдереЙрдорд╕ рдФрд░ рдПрдВрдбреНрд░рдпреВ рд╣рдВрдЯ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдПрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдФрд░ рдХреЗрд╡рд▓ рдПрдХ - рддреАрди рдЪреАрдЬреЛрдВ рдХрд╛:

  1. рдмрддрд╛рдПрдВ рдХрд┐ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред
  2. рдпрд╣ рдмрддрд╛рдПрдВ рдХрд┐ рд╡рд╣ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред
  3. рдХреНрдпреЛрдВ рд╕рдордЭрд╛рдПрдВред

рдкрд╣рд▓рд╛ рд░реВрдк рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд╛рддреНрд░реЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ:

 // Open     . //           . 

рджреВрд╕рд░рд╛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ:

 //     var results []chan error for _, dep := range a.Deps { results = append(results, execute(seen, dep)) } 

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

 return &v2.Cluster_CommonLbConfig{ //  HealthyPanicThreshold HealthyPanicThreshold: &envoy_type.Percent{ Value: 0, }, } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм HealthyPanicThreshold рд╢реВрдиреНрдп рдкреНрд░рддрд┐рд╢рдд рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ рдХрд┐ 0 рдХрд╛ рдорд╛рди рдШрдмрд░рд╛рд╣рдЯ рджрд╣рд▓реАрдЬ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред

3.1ред рдЪрд░ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ


рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдПрдХ рдЪрд░ рдпрд╛ рдЕрдЪрд░ рдХрд╛ рдирд╛рдо рдЙрд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдПрдХ рдЪрд░ рдпрд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВред

 const randomNumber = 6 //     

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдмрддрд╛рддреА рд╣реИ рдХрд┐ randomNumber 6 рдкрд░ randomNumber рдХреНрдпреЛрдВ randomNumber рдФрд░ рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИред рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрдирд╣реАрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐ randomNumber рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдХреБрдЫ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ:

 const ( StatusContinue = 100 // RFC 7231, 6.2.1 StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2 StatusProcessing = 102 // RFC 2518, 10.1 StatusOK = 200 // RFC 7231, 6.3.1 

HTTP рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, 100 рдирдВрдмрд░ StatusContinue рд░реВрдк 100 рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ RFC 7231, рдЦрдВрдб 6.2.1 рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

 // sizeCalculationDisabled ,   //     . . dowidth. var sizeCalculationDisabled bool 

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

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

 //   SQL var registry = make(map[string]*sql.Driver) 

рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реА рдЧрдИ рдХреНрдпреЛрдВрдХрд┐ рдирд╛рдо registry рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ - рдпрд╣ рдПрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╣реИ, рд▓реЗрдХрд┐рди рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреНрдпрд╛ рд╣реИ?

рдпрджрд┐ рдЖрдк рдПрдХ рдЪрд░ рдХрд╛ рдирд╛рдо sqlDrivers рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ SQL рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИрдВред

 var sqlDrivers = make(map[string]*sql.Driver) 

рдЕрдм рдЯрд┐рдкреНрдкрдгреА рдмреЗрдорд╛рдиреА рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдЙрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

3.2ред рд╣рдореЗрд╢рд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╡рд░реНрдгреЛрдВ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд рдХрд░реЗрдВ


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

Google рд╢реИрд▓реА рдЧрд╛рдЗрдб рдХреЗ рджреЛ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:

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


 package ioutil // ReadAll   r      (EOF)   // ..    err == nil, not err == EOF. //  ReadAll     ,     //  . func ReadAll(r io.Reader) ([]byte, error) 

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

 // Read   io.Reader func (r *FileReader) Read(buf []byte) (int, error) 

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

рдпрд╣рд╛рдБ io рдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

 // LimitReader  Reader,    r, //    EOF  n . //   *LimitedReader. func LimitReader(r Reader, n int64) Reader { return &LimitedReader{r, n} } // LimitedReader   R,     //   N .   Read  N  //    . // Read  EOF,  N <= 0    R  EOF. type LimitedReader struct { R Reader // underlying reader N int64 // max bytes remaining } func (l *LimitedReader) Read(p []byte) (n int, err error) { if lN <= 0 { return 0, EOF } if int64(len(p)) > lN { p = p[0:lN] } n, err = lRRead(p) lN -= int64(n) return } 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ LimitedReader рдШреЛрд╖рдгрд╛ рддреБрд░рдВрдд рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ LimitedReader.Read рдШреЛрд╖рдгрд╛ рдЦреБрдж LimitedReader рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛ LimitedReader рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ LimitedReader.Read рд╕реНрд╡рдпрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ io.Reader рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

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

3.2.1ред рдЦрд░рд╛рдм рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рди рдХрд░реЗрдВ, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ


"рдмреБрд░рд╛ рдордд рдЯрд┐рдкреНрдкрдгреА рдХреЛрдб - рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛" - рдмреНрд░рд╛рдпрди Kernighan

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

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

 // TODO(dfc)  O(N^2),     . 

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХреЗрддрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ TODO рдХреЗ рд╕рд╛рде рдПрдХ рддрд┐рдерд┐ рдпрд╛ рдЯрд┐рдХрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИрдВред

3.2.2ред рдХреЛрдб рдХреЛ рдХрдореЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕реЗ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░реЗрдВ


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

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

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

4. рдкреИрдХреЗрдЬ рд╕рдВрд░рдЪрдирд╛


"рдПрдХ рдорд╛рдореВрд▓реА рдХреЛрдб рд▓рд┐рдЦреЗрдВ: рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдЕрдзрд┐рдХ рдирд╣реАрдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ" - рдбреЗрд╡ рдереЙрдорд╕

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

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

рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдкреИрдХреЗрдЬ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕рдХрд╛ рдирд╛рдо рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

4.1ред рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреИрдХреЗрдЬ рдПрдХ рдЕрдЪреНрдЫреЗ рдирд╛рдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ


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

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

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

4.1.1ред рдЕрдЪреНрдЫреЗ рдкреИрдХреЗрдЬ рдХреЗ рдирд╛рдо рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП


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

  1. .
  2. . , .

4.2ред base , common util


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

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

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

"[рдереЛрдбрд╝рд╛] рджреЛрд╣рд░рд╛рд╡ рдПрдХ рдЧрд▓рдд рдЕрдореВрд░реНрдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╕реНрддрд╛ рд╣реИ" - рд╕реИрдВрдбреА рдореЗрдЯреНрд╕

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

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

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП net/httpрдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рднреА рдирд╣реАрдВ clientрдФрд░ serverрдмрдЬрд╛рдп, рд╡рд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ, client.goрдФрд░ server.goрдЗрд╕реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде, рд╕рд╛рде рд╣реА рд╕рд╛рде transport.goрдХреБрд▓ рдкрд░рд┐рд╡рд╣рди рдХреЗ рд▓рд┐рдПред

рдЯрд┐рдк ред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдо рдореЗрдВ рдкреИрдХреЗрдЬ рдирд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИред

  • рдПрдХ GetрдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреВрд╕рд░реЗ рдкреИрдХреЗрдЬ рд╕реЗ net/httpрдПрдХ http.Getрд▓рд┐рдВрдХ рдмрди рдЬрд╛рддрд╛ рд╣реИ ред
  • рдПрдХ ReaderрдкреИрдХреЗрдЬ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ stringsрджреВрд╕рд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЖрдпрд╛рдд рд╣реЛрдиреЗ рдкрд░ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ strings.Readerред
  • ErrorрдкреИрдХреЗрдЬ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ netрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

4.3ред рдЧрд╣рд░реА рдбреБрдмрдХреА рд▓рдЧрд╛рдП рдмрд┐рдирд╛ рдЬрд▓реНрджреА рд▓реМрдЯ рдЖрдУ


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

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

 func (b *Buffer) UnreadRune() error { if b.lastRead <= opInvalid { return errors.New("bytes.Buffer: UnreadRune: previous operation was not a successful ReadRune") } if b.off >= int(b.lastRead) { b.off -= int(b.lastRead) } b.lastRead = opInvalid return nil } 

рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдкрд░ UnreadRune, рд░рд╛рдЬреНрдп рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ b.lastReadрдФрд░ рдпрджрд┐ рдкрд┐рдЫрд▓рд╛ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рдерд╛ ReadRune, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рддреБрд░рдВрдд рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред рдмрд╛рдХреА рдХреА b.lastReadрддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреНрдпрд╛ рд╣реИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдмрд╛рдХреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ opInvalidред

рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд╕реАрдорд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд┐рдирд╛:

 func (b *Buffer) UnreadRune() error { if b.lastRead > opInvalid { if b.off >= int(b.lastRead) { b.off -= int(b.lastRead) } b.lastRead = opInvalid return nil } return errors.New("bytes.Buffer: UnreadRune: previous operation was not a successful ReadRune") } 

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



4.4ред рдЕрд╢рдХреНрдд рдореВрд▓реНрдп рдХреЛ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдПрдВ


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

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

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

 type MyInt struct { mu sync.Mutex val int } func main() { var i MyInt // i.mu is usable without explicit initialisation. i.mu.Lock() i.val++ i.mu.Unlock() } 

рдЙрдкрдпреЛрдЧреА рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ bytes.Bufferред рдЖрдк рд╕реНрдкрд╖реНрдЯ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдФрд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 func main() { var b bytes.Buffer b.WriteString("Hello, world!\n") io.Copy(os.Stdout, &b) } 

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╢реВрдиреНрдп рдорд╛рди рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ lenрджреЛрдиреЛрдВ capрдмрд░рд╛рдмрд░ рд╣реИрдВ 0, рдФрд░ рд╡рд╛рдИ array, рдмреИрдХрдЕрдк рд╕реНрд▓рд╛рдЗрд╕ рд╕рд░рдгреА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ, рдорд╛рди nilред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдЯреМрддреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдмрд╕ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 func main() { // s := make([]string, 0) // s := []string{} var s []string s = append(s, "Hello") s = append(s, "world") fmt.Println(strings.Join(s, " ")) } 

рдиреЛрдЯ ред var s []stringрд╢реАрд░реНрд╖ рдкрд░ рджреЛ рдЯрд┐рдкреНрдкрдгреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рдорд╛рди рдирд╣реАрдВред рд╢реВрдиреНрдп рдХреЗ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдорд╛рди рдФрд░ рд╢реВрдиреНрдп рд▓рдВрдмрд╛рдИ рдХреЗ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдорд╛рди рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИред рдирд┐рдореНрди рдХреЛрдб рдЧрд▓рдд рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ред

 func main() { var s1 = []string{} var s2 []string fmt.Println(reflect.DeepEqual(s1, s2)) } 

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

 type Config struct { path string } func (c *Config) Path() string { if c == nil { return "/usr/home" } return c.path } func main() { var c1 *Config var c2 = &Config{ path: "/export", } fmt.Println(c1.Path(), c2.Path()) } 

4.5ред рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪреЗрдВ


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

рдЧреЛ рдореЗрдВ рдХрдордЬреЛрд░ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рджреЛ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХреЗ рд╣реИрдВ:

  1. рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  2. рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪреЗрдВред

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

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

рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд░реЗрдВ:

  1. рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░ рдХреЛ рдЙрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреА рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  2. рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

5. рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛


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

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

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

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

5.1ред рдХрдо рдкреИрдХреЗрдЬ, рд▓реЗрдХрд┐рди рдмрдбрд╝рд╛


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

рдЬрд╛рдУ рджреГрд╢реНрдпрддрд╛ рдХреА рд╡реНрдпрд╛рдкрдХ рд╡реНрдпрд╡рд╕реНрдерд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рднрд╛рд╖рд╛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдкрд╣реБрдБрдЪ рд╕рдВрд╢реЛрдзрдХ (рдирд╣реАрдВ рд╣реИ public, protected, privateрдФрд░ рдирд┐рд╣рд┐рдд default)ред C ++ рд╕реЗ рдЕрдиреБрдХреВрд▓ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдХреЛрдИ рдПрдирд╛рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИред

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

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

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

рдЯрд┐рдк ред рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдореЗрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ cmd/рдФрд░ internal/рд╕реНрд░реЛрдд рдХреЛрдб рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдЯрд┐рдк ред рдЬрд╛рд╡рд╛ рд╕реЗ рдЖрдпрд╛ рд╣реИ?

рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реА # рджреБрдирд┐рдпрд╛ рд╕реЗ рдЖрддреЗ рд╣реИрдВ, рддреЛ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рдпрдо рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ: рдПрдХ рдЬрд╛рд╡рд╛ рдкреИрдХреЗрдЬ рдПрдХ рдПрдХрд▓ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ .goред рдЧреЛ рдкреИрдХреЗрдЬ рдкреВрд░реЗ рдорд╛рд╡реЗрди рдореЙрдбреНрдпреВрд▓ рдпрд╛ .NET рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

5.1.1ред рдЖрдпрд╛рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдХреНрд░рдорд┐рдд рдХрд░рдирд╛


рдпрджрд┐ рдЖрдк рдкреИрдХреЗрдЬ рдХреЛ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдкреИрдХреЗрдЬ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреИрд╕реЗ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХрдм рдПрдХ рдлрд╛рдЗрд▓ .goрдХреЛ рдХрдИ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП? рдЖрдкрдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЖрдк рдмрд╣реБрдд рджреВрд░ рдЪрд▓реЗ рдЧрдП рд╣реИрдВ рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ?

рдпрд╣рд╛рдВ рд╡реЗ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

  • рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рд╢реБрд░реВ рдХрд░реЗрдВ .goред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рджреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ httpрдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ http.goрдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП httpред
  • рдЬреИрд╕реЗ рд╣реА рдкреИрдХреЗрдЬ рдмрдврд╝рддрд╛ рд╣реИ, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ messages.goрдореЗрдВ рдкреНрд░рдХрд╛рд░ RequestрдФрд░ Response, рдлрд╝рд╛рдЗрд▓ client.goрдкреНрд░рдХрд╛рд░ Client, рдлрд╝рд╛рдЗрд▓ server.goрдкреНрд░рдХрд╛рд░ рд╕рд░реНрд╡рд░ рд╣реЛрдЧрд╛ред
  • , . , .
  • . , messages.go HTTP- , http.go , client.go server.go тАФ HTTP .

. .

. Go . ( тАФ Go). .

5.1.2ред рдмрд╛рд╣рд░реА рдХреЛ рдЖрдВрддрд░рд┐рдХ рдкрд░реАрдХреНрд╖рдг рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ


рдЙрдкрдХрд░рдг рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ goрдкреИрдХреЗрдЬ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ testingред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ http2, рддреЛ рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦ рд╕рдХрддреЗ http2_test.goрд╣реИрдВ рдФрд░ рдкреИрдХреЗрдЬ рдШреЛрд╖рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ http2ред рдпрд╣ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд http2_test.go, рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдкреИрдХреЗрдЬ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ http2ред рдмреЛрд▓рдЪрд╛рд▓ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЖрдВрддрд░рд┐рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

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

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

. , .

, , Go go . , net/http net .

.go , , .

5.1.3. , API


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

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреИрдХреЗрдЬ .../a/b/c/internal/d/e/fрдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдЯреНрд░реА рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкреИрдХреЗрдЬ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ .../a/b/c, рд▓реЗрдХрд┐рди рд╕рднреА .../a/b/gрдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдирд╣реАрдВрдкреНрд░рд▓реЗрдЦрди )ред

5.2ред рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдореБрдЦреНрдп рдкреИрдХреЗрдЬ


рдПрдХ рдлрд╝рдВрдХреНрд╢рди mainрдФрд░ рдкреИрдХреЗрдЬ mainрдореЗрдВ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ main.mainрдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ: рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ main, рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

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

рдЯрд┐рдк ред func main()рдЭрдВрдбреЗ, рдбреЗрдЯрд╛рдмреЗрд╕, рд▓реЙрдЧрд░, рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

6. рдПрдкреАрдЖрдИ рд╕рдВрд░рдЪрдирд╛


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдбрд┐рдЬрд╛рдЗрди рд╕рд▓рд╛рд╣ рдореИрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдирддрд╛ рд╣реВрдВред

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

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

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

6.1ред рдбрд┐рдЬрд╛рдЗрди рдПрдкреАрдЖрдИ рдЬреЛ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИрдВ


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

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

6.1.1ред рдЙрди рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ рдЬреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред


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

 func Max(a, b int) int func CopyFile(to, from string) error 

рдЗрди рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ? рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рдЕрдзрд┐рдХрддрдо рджреЛ рдирдВрдмрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдлрд╛рдЗрд▓ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

 Max(8, 10) // 10 Max(10, 8) // 10 

рдЕрдзрд┐рдХрддрдо рд╕рд░рд╛рд╣рдиреАрдп рд╣реИ : рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдХреНрд░рдо рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рдЖрда рдФрд░ рджрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рджрд╕ рд╣реИ, рдЪрд╛рд╣реЗ рдЖрда рдФрд░ рджрд╕ рдпрд╛ рджрд╕ рдФрд░ рдЖрда рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рдПред

рд▓реЗрдХрд┐рди CopyFile рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

 CopyFile("/tmp/backup", "presentation.md") CopyFile("presentation.md", "/tmp/backup") 

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

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

 type Source string func (src Source) CopyTo(dest string) error { return CopyFile(dest, string(src)) } func main() { var from Source = "presentation.md" from.CopyTo("/tmp/backup") } 

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

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

6.2ред рдПрдХ рдмреЗрд╕рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди


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



6.2.1ред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реВрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ


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

рдпрд╣рд╛рдВ рдиреЗрдЯ / http рдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 package http // ListenAndServe listens on the TCP network address addr and then calls // Serve with handler to handle requests on incoming connections. // Accepted connections are configured to enable TCP keep-alives. // // The handler is typically nil, in which case the DefaultServeMux is used. // // ListenAndServe always returns a non-nil error. func ListenAndServe(addr string, handler Handler) error { 

ListenAndServeрджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдФрд░ http.HandlerрдЖрдиреЗ рд╡рд╛рд▓реЗ HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреАрд╕реАрдкреА рдкрддрд╛ ред ServeрджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ nilред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдХреЙрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдЧрд╛ nil, рдЬреЛ рдЗрд╕реЗ http.DefaultServeMuxрдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ ред

рдЕрдм рдХреЙрд▓рд░ рдХреЗ Serveрдкрд╛рд╕ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред

 http.ListenAndServe("0.0.0.0:8080", nil) http.ListenAndServe("0.0.0.0:8080", http.DefaultServeMux) 

рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди nilрд╡рд╛рдпрд░рд╕ рдХреА рддрд░рд╣ рдлреИрд▓рддрд╛ рд╣реИред рдкреИрдХреЗрдЬ httpрдореЗрдВ рдПрдХ рд╕рд╣рд╛рдпрдХ рднреА рд╣реИ http.Serve, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ListenAndServe:

 func ListenAndServe(addr string, handler Handler) error { l, err := net.Listen("tcp", addr) if err != nil { return err } defer l.Close() return Serve(l, handler) } 

рдЪреВрдВрдХрд┐ ListenAndServeрдпрд╣ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ nilрджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП http.Serveрдпрд╣ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рднреА рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ http.Serveрд▓рд╛рдЧреВ рддрд░реНрдХ рдореЗрдВ рд╣реИ "рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рд╕рдорд╛рди рд╣реИ nil, рддреЛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ DefaultServeMux"ред nilрдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХреГрддрд┐ рдХреЙрд▓рд░ рдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЗрд╕реЗ nilрджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд▓реЗрдХрд┐рди рдРрд╕реЗServe

 http.Serve(nil, nil) 

рдПрдХ рднрдпрд╛рдирдХ рдЖрддрдВрдХ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

рдЯрд┐рдк ред рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рди рдорд┐рд▓рд╛рдПрдВ nilрдФрд░ рди рд╣реА nilред

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

рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, nilрд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдмреАрдЪ рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ DefaultServeMuxред

  const root = http.Dir("/htdocs") http.Handle("/", http.FileServer(root)) http.ListenAndServe("0.0.0.0:8080", nil) 

рдХреА рддреБрд▓рдирд╛ рдореЗрдВ

  const root = http.Dir("/htdocs") http.Handle("/", http.FileServer(root)) http.ListenAndServe("0.0.0.0:8080", http.DefaultServeMux) 

рдХреНрдпрд╛ рдПрдХ рд▓рд╛рдЗрди рд░рдЦрдирд╛ рднреНрд░рдо рдХреЗ рд▓рд╛рдпрдХ рдерд╛?

  const root = http.Dir("/htdocs") mux := http.NewServeMux() mux.Handle("/", http.FileServer(root)) http.ListenAndServe("0.0.0.0:8080", mux) 

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

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

6.2.2ред [] T рдХреЗ рдмрдЬрд╛рдп рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд▓рдВрдмрд╛рдИ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдмрд╣реБрдд рдмрд╛рд░, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐ рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓реЗрддреА рд╣реИред

 func ShutdownVMs(ids []string) error 

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

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

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

 if svc.MaxConnections > 0 || svc.MaxPendingRequests > 0 || svc.MaxRequests > 0 || svc.MaxRetries > 0 { // apply the non zero parameters } 

рдЪреВрдВрдХрд┐ рдСрдкрд░реЗрдЯрд░ ifрдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдореИрдВ рдХреНрдпрд╛ рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдБ:

 // anyPostive indicates if any value is greater than zero. func anyPositive(values ...int) bool { for _, v := range values { if v > 0 { return true } } return false } 

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

 if anyPositive(svc.MaxConnections, svc.MaxPendingRequests, svc.MaxRequests, svc.MaxRetries) { // apply the non zero parameters } 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ anyPositive, рдХреЛрдИ рдЧрд▓рддреА рд╕реЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ:

 if anyPositive() { ... } 

рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, anyPositiveрд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА falseред рдпрд╣ рд╕рдмрд╕реЗ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ рдЕрдЧрд░ рддрд░реНрдХреЛрдВ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ anyPositiveрд▓реМрдЯреЗ trueред

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

 // anyPostive indicates if any value is greater than zero. func anyPositive(first int, rest ...int) bool { if first > 0 { return true } for _, v := range rest { if v > 0 { return true } } return false } 

рдЕрдм anyPositiveрдЖрдк рдПрдХ рд╕реЗ рдХрдо рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмреБрд▓рд╛ рд╕рдХрддреЗред

6.3ред рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рджреЗрдВред


рдорд╛рди рд▓реАрдЬрд┐рдП рдореБрдЭреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ Documentрдбрд┐рд╕реНрдХ рдкрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ ред

 // Save      f. func Save(f *os.File, doc *Document) error 

рдореИрдВ рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ SaveрдЬреЛ DocumentрдПрдХ рдлрд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ *os.Fileред рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

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

Saveрдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрдкреНрд░рд┐рдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рд╕реНрдХ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

*os.FileрдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ Save, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдкрде рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рд╣реИред рдЦреИрд░, рдЕрдЧрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░SaveрдХреЗрд╡рд▓ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рднрд╛рдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ *os.Fileред

рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

 // Save      // ReadWriterCloser. func Save(rwc io.ReadWriteCloser, doc *Document) error 

рдЗрд╕рдХреА рдорджрдж рд╕реЗ io.ReadWriteCloserрдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рдЗрд╕реЗ SaveрдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ io.ReadWriteCloserрдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ *os.Fileред

рдпрд╣ рдПрдХ рд╕рд╛рде рджрд╛рдпрд░реЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ SaveрдФрд░ рдХреЙрд▓рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЗ *os.FileрдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

рдФрд░ рд▓реЗрдЦрдХ SaveрдЕрдм рдЗрди рдЕрд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ *os.File, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ io.ReadWriteCloserред

рд▓реЗрдХрд┐рди рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд░Save рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝реЗрдЧрд╛ рдЬреЛ рдЙрд╕рдиреЗ рд╕рд┐рд░реНрдл рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛ - рдЕрдиреНрдп рдХреЛрдб рдХреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

 // Save      // WriteCloser. func Save(wc io.WriteCloser, doc *Document) error 

рдЗрд╕рд▓рд┐рдП, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ SaveрдХреЗрд╡рд▓ рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреАрд░реНрдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

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

рдЪрд╛рд╣реЗ SaveрдХрд╛рд░рдг Closeрдмрд┐рдирд╛ рд╢рд░реНрдд, рдЪрд╛рд╣реЗ рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред

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

 // Save      // Writer. func Save(w io.Writer, doc *Document) error 

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ io.WriterрдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред

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

7. рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐


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

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

7.1ред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд╣рдЯрд╛рдХрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ


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

рдиреЛрдЯ ред рдореИрдВ рдирд╣реАрдВ рдХрд╣рддрд╛ "рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЛ рд╣рдЯрд╛рдПрдВ"ред рдореИрдВ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреНрд░реБрдЯрд┐ рди рд╣реЛред

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

7.1.1ред рдкрдВрдХреНрддрд┐ рдХреА рдЧрд┐рдирддреА


рд╣рдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗред

 func CountLines(r io.Reader) (int, error) { var ( br = bufio.NewReader(r) lines int err error ) for { _, err = br.ReadString('\n') lines++ if err != nil { break } } if err != io.EOF { return 0, err } return lines, nil } 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд┐рдЫрд▓реЗ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, CountLinesрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ io.Reader, рдирд╣реАрдВ *os.File; рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛ рдХрд╛рдо рд╣реИ рдХрд┐ io.Readerрд╣рдо рдХрд┐рд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЧрд┐рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╣рдо рдмрдирд╛рддреЗ рд╣реИрдВ bufio.Reader, рдФрд░ рдлрд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рд▓реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ ReadString, рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рддрдм рд╣рдо рдкрдврд╝реА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

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

  _, err = br.ReadString('\n') lines++ if err != nil { break } 

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

рд╣рдореЗрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ ReadStringрдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ рдпрджрд┐ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рд╛рдордирд╛ рдирдП рд╡рд░реНрдг рд╕реЗ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рддрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рдирдИ рд▓рд╛рдЗрди рди рд╣реЛред

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрдВрдХреНрддрд┐ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓реЗрдВ, рдФрд░ рдлрд┐рд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдиреЛрдЯ ред рдпрд╣ рддрд░реНрдХ рдЕрднреА рднреА рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЧрд▓рддреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рд▓реЗрдХрд┐рди рд╣рдордиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдкреВрд░реА рдирд╣реАрдВ рдХреА рд╣реИред рдЬрдм рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рд╛рдордирд╛ ReadStringрдХрд░реЗрдЧрд╛ рддреЛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ io.EOFред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП ReadStringрдЖрдкрдХреЛ "рд░реБрдХрдиреЗ рдХреЗ рд▓рд┐рдП" рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреЙрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ CountLine, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ io.EOF, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рд▓реМрдЯрддреЗ рд╣реИрдВ nilрдФрд░ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред

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

 func CountLines(r io.Reader) (int, error) { sc := bufio.NewScanner(r) lines := 0 for sc.Scan() { lines++ } return lines, sc.Err() } 

рдЗрд╕рдХреЗ bufio.ScannerрдмрдЬрд╛рдп рдпрд╣ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ bufio.Readerред

рд╣реБрдб bufio.ScannerрдЙрдкрдпреЛрдЧ рдХреЗ рддрд╣рдд bufio.Reader, рд▓реЗрдХрд┐рди рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реНрддрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

. bufio.Scanner , .

рдпрджрд┐ рд╕реНрдХреИрдирд░ рдиреЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реА, рддреЛ рд╡рд┐рдзрд┐ sc.Scan()рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддреА рд╣реИ trueред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд▓реВрдк рдмреЙрдбреА рдХреЛ forрдХреЗрд╡рд▓ рддрднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕реНрдХреИрдирд░ рдмрдлрд░ рдореЗрдВ рдкрд╛рда рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдирдпрд╛ CountLinesрддрдм рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдирдИ рд▓рд╛рдЗрди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдпрд╛ рдЬрдм рдлрд╛рдЗрд▓ рдЦрд╛рд▓реА рд╣реЛрддреА рд╣реИред

рджреВрд╕рд░реЗ, рдЪреВрдВрдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ sc.Scanрд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ falseрд╣реИ, forрдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдЪрдХреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ bufio.ScannerрдЙрд╕ рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ sc.Err()рд╣рдо рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реА рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдпрд╣ sc.Err()рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ io.EOFрдФрд░ nilрдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрдд рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ рдЗрд╕реЗ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ ред

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

7.1.2ред WriteResponse


рдореЗрд░рд╛ рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг "рдЧрд▓рддрд┐рдпрд╛рдБ рдорд╛рди рд░рд╣реЗ рд╣реИрдВ" рдкреЛрд╕реНрдЯ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ ред

рдкрд╣рд▓реЗ рд╣рдордиреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреИрд╕реЗ рдЦреЛрд▓рд╛, рд▓рд┐рдЦрд╛ рдФрд░ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╣рд╛рдпрдХреЛрдВ рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ ioutil.ReadFileрдФрд░ ioutil.WriteFileред рд▓реЗрдХрд┐рди рдЬрдм рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ I / O рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ рдЙрддреНрддрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдШреБрд╕рдкреИрда рдмрди рд╕рдХрддреА рд╣реИред рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдПрдХ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИред

 type Header struct { Key, Value string } type Status struct { Code int Reason string } func WriteResponse(w io.Writer, st Status, headers []Header, body io.Reader) error { _, err := fmt.Fprintf(w, "HTTP/1.1 %d %s\r\n", st.Code, st.Reason) if err != nil { return err } for _, h := range headers { _, err := fmt.Fprintf(w, "%s: %s\r\n", h.Key, h.Value) if err != nil { return err } } if _, err := fmt.Fprint(w, "\r\n"); err != nil { return err } _, err = io.Copy(w, body) return err } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдерд┐рддрд┐ рдкрдЯреНрдЯреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг fmt.FprintfрдХрд░реЗрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╣реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдХреБрдВрдЬреА рдФрд░ рд╣реЗрдбрд┐рдВрдЧ рд╡реИрд▓реНрдпреВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рд░ рдмрд╛рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╣реЗрдбрд░ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ \r\n, рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рдХрд╛рдп рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ io.Copy, рд╣рдореЗрдВ рдЗрд╕реЗ рджреЛ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд░рд┐рдЯрд░реНрди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ WriteResponseред

рдпрд╣ рдмрд╣реБрдд рдиреАрд░рд╕ рдХрд╛рдо рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЫреЛрдЯреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реИрдкрд░ рд▓рдЧрд╛рдХрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдЖрд╕рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ errWriterред

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

 type errWriter struct { io.Writer err error } func (e *errWriter) Write(buf []byte) (int, error) { if e.err != nil { return 0, e.err } var n int n, e.err = e.Writer.Write(buf) return n, nil } func WriteResponse(w io.Writer, st Status, headers []Header, body io.Reader) error { ew := &errWriter{Writer: w} fmt.Fprintf(ew, "HTTP/1.1 %d %s\r\n", st.Code, st.Reason) for _, h := range headers { fmt.Fprintf(ew, "%s: %s\r\n", h.Key, h.Value) } fmt.Fprint(ew, "\r\n") io.Copy(ew, body) return ew.err } 

рдпрджрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ errWriterрдЬрд╛рддрд╛ рд╣реИ WriteResponse, рддреЛ рдХреЛрдб рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдСрдкрд░реЗрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдЪреЗрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ ew.err, рд▓реМрдЯреЗ io.Copy рдореВрд▓реНрдпреЛрдВ рдХреЗ рдХрд╖реНрдЯрдкреНрд░рдж рдЕрдиреБрд╡рд╛рдж рд╕реЗ рдмрдЪрддрд╛ рд╣реИред

7.2ред рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ


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

 // WriteAll writes the contents of buf to the supplied writer. func WriteAll(w io.Writer, buf []byte) { w.Write(buf) } 

рдпрджрд┐ рдЖрдк рдПрдХ рд╕реЗ рдХрдо рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреНрд░реБрдЯрд┐ рдХреЛ w.WriteAllрдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдПрдХ рдЧрд▓рддреА рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рднреА рдЧрд▓рдд рд╣реИред рдиреАрдЪреЗ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдореИрдВ рдЕрдХреНрд╕рд░ рднрд░рддрд╛ рд╣реВрдВред

 func WriteAll(w io.Writer, buf []byte) error { _, err := w.Write(buf) if err != nil { log.Println("unable to write:", err) // annotated error goes to log file return err // unannotated error returned to caller } return nil } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ w.Write, рддреЛ рд▓рд╛рдЗрди рд▓реЙрдЧ рдХреЛ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЙрд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рднреА рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ, рд╢рд╛рдпрдж, рдЙрд╕реЗ рд▓реЙрдЧ рдЗрди рднреА рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рддрдХ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдХреЙрд▓рд░ рдПрдХ рд╣реА рдХрд░рддрд╛ рд╣реИ:

 func WriteConfig(w io.Writer, conf *Config) error { buf, err := json.Marshal(conf) if err != nil { log.Printf("could not marshal config: %v", err) return err } if err := WriteAll(w, buf); err != nil { log.Println("could not write config: %v", err) return err } return nil } 

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

 unable to write: io.EOF could not write config: io.EOF 

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

 err := WriteConfig(f, &conf) fmt.Println(err) // io.EOF 

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

 func WriteConfig(w io.Writer, conf *Config) error { buf, err := json.Marshal(conf) if err != nil { log.Printf("could not marshal config: %v", err) // oops, forgot to return } if err := WriteAll(w, buf); err != nil { log.Println("could not write config: %v", err) return err } return nil } 

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

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

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

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

7.2.1ред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рдирд╛


рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдЦрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢рд╛рди рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рдЖрдЗрдП рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВ fmt.Errorfред

 func WriteConfig(w io.Writer, conf *Config) error { buf, err := json.Marshal(conf) if err != nil { return fmt.Errorf("could not marshal config: %v", err) } if err := WriteAll(w, buf); err != nil { return fmt.Errorf("could not write config: %v", err) } return nil } func WriteAll(w io.Writer, buf []byte) error { _, err := w.Write(buf) if err != nil { return fmt.Errorf("write failed: %v", err) } return nil } 

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

рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрддреЗ рд╕рдордп I / O рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ Error()рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА:

 could not write config: write failed: input/output error 

7.2.2ред Github.com/pkg/errors рдХреЗ рд╕рд╛рде рд░реИрдкрд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐


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

  1. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред
  2. рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ рдпрд╛ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ errors:

 func ReadFile(path string) ([]byte, error) { f, err := os.Open(path) if err != nil { return nil, errors.Wrap(err, "open failed") } defer f.Close() buf, err := ioutil.ReadAll(f) if err != nil { return nil, errors.Wrap(err, "read failed") } return buf, nil } func ReadConfig() ([]byte, error) { home := os.Getenv("HOME") config, err := ReadFile(filepath.Join(home, ".settings.xml")) return config, errors.WithMessage(err, "could not read config") } func main() { _, err := ReadConfig() if err != nil { fmt.Println(err) os.Exit(1) } } 

рдЕрдм рд╕рдВрджреЗрд╢ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╢реНрдореАрд░ рдФрд░ рдбреА-рд╕реНрдЯрд╛рдЗрд▓ рдмрдЧ рдмрди рдЬрд╛рддрд╛ рд╣реИ:

 could not read config: open failed: open /Users/dfc/.settings.xml: no such file or directory 

рдФрд░ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рдореВрд▓ рдХрд╛рд░рдг рдХрд╛ рд▓рд┐рдВрдХ рд╣реИред

 func main() { _, err := ReadConfig() if err != nil { fmt.Printf("original error: %T %v\n", errors.Cause(err), errors.Cause(err)) fmt.Printf("stack trace:\n%+v\n", err) os.Exit(1) } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 original error: *os.PathError open /Users/dfc/.settings.xml: no such file or directory stack trace: open /Users/dfc/.settings.xml: no such file or directory open failed main.ReadFile /Users/dfc/devel/practical-go/src/errors/readfile2.go:16 main.ReadConfig /Users/dfc/devel/practical-go/src/errors/readfile2.go:29 main.main /Users/dfc/devel/practical-go/src/errors/readfile2.go:35 runtime.main /Users/dfc/go/src/runtime/proc.go:201 runtime.goexit /Users/dfc/go/src/runtime/asm_amd64.s:1333 could not read config 

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

8. рд╕рдВрдЧрддрд┐


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

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

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

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

8.1ред рд╣рд░ рд╕рдордп рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдВред


рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

 package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, GopherCon SG") }) go func() { if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }() for { } } 

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

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

рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВ? рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред

 package main import ( "fmt" "log" "net/http" "runtime" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, GopherCon SG") }) go func() { if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }() for { runtime.Gosched() } } 

рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреА рдЧрд▓рддрдлрд╣рдореА рдХрд╛ рдПрдХ рд▓рдХреНрд╖рдг рд╣реИред

рдпрджрд┐ рдЖрдк рдЧреЛ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реЗ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВред

 package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, GopherCon SG") }) go func() { if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }() select {} } 

рдПрдХ рдЦрд╛рд▓реА рдХрдерди selectрд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдкреВрд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд┐рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ runtime.GoSched()ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдХреЗрд╡рд▓ рд▓рдХреНрд╖рдг рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛рд░рдг рдирд╣реАрдВред

рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХрд╛ рд╣реИред http.ListenAndServeрдЧреЛрд░реЛрдЗрди рдореЗрдВ рджреМрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп , рдореБрдЦреНрдп рдЧреЛрд░реЛрдЗрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдореБрдЦреНрдп рдЧреЛрд░реЛрдЗрди http.ListenAndServeрдореЗрдВ рд╣реА рджреМрдбрд╝реЗрдВред

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

 package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, GopherCon SG") }) if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } } 

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

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

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

8.2ред рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирддрд╛ рдЫреЛрдбрд╝ рджреЗрдВ


рджреЛрдиреЛрдВ API рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?

 // ListDirectory returns the contents of dir. func ListDirectory(dir string) ([]string, error) 

 // ListDirectory returns a channel over which // directory entries will be published. When the list // of entries is exhausted, the channel will be closed. func ListDirectory(dir string) chan string 

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

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

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

ListDirectoryрдЪреИрдирд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджреЛ рдФрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

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

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

 func ListDirectory(dir string, fn func(string)) 

рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ, рдлрд╝рдВрдХреНрд╢рди filepath.WalkDirрдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

8.3ред рдХрднреА рднреА рдЧреЛрд░реЛрдЙрдЯрд┐рди рдХреЛ рдмрд┐рдирд╛ рдпрд╣ рдЬрд╛рдиреЗ рдХрд┐ рдпрд╣ рдХрдм рд░реБрдХреЗрдЧрд╛


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

рдпрд╣ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдкрд░ http рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ 8080 рдФрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рддрдХ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ 8001 /debug/pprofред

 package main import ( "fmt" "net/http" _ "net/http/pprof" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) go http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux) // debug http.ListenAndServe("0.0.0.0:8080", mux) // app traffic } 

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

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

 func serveApp() { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) http.ListenAndServe("0.0.0.0:8080", mux) } func serveDebug() { http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux) } func main() { go serveDebug() serveApp() } 

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

рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ serveAppрдФрд░ рдлрд┐рд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ main.main, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

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

рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдЧреЛрд░реЛрдЗрди рдкрд░реЛрд╕рддрд╛ рд╣реИ рддреЛ рдЖрд╡реЗрджрди рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ ред

 func serveApp() { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) if err := http.ListenAndServe("0.0.0.0:8080", mux); err != nil { log.Fatal(err) } } func serveDebug() { if err := http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux); err != nil { log.Fatal(err) } } func main() { go serveDebug() go serveApp() select {} } 

рдЕрдм serverAppрд╡реЗ serveDebugрддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ ListenAndServeрдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ log.Fatalред рдЪреВрдБрдХрд┐ рджреЛрдиреЛрдВ рд╣реИрдВрдбрд▓рд░ рдЧреЛрд░реЛрдирд╛рдЗрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдореБрдЦреНрдп рд░реВрдЯреАрди рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ select{}ред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  1. рдпрджрд┐ рдпрд╣ ListenAndServeрдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд▓реМрдЯрддрд╛ рд╣реИ nil, рддреЛ рдХреЛрдИ рдХреЙрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ log.Fatal, рдФрд░ рдЗрд╕ рдкреЛрд░реНрдЯ рдкрд░ HTTP рд╕реЗрд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧреАред
  2. log.FatalрдХреЙрд▓ os.ExitрдЬреЛ рдмрд┐рдирд╛ рд╢рд░реНрдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреА рд╣реИ; рд╕реНрдердЧрд┐рдд рдХреЙрд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдЕрдиреНрдп рдЧреЛрд░реЛрдЗрдиреНрдЯреНрд╕ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рд╕реВрдЪрдирд╛ рдирд╣реАрдВ рджреА рдЬрд╛рдПрдЧреА, рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╕ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд╕реЗ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЯрд┐рдк ред рдХреЗрд╡рд▓ log.FatalрдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ main.mainрдпрд╛ initред

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

 func serveApp() error { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) return http.ListenAndServe("0.0.0.0:8080", mux) } func serveDebug() error { return http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux) } func main() { done := make(chan error, 2) go func() { done <- serveDebug() }() go func() { done <- serveApp() }() for i := 0; i < cap(done); i++ { if err := <-done; err != nil { fmt.Println("error: %v", err) } } } 

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

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

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

рдХреА рдЕрдкреАрд▓ рдХреАhttp.ServerрдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рддрд░реНрдХ рдХреЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд▓рдкреЗрдЯрд╛ред рд╕рд╣рд╛рдпрдХ serveрдкрддреЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ http.HandlerрдЗрд╕реА рддрд░рд╣ http.ListenAndServe, рд╡рд╣ рдЪреИрдирд▓ stopрдЬрд┐рд╕реЗ рд╣рдо рд╡рд┐рдзрд┐ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ Shutdownред

 func serve(addr string, handler http.Handler, stop <-chan struct{}) error { s := http.Server{ Addr: addr, Handler: handler, } go func() { <-stop // wait for stop signal s.Shutdown(context.Background()) }() return s.ListenAndServe() } func serveApp(stop <-chan struct{}) error { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) return serve("0.0.0.0:8080", mux, stop) } func serveDebug(stop <-chan struct{}) error { return serve("127.0.0.1:8001", http.DefaultServeMux, stop) } func main() { done := make(chan error, 2) stop := make(chan struct{}) go func() { done <- serveDebug(stop) }() go func() { done <- serveApp(stop) }() var stopped bool for i := 0; i < cap(done); i++ { if err := <-done; err != nil { fmt.Println("error: %v", err) } if !stopped { stopped = true close(stop) } } } 

рдЕрдм рдЪреИрдирд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП doneрд╣рдо рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ stop, рдЬреЛ рдЗрд╕ рдЪреИрдирд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд░реВрдЯрд┐рди рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ http.Serverред рдмрджрд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рднреА рд╢реЗрд╖ рдЧреЛрд░рдЖрдЙрдЯреНрд╕ рдХреА рд╡рд╛рдкрд╕реА рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ ListenAndServeред рдЬрдм рд╕рднреА рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЧреЛрд░реВрдЯрд┐рди рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ main.mainрд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдлрд╛рдИ рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред

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

Source: https://habr.com/ru/post/hi441842/


All Articles