рдпрд╣ рд▓реЗрдЦ рдЧреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рд╢реИрд▓реА рдореЗрдВ рдмрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд▓рд╛рдЗрдб рдХреЗ рдмрд┐рдирд╛ред рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП
рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдХреНрдпрд╛ рд╣реИрдВред рдпрд╣рд╛рдБ рдЖрдк рдЧреЛ рдХреЗ рддрдХрдиреАрдХреА рдирд┐рджреЗрд╢рдХ, рд░рд╕ рдХреЙрдХреНрд╕ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдпрджрд┐ рдЖрдк рд╕рдордп рдХрд╛рд░рдХ рдФрд░ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд░рд╕
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдореЗрдВ рдЖрдк рдПрдХ рдЙрддреНрдкрд╛рдж рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЗрдВрдЬреАрдирд┐рдпрд░ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЯреАрдореЗрдВ рдмрдврд╝рддреА рдпрд╛ рд╕рд┐рдХреБрдбрд╝рддреА рд╣реИрдВред рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИрдВ рдФрд░ рдмрдЧреНрд╕ рддрдп рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреГрддрд┐ рд╣реИред
рд╕рд╛рдордЧреНрд░реА
1. рдореМрд▓рд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрдд
рдореИрдВ рдЖрдкрдХреЗ рдмреАрдЪ рдЧреЛ рдХреЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реА рдирд┐рдЬреА рд░рд╛рдп рдирд╣реАрдВ рд╣реИред рдЗрди рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рддрд╣рдд рд╣реА рдЬрд╛рдирд╛:
- рдЖрд░рд╛рдо
- рдкрдардиреАрдпрддрд╛
- рдЙрддреНрдкрд╛рджрдХрддрд╛
рдиреЛрдЯред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ, рдореИрдВрдиреЗ "рдкреНрд░рджрд░реНрд╢рди" рдпрд╛ "рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЧреЛ рд╕реЗ рднреА рддреЗрдЬ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рддреБрд▓рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рд▓рддрд╛ рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАред рдРрд╕реА рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рдирддрд╛ рдХреЛ рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рддреБрд▓рдирд╛ рдкрдардиреАрдпрддрд╛ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАред
рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕рдВрдЧреЛрд╖реНрдареА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА, рдкрдардиреАрдпрддрд╛ рдФрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВредрдЖрд░рд╛рдо
"рд╕рд╛рджрдЧреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛ рд╣реИ" - рдПрджреНрдЧрд░ рджрд┐рдЬреНрдХреНрд╕реНрдЯреНрд░рд╛
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХреНрдпреЛрдВ? рдпрд╣ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЧреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд░рд▓ рд╣реИрдВ?
рд╣рдо рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдХреЛрдб рдореЗрдВ рдЖрдпрд╛ рдерд╛, рд╣реИ рдирд╛? рдЬрдм рдЖрдк рдПрдХ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╕реЗ рдбрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдПрдХ рдФрд░ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдХрд╛рдлреА рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рд╣реИред рдпрд╣реА рдХрдард┐рдирд╛рдИ рд╣реИред
тАЬрд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрддрдирд╛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдХрд┐ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдЦрд╛рдорд┐рдпрд╛рдВ рди рд╣реЛрдВ, рдФрд░ рджреВрд╕рд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдЦрд╛рдорд┐рдпрд╛рдВ рди рд╣реЛрдВред рдкрд╣рд▓рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред тАЭ - рд╕реАред рдИред рдЖрд░ред рд╣реЛрд░
рдЬрдЯрд┐рд▓рддрд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛рддреА рд╣реИред рдЬрдЯрд┐рд▓рддрд╛ рд╡рд╣ рд╣реИ рдЬреЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдорд╛рд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рд╛рджрдЧреА рдЧреЛ рдХрд╛ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рд╣реИред рд╣рдо рдЬреЛ рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╡реЗ рд╕рд░рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
1.2ред рдкрдардиреАрдпрддрд╛
"рдкрдардиреАрдпрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реИ" - рдорд╛рд░реНрдХ рд░реЗрдирд╣реЛрд▓реНрдб, рдЬреЗрд╡реАрдПрдо рд╕рдореНрдореЗрд▓рди, 2018
рдпрд╣ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреЛрдб рдкрдардиреАрдп рд╣реИ? рд╣рдореЗрдВ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
"рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдорд╢реАрдиреЗрдВ рд╕рд┐рд░реНрдл рдЙрдиреНрд╣реЗрдВ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреА рд╣реИрдВ" - рд╣реИрд▓ рдПрдмреЗрд▓реНрд╕рди рдФрд░ рдЬреЗрд░рд╛рд▓реНрдб рд╕рд╕рдорди, "рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛"
рди рдХреЗрд╡рд▓ рдЧреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо, рдмрд▓реНрдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рд╕рднреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдорд╢реАрдиреЛрдВ рднреА рдХреЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдорд╛рдзреНрдпрдорд┐рдХ рд╣реИред
рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╛рд░-рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛: рд╕реИрдХрдбрд╝реЛрдВ, рдпрджрд┐ рд╣рдЬрд╛рд░реЛрдВ рдмрд╛рд░ рдирд╣реАрдВред
"рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреМрд╢рд▓ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред" - рдЧреИрд╕реНрдЯрди рд╣реЛрд░реНрдХрд░
рдкрдардиреАрдпрддрд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреБрдВрдЬреА рд╣реИ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЛ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдП рд░рдЦреЗрдВ? рдпрджрд┐ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛; рдФрд░ рдпрд╣ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреА рдХрдВрдкрдиреА Go рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ, рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЖрдкрдХрд╛ рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╣реИред
рд╕рдорд░реНрдерд┐рдд рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реИред
1.3ред рдЙрддреНрдкрд╛рджрдХрддрд╛
"рдбрд┐рдЬрд╛рдЗрди рдХреЛрдб рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдХрд▓рд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЖрдЬ рдХрд╛рдо рдХрд░реЗ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдмрджрд▓рд╛рд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред" - рд╕реИрдВрдбреА рдореЗрдЯреНрд╕
рдЕрдВрддрд┐рдо рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдбреЗрд╡рд▓рдкрд░ рдХреА рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рд╡рд┐рд╖рдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдЖрдк рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдкрд░ рдХрд┐рддрдирд╛ рд╕рдордп рдмрд┐рддрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рддрдирд╛ - рдПрдХ рдЕрдпреЛрдЧреНрдп рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдЙрдкрдХрд░рдг рдпрд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рднрдЯрдХрдиреЗ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬрд╛рдУ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рдо рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ рдордЬрд╛рдХ рд╣реИ рдХрд┐ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЧреЛ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИ рдереАред рддреНрд╡рд░рд┐рдд рд╕рдВрдХрд▓рди рдЧреЛ рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдФрд░ рдирдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдорд┐рдирдЯ рд╕рдВрдХрд▓рди рдХреЛ рдЧреЛ рдкрд░ рдХреБрдЫ рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрд╛рджрдХ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрди рднрд╛рд╖рд╛рдУрдВ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ред
рдпрджрд┐ рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдкрдврд╝рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕ рддрд░реНрдХ рдореЗрдВ, рдЧреЛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢реИрд▓реА рдореЗрдВ рд╕рднреА рдХреЛрдб рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмреЛрд▓реА рд╕реАрдЦрдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдХрдард┐рдирд╛рдИ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧрд▓рдд
рджрд┐рдЦрддреЗ рд╣реИрдВред
рдЬрд╛рдУ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдЬреАрдм рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ, рдЬрдЯрд┐рд▓ рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдпрд╛ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреЛрдб рдХреА рддреИрдирд╛рддреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджрд┐рди рдирд╣реАрдВ рдмрд┐рддрд╛рддреЗ рд╣реИрдВред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╡реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рдХрд┐ рдПрдХ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИред
рдЬрдм рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕
рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХрд╛ рдорддрд▓рдм рдЙрддреНрдкрд╛рджрдХрддрд╛ рд╣реЛрддрд╛ рд╣реИред
2. рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛
рдкрд╣рд▓рд╛ рд╡рд┐рд╖рдп рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ -
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ,
рдирд╛рдореЛрдВ рдХрд╛ рдПрдХ рдкрд░реНрдпрд╛рдп рд╣реИ: рдЪрд░, рдХрд╛рд░реНрдп, рд╡рд┐рдзрд┐рдпрд╛рдБ, рдкреНрд░рдХрд╛рд░, рдкреИрдХреЗрдЬ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдирд╛рдоред
"рдЦрд░рд╛рдм рдирд╛рдо рдЦрд░рд╛рдм рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдПрдХ рд▓рдХреНрд╖рдг рд╣реИ" - рдбреЗрд╡ рдЪреЗрдиреА
рдЧреЛ рдХреЗ рд╕реАрдорд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╛рдо рдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдкрдардиреАрдпрддрд╛ рдкрд░ рднрд╛рд░реА рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред рдЕрдЪреНрдЫреЗ рдХреЛрдб рдореЗрдВ рдкрдардиреАрдпрддрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рдирд╛рдо рдЪреБрдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
2.1ред рдирд╛рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░
тАЬрдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рддреАрди рдореЗрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред тАЭ - рдЙрдХреА рд╕реНрдорд┐рде
рдЯреНрд░рд┐рдХреА рд╡рди-рд▓рд╛рдЗрдирд░реНрд╕ рдпрд╛ рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдбрд┐рд╕реНрдХ рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рди рд╣реА рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдордпред
тАЬрдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдПрдХ рдЕрдЪреНрдЫреЗ рдордЬрд╛рдХ рдХреА рддрд░рд╣ рд╣реИред рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рдпрд╣ рдЕрдм рдордЬрд╝реЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИред тАЭ - рдбреЗрд╡ рдЪреЗрдиреА
рдЕрдзрд┐рдХрддрдо рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рдХреБрдВрдЬреА рд╡реЗ рдирд╛рдо рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирддреЗ рд╣реИрдВред рдЕрдЪреНрдЫреЗ рдирд╛рдо рдореЗрдВ рдХреНрдпрд╛ рдЧреБрдг рдирд┐рд╣рд┐рдд рд╣реИрдВ?
- рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ ред рдЗрд╕рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рд╢реЛрд░ рдЕрдиреБрдкрд╛рдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрдХреЗрдд рд╣реИред
- рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реИ ред рдпрд╣ рдПрдХ рдЪрд░ рдпрд╛ рд╕реНрдерд┐рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдирд╣реАрдВ ред рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХрд┐рд╕реА рдкрджреНрдзрддрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ред рдкреИрдХреЗрдЬ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ ред рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдирд╛рдо рдЙрд╕ рдЪреАрдЬрд╝ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рдЙрддрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
- рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд╣реИ ред рдПрдХ рдирд╛рдо рд╕реЗ рдЖрдкрдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирд╛рдо рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдкрд░рдВрдкрд░рд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХрд╛ рдпрд╣реА рдорддрд▓рдм рд╣реИ рдЬрдм рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ "рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ ред "
рдЖрдЗрдП рдЗрди рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
2.2ред рдЖрдИрдбреА рдХреА рд▓рдВрдмрд╛рдИ
рдХрднреА-рдХрднреА рд▓рдШреБ рдЪрд░ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреА рд╢реИрд▓реА рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд░реЛрдм рдкрд╛рдЗрдХ
рдиреЗ рдХрд╣рд╛ , "рдЬрд╛рдУ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░
рд╕рд╣реА рд▓рдВрдмрд╛рдИ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред"
рдПрдВрдбреНрд░рдпреВ рдЧреЗрд░реИрдВрдб рдорд╣рддреНрд╡ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреА рдкрд╣рдЪрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
"рдХрд┐рд╕реА рдирд╛рдо рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╣реЛрдЧреА, рдЙрддрдирд╛ рд▓рдВрдмрд╛ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП" - рдПрдВрдбреНрд░рдпреВ рдЬреЗрд░реИрдВрдб
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреБрдЫ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ:
- рд▓рдШреБ рдЪрд░ рдирд╛рдо рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдпрджрд┐ рдШреЛрд╖рдгрд╛ рдФрд░ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдЫреЛрдЯреА рд╣реИред
- рд▓рдВрдмреЗ рдЪрд░ рдирд╛рдо рдЦреБрдж рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдЕрдм рд╡реЗ рдЬрд┐рддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рдЙрддрдирд╛ рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреГрд╖реНрда рдкрд░ рдЙрдирдХреЗ рд╡рдЬрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╡рд░реНрдмреЛрдЬрд╝ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдВрдХреЗрдд рд╣реЛрддреЗ рд╣реИрдВред
- рдЪрд░ рдирд╛рдо рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдирд╛рдо рд╢рд╛рдорд┐рд▓ рди рдХрд░реЗрдВред
- рдирд┐рд░рдВрддрд░ рдирд╛рдореЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рдореВрд▓реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдпрд╣ рдХрд┐ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд▓реВрдк рдФрд░ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рдЕрдХреНрд╖рд░ рдЪрд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ, рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрдж, рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╢рдмреНрджред
- рд╡рд┐рдзрд┐рдпреЛрдВ, рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рд╢рдмреНрджреЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред
- рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рдЙрд╕ рдирд╛рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЙрд▓рд░ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
type Person struct { Name string Age int }
рджрд╕рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд░реЗрдВрдЬ
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 {
*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 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. рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд┐рдирдЯ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
"рдПрдХ рдЕрдЪреНрдЫреЗ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдПрдХ рдмреБрд░реЗ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред" - рдбреЗрд╡ рдереЙрдорд╕ рдФрд░ рдПрдВрдбреНрд░рдпреВ рд╣рдВрдЯ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдПрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдФрд░ рдХреЗрд╡рд▓ рдПрдХ - рддреАрди рдЪреАрдЬреЛрдВ рдХрд╛:
- рдмрддрд╛рдПрдВ рдХрд┐ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред
- рдпрд╣ рдмрддрд╛рдПрдВ рдХрд┐ рд╡рд╣ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред
- рдХреНрдпреЛрдВ рд╕рдордЭрд╛рдПрдВред
рдкрд╣рд▓рд╛ рд░реВрдк рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд╛рддреНрд░реЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ:
рджреВрд╕рд░рд╛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ:
рддреАрд╕рд░рд╛ рд░реВрдк ("рдХреНрдпреЛрдВ") рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдЕрдиреВрдард╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рджреЛ рдХреЛ рджрдмрд╛ рдпрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдмрд╛рд╣рд░реА рдХрд╛рд░рдХреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдХреЗ рд╡рд░реНрддрдорд╛рди рд░реВрдк рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЕрдХреНрд╕рд░ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
return &v2.Cluster_CommonLbConfig{
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм HealthyPanicThreshold рд╢реВрдиреНрдп рдкреНрд░рддрд┐рд╢рдд рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ рдХрд┐ 0 рдХрд╛ рдорд╛рди рдШрдмрд░рд╛рд╣рдЯ рджрд╣рд▓реАрдЬ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред
3.1ред рдЪрд░ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдПрдХ рдЪрд░ рдпрд╛ рдЕрдЪрд░ рдХрд╛ рдирд╛рдо рдЙрд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдПрдХ рдЪрд░ рдпрд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП,
рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВред
const randomNumber = 6
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдмрддрд╛рддреА рд╣реИ
рдХрд┐ randomNumber
6 рдкрд░
randomNumber
рдХреНрдпреЛрдВ randomNumber
рдФрд░ рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИред рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрдирд╣реАрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐
randomNumber
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдХреБрдЫ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ:
const ( StatusContinue = 100
HTTP рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, 100
рдирдВрдмрд░
StatusContinue
рд░реВрдк
100
рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ RFC 7231, рдЦрдВрдб 6.2.1 рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЯрд┐рдк ред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рдмрд┐рдирд╛ рдЪрд░ рдХреЗ рд▓рд┐рдП, рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдЪрд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдкрд╛рдардХ рдХреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ dowidth
рдлрд╝рдВрдХреНрд╢рди dowidth
рдХреА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рдЯрд┐рдк ред рджреГрд╖реНрдЯрд┐ рдореЗрдВ рдЫрд┐рдкрд╛рдирд╛ред рдпрд╣ рдХреЗрдЯ рдЧреНрд░реЗрдЧрд░реА рдХреА рд╕рд▓рд╛рд╣ рд╣реИ ред рдХрднреА-рдХрднреА рдПрдХ рдЪрд░ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЫрд┐рдкрд╛ рд╣реЛрддрд╛ рд╣реИред
рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реА рдЧрдИ рдХреНрдпреЛрдВрдХрд┐ рдирд╛рдо registry
рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ - рдпрд╣ рдПрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╣реИ, рд▓реЗрдХрд┐рди рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреНрдпрд╛ рд╣реИ?
рдпрджрд┐ рдЖрдк рдПрдХ рдЪрд░ рдХрд╛ рдирд╛рдо sqlDrivers рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ SQL рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИрдВред
var sqlDrivers = make(map[string]*sql.Driver)
рдЕрдм рдЯрд┐рдкреНрдкрдгреА рдмреЗрдорд╛рдиреА рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдЙрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
3.2ред рд╣рдореЗрд╢рд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╡рд░реНрдгреЛрдВ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд рдХрд░реЗрдВ
рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЧреЙрдбреЛрдХ рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкреИрдХреЗрдЬ рдореЗрдВ рдШреЛрд╖рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЪрд░рд┐рддреНрд░ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП: рдПрдХ рдЪрд░, рдирд┐рд░рдВрддрд░, рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╡рд┐рдзрд┐ред
Google рд╢реИрд▓реА рдЧрд╛рдЗрдб рдХреЗ рджреЛ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:
- рдХреЛрдИ рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рджреЛрдиреЛрдВ рдирд╣реАрдВ рд╣реИ, рдЙрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
- рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХрд┐рд╕реА рднреА рдлрдВрдХреНрд╢рди рдкрд░ рдХрдореЗрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЪрд╛рд╣реЗ рд▓рдВрдмрд╛рдИ рдпрд╛ рдЬрдЯрд┐рд▓рддрд╛ рдХреБрдЫ рднреА рд╣реЛред
package ioutil
рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИ: рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдРрд╕рд╛ рди рдХрд░реЗрдВ:
рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╡рд╣ рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рдХрд┐ рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ: рдмрджрддрд░, рд╡рд╣ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рдпрд╣рд╛рдБ
io
рдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
LimitedReader
рдШреЛрд╖рдгрд╛ рддреБрд░рдВрдд рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░
LimitedReader.Read
рдШреЛрд╖рдгрд╛ рдЦреБрдж
LimitedReader
рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛
LimitedReader
рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐
LimitedReader.Read
рд╕реНрд╡рдпрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣
io.Reader
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдЯрд┐рдк ред рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦреЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ рдЙрд╕реЗ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
3.2.1ред рдЦрд░рд╛рдм рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рди рдХрд░реЗрдВ, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ
"рдмреБрд░рд╛ рдордд рдЯрд┐рдкреНрдкрдгреА рдХреЛрдб - рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛" - рдмреНрд░рд╛рдпрди Kernighan
рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреА рдХрдард┐рдирд╛рдИред рдпрджрд┐ рдЖрдк рдЗрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдЖрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЯрд┐рдХрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреА рдпрд╛рдж рдЖрддреА рд╣реИред рдЬрдм рддрдХ рдЗрд╕рдХреА рд░рд╛рд╢рд┐ рдЬреНрдЮрд╛рдд рд╣реЛ рдЖрдк рддрдХрдиреАрдХреА рдЛрдг рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдЯреАрдУрдбреАрдУ рд╢реИрд▓реА рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рд░рд┐рд╡рд╛рдЬ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИред
рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХреЗрддрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ TODO рдХреЗ рд╕рд╛рде рдПрдХ рддрд┐рдерд┐ рдпрд╛ рдЯрд┐рдХрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИрдВред
3.2.2ред рдХреЛрдб рдХреЛ рдХрдореЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕реЗ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░реЗрдВ
тАЬрдЕрдЪреНрдЫрд╛ рдХреЛрдб рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИред рдЬрдм рдЖрдк рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╣реЛрдВ, рддреЛ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫреЗрдВ: "рдХреЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреИрд╕реЗ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ?" рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдФрд░ рдЗрд╕реЗ рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝реЗрдВред тАЭ - рд╕реНрдЯреАрд╡ рдореИрдХрдХреЛрдиреЗрд▓
рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЕрдВрд╢ рдмрд╛рдХреА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рдХрд╛рд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЫреЛрдЯреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рди рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЬрдм рдЖрдк рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдирд╛рдо рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
4. рдкреИрдХреЗрдЬ рд╕рдВрд░рдЪрдирд╛
"рдПрдХ рдорд╛рдореВрд▓реА рдХреЛрдб рд▓рд┐рдЦреЗрдВ: рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдЕрдзрд┐рдХ рдирд╣реАрдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ" - рдбреЗрд╡ рдереЙрдорд╕
рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЫреЛрдЯрд╛ рдЧреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рдЬрд┐рд╕ рддрд░рд╣ рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рдпрд╛ рдореЗрдердб рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдЙрд╕реА рддрд░рд╣ рдлрдВрдХреНрд╢рди, рдореЗрдердб рдФрд░ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред
рдПрдХ рдЕрдЪреНрдЫрд╛ рдЧреЛ рдкреИрдХреЗрдЬ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реНрддрд░ рдкрд░ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдиреНрдпреВрдирддрдо рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдврд╝рддреА рд╣реИ, рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдкреВрд░реЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдХреИрд╕реНрдХреЗрдб рди рд╣реЛред рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЗрд╕ рдХреЛрдб рдмреЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЛ рдмрд╣реБрдд рд░реЛрдХрддреА рд╣реИрдВред
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдкреИрдХреЗрдЬ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕рдХрд╛ рдирд╛рдо рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
4.1ред рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреИрдХреЗрдЬ рдПрдХ рдЕрдЪреНрдЫреЗ рдирд╛рдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ
рдПрдХ рдЕрдЪреНрдЫрд╛ рдЧреЛ рдкреИрдХреЗрдЬ рдПрдХ рдЧреБрдгрд╡рддреНрддрд╛ рдирд╛рдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╢рдмреНрдж рддрдХ рд╕реАрдорд┐рдд рдПрдХ рдЫреЛрдЯреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВредрдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░ рдирд╛рдореЛрдВ рдХреА рддрд░рд╣, рдкреИрдХреЗрдЬ рдирд╛рдо рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд╡рд╛рд▓ рдкреВрдЫрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ: "рдпрд╣ рдкреИрдХреЗрдЬ рдХрд┐рд╕ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ?" рдЖрдорддреМрд░ рдкрд░ рдЙрддреНрддрд░ "рдпрд╣ рдкреИрдХреЗрдЬ рдЯрд╛рдЗрдк X рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ" рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди "рдпрд╣ рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред"рдЯрд┐рдк ред рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рдЪреБрдиреЗрдВ, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВред
4.1.1ред рдЕрдЪреНрдЫреЗ рдкреИрдХреЗрдЬ рдХреЗ рдирд╛рдо рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП
рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╛рдо рд╣реИред рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдирд╛рдо рджреЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдкрд░ рдХреЛрдИ рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рджреЛ рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдирд╛рдо рдПрдХ рд╣реА рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ:- .
- . , .
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
рдЙрдкрдпреЛрдЧреА рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ 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() {
рдиреЛрдЯ ред 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ред рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪреЗрдВ
рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд░реНрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдХреБрдВрдЬреА рдЬреЛ рдХрдордЬреЛрд░ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреИрдХреЗрдЬ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рджреВрд╕рд░реЗ рдкреИрдХреЗрдЬ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕реАрдзреЗ рдкрд╣рд▓реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИредрдЧреЛ рдореЗрдВ рдХрдордЬреЛрд░ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рджреЛ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХреЗ рд╣реИрдВ:- рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
- рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪреЗрдВред
рдЧреЛ рдореЗрдВ, рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ, рд╕рд╛рде рд╣реА рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдПрдХ рдЪрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкрд╣рдЪрд╛рди рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рджрд╛рдпрд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╣реЛрддрд╛ рд╣реИ: рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЛрдИ рднреА рдкреИрдХреЗрдЬ рдЗрд╕ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрддрд╛ рд╣реИредрдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рдШрдирд┐рд╖реНрда рд╕рдВрдмрдВрдз рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреГрд╢реНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ! рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред рдХреЛрдИ рднреА рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдЗрд╕ рдЪрд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИредрд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд░реЗрдВ:- рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░ рдХреЛ рдЙрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреА рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
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)
рдЕрдзрд┐рдХрддрдо рд╕рд░рд╛рд╣рдиреАрдп рд╣реИ : рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдХреНрд░рдо рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рдЖрда рдФрд░ рджрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рджрд╕ рд╣реИ, рдЪрд╛рд╣реЗ рдЖрда рдФрд░ рджрд╕ рдпрд╛ рджрд╕ рдФрд░ рдЖрда рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рдПредрд▓реЗрдХрд┐рди 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
рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдФрд░ 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 {
рдЪреВрдВрдХрд┐ рдСрдкрд░реЗрдЯрд░ if
рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдореИрдВ рдХреНрдпрд╛ рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдБ:
рдЗрд╕рд╕реЗ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдЗрдирдбреЛрд░ рдЗрдХрд╛рдИ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: if anyPositive(svc.MaxConnections, svc.MaxPendingRequests, svc.MaxRequests, svc.MaxRetries) {
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ anyPositive
, рдХреЛрдИ рдЧрд▓рддреА рд╕реЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ: if anyPositive() { ... }
рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, anyPositive
рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА false
ред рдпрд╣ рд╕рдмрд╕реЗ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ рдЕрдЧрд░ рддрд░реНрдХреЛрдВ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ anyPositive
рд▓реМрдЯреЗ true
редрд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреЙрдЬрд┐рдЯрд┐рд╡ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХреЛрдВ рдФрд░ рдЪрд░-рд▓рдВрдмрд╛рдИ рддрд░реНрдХреЛрдВ (рд╡реИрд░рдЧреЗрдЬ) рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЕрдм anyPositive
рдЖрдк рдПрдХ рд╕реЗ рдХрдо рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмреБрд▓рд╛ рд╕рдХрддреЗред6.3ред рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рджреЗрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдореБрдЭреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ Document
рдбрд┐рд╕реНрдХ рдкрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ ред
рдореИрдВ рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ Save
рдЬреЛ Document
рдПрдХ рдлрд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ *os.File
ред рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВредрд╣рд╕реНрддрд╛рдХреНрд╖рд░ Save
рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдРрд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╕рднреА рдХреЙрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛редSave
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрдкреНрд░рд┐рдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рд╕реНрдХ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПредрдФрд░ рдореБрдЭреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ f
рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред*os.File
рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ Save
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдкрде рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рд╣реИред рдЦреИрд░, рдЕрдЧрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░Save
рдХреЗрд╡рд▓ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рднрд╛рдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ *os.File
редрдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдЗрд╕рдХреА рдорджрдж рд╕реЗ io.ReadWriteCloser
рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рдЗрд╕реЗ Save
рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИредрдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ io.ReadWriteCloser
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ *os.File
редрдпрд╣ рдПрдХ рд╕рд╛рде рджрд╛рдпрд░реЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ Save
рдФрд░ рдХреЙрд▓рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЗ *os.File
рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВредрдФрд░ рд▓реЗрдЦрдХ Save
рдЕрдм рдЗрди рдЕрд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ *os.File
, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ io.ReadWriteCloser
редрд▓реЗрдХрд┐рди рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВредрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд░Save
рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝реЗрдЧрд╛ рдЬреЛ рдЙрд╕рдиреЗ рд╕рд┐рд░реНрдл рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛ - рдЕрдиреНрдп рдХреЛрдб рдХреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рд▓рд┐рдП, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ Save
рдХреЗрд╡рд▓ рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреАрд░реНрдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ редрджреВрд╕рд░реЗ, рдереНрд░реЗрдб рдХреНрд▓реЛрдЬрд┐рдВрдЧ рдореИрдХреЗрдирд┐рдЬреНрдо y Save
рдЙрд╕ рд╕рдордп рдХреА рд╡рд┐рд░рд╛рд╕рдд рд╣реИ рдЬрдм рдЙрд╕рдиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ wc
рдореЗрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдЪрд╛рд╣реЗ Save
рдХрд╛рд░рдг Close
рдмрд┐рдирд╛ рд╢рд░реНрдд, рдЪрд╛рд╣реЗ рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВредрдпрд╣ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдзрд╛рд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ 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ред рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЕрд░реНрде рд╣реИ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЕрд░реНрде рдЬрд╛рдБрдЪрдирд╛ рдФрд░ рдПрдХрд▓ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ред
рдпрджрд┐ рдЖрдк рдПрдХ рд╕реЗ рдХрдо рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреНрд░реБрдЯрд┐ рдХреЛ w.WriteAll
рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрд▓реЗрдХрд┐рди рдПрдХ рдЧрд▓рддреА рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рднреА рдЧрд▓рдд рд╣реИред рдиреАрдЪреЗ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдореИрдВ рдЕрдХреНрд╕рд░ рднрд░рддрд╛ рд╣реВрдВред func WriteAll(w io.Writer, buf []byte) error { _, err := w.Write(buf) if err != nil { log.Println("unable to write:", err)
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ 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)
рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред func WriteConfig(w io.Writer, conf *Config) error { buf, err := json.Marshal(conf) if err != nil { log.Printf("could not marshal config: %v", err)
рдореИрдВ рдЕрдХреНрд╕рд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдирд╛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛, рдЧреЛ рдХреА рд╢реИрд▓реА рд╕реАрдорд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ рдЬрд╛рдВрдЪреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬрд▓реНрджреА рд▓реМрдЯрддрд╛ рд╣реИредрдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓реЗрдЦрдХ рдиреЗ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХреА, рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рднреВрд▓ рдЧрдпрд╛ ред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдПрдХ рд╕реВрдХреНрд╖реНрдо рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИредрдЧреЛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдЕрдиреБрдмрдВрдз рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЪреВрдВрдХрд┐ 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
рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЯрд░реНрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдХрд┐ рд╢рд┐рдерд┐рд▓ рдпреБрдЧреНрдорд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрд╛рд░рджрд░реНрд╢реА рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ , рдЗрд╕рд▓рд┐рдП рд╕реНрд░реЛрдд рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:- рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред
- рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ рдпрд╛ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ 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
рддрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИрдВ, рддрдм рддрдХ рдХреЙрд▓рд░ рдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ ред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд┐рддрдиреА рдмрдбрд╝реА рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИредрджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдХреНрд▓рд╛рд╕рд┐рдХ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рддрд░рд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реИ, рдпрд╣рд╛рдВ рдпрд╣ 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)
рдпрджреНрдпрдкрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд░рд▓ рд╣реИ, рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдиреАрдВрд╡ рд╣реИредрдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рд░реВрдк рдореЗрдВ рдЖрд╡реЗрджрди рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдмрдврд╝рдиреЗ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА, рддреЛ рдЪрд▓реЛ рддреБрд░рдВрдд рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рджреЗрдЦреЗрдВред 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{}
редрдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:- рдпрджрд┐ рдпрд╣
ListenAndServe
рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд▓реМрдЯрддрд╛ рд╣реИ nil
, рддреЛ рдХреЛрдИ рдХреЙрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ log.Fatal
, рдФрд░ рдЗрд╕ рдкреЛрд░реНрдЯ рдкрд░ HTTP рд╕реЗрд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧреАред
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
рдЕрдм рдЪреИрдирд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП done
рд╣рдо рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ stop
, рдЬреЛ рдЗрд╕ рдЪреИрдирд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд░реВрдЯрд┐рди рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ http.Server
ред рдмрджрд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рднреА рд╢реЗрд╖ рдЧреЛрд░рдЖрдЙрдЯреНрд╕ рдХреА рд╡рд╛рдкрд╕реА рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ ListenAndServe
ред рдЬрдм рд╕рднреА рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЧреЛрд░реВрдЯрд┐рди рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ main.main
рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдлрд╛рдИ рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИредрдЯрд┐рдк ред рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рджреЛрд╣рд░рд╛рд╡ рдХрд╛рд░реНрдп рдФрд░ рдЧрд▓рддрд┐рдпреЛрдВ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реИред рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦреЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред