рд╢реАрд░реНрд╖ 10 рд╕рдмрд╕реЗ рдЖрдо рдЧрд▓рддрд┐рдпрд╛рдБ рдЬреЛ рдореБрдЭреЗ рдЧреЛ-рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ

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

рдЫрд╡рд┐

рдПрдирдо рдХрд╛ рдЕрдЬреНрдЮрд╛рдд рдореВрд▓реНрдп


рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

type Status uint32 const ( StatusOpen Status = iota StatusClosed StatusUnknown ) 

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

 StatusOpen = 0 StatusClosed = 1 StatusUnknown = 2 

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ JSON рдЕрдиреБрд░реЛрдз рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреИрдХ / рдЕрдирдкреИрдХреНрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдбрд┐рдЬрд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 type Request struct { ID int `json:"Id"` Timestamp int `json:"Timestamp"` Status Status `json:"Status"` } 

рдлрд┐рд░ рд╣рдореЗрдВ рдпрд╣ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:

 { "Id": 1234, "Timestamp": 1563362390, "Status": 0 } 

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

 { "Id": 1235, "Timestamp": 1563362390 } 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрдиреБрд░реЛрдз рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕реНрдерд┐рддрд┐ рдХреНрд╖реЗрддреНрд░ рд╢реВрдиреНрдп рдкрд░ рдкреНрд░рд╛рд░рдВрдн рд╣реЛ рдЬрд╛рдПрдЧрд╛ (uint32 рдХреЗ рд▓рд┐рдП рдпрд╣ 0 рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдлрд┐рд░ рд╕реЗ StatusUnogn рдХреЗ рдмрдЬрд╛рдп StatusOpen рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдиреНрдпреВрдорд░реЗрдЯрд░ рдХреЗ рдЕрдЬреНрдЮрд╛рдд рдореВрд▓реНрдп рдХреЛ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ - рдЕрд░реНрдерд╛рддред 0:

 type Status uint32 const ( StatusUnknown Status = iota StatusOpen StatusClosed ) 

рдпрджрд┐ рд╕реНрдерд┐рддрд┐ JSON рдЕрдиреБрд░реЛрдз рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ StatusUnaware рдореЗрдВ рдЖрд░рдВрднрд┐рдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред

рдмреЗрдВрдЪ рдорд╛рд░реНрдХрд┐рдВрдЧ


рд╕рд╣реА рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдмрд╣реБрдд рд╕реЗ рдХрд╛рд░рдХ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддреА рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЫрд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рддрд┐рд╡рд╣ / рдмрд┐рдЯрд╡реЗрдХреНрдЯрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг:

 func clear(n uint64, i, j uint8) uint64 { return (math.MaxUint64<<j | ((1 << i) - 1)) & n } 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рджреА рдЧрдИ рд╕реАрдорд╛ рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 func BenchmarkWrong(b *testing.B) { for i := 0; i < bN; i++ { clear(1221892080809121, 10, 63) } } 

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

рдЗрд╕рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐:

 var result uint64 func BenchmarkCorrect(b *testing.B) { var r uint64 for i := 0; i < bN; i++ { r = clear(1221892080809121, 10, 63) } result = r } 

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

рд╕рдВрдХреЗрдд! рд╣рд░ рдЬрдЧрд╣ рд╕рдВрдХреЗрдд рд╣реИрдВ!


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

рдирддреАрдЬрддрди, рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рддреЗрдЬ рд╣реЛрдЧрд╛, рд╣реИ рдирд╛?

рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдпрд╣ 0.3 KB рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛, рдФрд░ рдлрд┐рд░ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред 0.3 KB рдПрдХ рдмрд┐рдЯ рд╣реИ - рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рд╣рдо рд╣рд░ рджрд┐рди рдЙрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдЬрдм рдореИрдВ рдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореВрд▓реНрдп-рджрд░-рдореВрд▓реНрдп рд╕рдВрдЪрд░рдг 4 рдЧреБрдирд╛ рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬ рд╣реЛрддрд╛ рд╣реИред рдмрд╣реБрдд рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд, рд╣реИ рдирд╛?

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

рдПрдХ рдЪрд░ рдХреЛ рдвреЗрд░ рдпрд╛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  • рд╕реНрдЯреИрдХ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд░реНрддрдорд╛рди рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ, рдЪрд░ рд╕реНрдЯреИрдХ рд╕реЗ рдкреЙрдкрдЕрдк рд╣реЛрддреЗ рд╣реИрдВред
  • рдвреЗрд░ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЪрд░ (рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░, рдЖрджрд┐) рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ:

 func getFooValue() foo { var result foo // Do something return result } 

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

 func getFooPointer() *foo { var result foo // Do something return &result } 

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

рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдЧреЛ рд╕рдВрдХрд▓рдХ рдкрд░рд┐рдгрд╛рдо рдЪрд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдЪрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдореЗрдВред

рдкрд╛рд╕рд┐рдВрдЧ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:

 func main() { p := &foo{} f(p) } 

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝рд╛ io.Reader рдХреА рдкрдврд╝реЗрдВ рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ (рдЬреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИ) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдПрдХ рдвреЗрд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реИрдВ, рддреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЬрд╛рдВрдЪ рд╣реЛ рд╕рдХрддреА рд╣реИ? рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдЪрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 go build -gcflags "-m -m" 
ред
рд▓реЗрдХрд┐рди, рдлрд┐рд░ рд╕реЗ, рд╣рдорд╛рд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рджреИрдирд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

/ рд╕реНрд╡рд┐рдЪ рдпрд╛ рдХреЗ рд▓рд┐рдП / рдЪрдпрди рдХреЗ рд▓рд┐рдП рдЧрд░реНрднрдкрд╛рдд


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдПрдл рд░рд┐рдЯрд░реНрди рд╕рд╣реА рд╣реИ?

 for { switch f() { case true: break case false: // Do something } } 

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

рдпрд╣рд╛рдБ рдПрдХ рд╣реА рдореБрджреНрджрд╛:

 for { select { case <-ch: // Do something case <-ctx.Done(): break } } 

рдмреНрд░реЗрдХ рдПрдХ рдЪрдпрдирд┐рдд рдХрдерди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд▓реВрдк рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдПрдХ рд▓реЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП / рд╕реНрд╡рд┐рдЪ рдпрд╛ / рдЪрдпрди рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди рд╣реИ:

 loop: for { select { case <-ch: // Do something case <-ctx.Done(): break loop } } 

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


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

рд╡рд░реНрддрдорд╛рди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп (1.13 рд╕реЗ рдкрд╣рд▓реЗ) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ pkg / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред

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

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

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬрд┐рд╕рдореЗрдВ REST рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рд╣реИ:

 unable to server HTTP POST request for customer 1234 |_ unable to insert customer contract abcd |_ unable to commit transaction 

рдпрджрд┐ рд╣рдо pkg / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 func postHandler(customer Customer) Status { err := insert(customer.Contract) if err != nil { log.WithError(err).Errorf("unable to server HTTP POST request for customer %s", customer.ID) return Status{ok: false} } return Status{ok: true} } func insert(contract Contract) error { err := dbQuery(contract) if err != nil { return errors.Wrapf(err, "unable to insert customer contract %s", contract.ID) } return nil } func dbQuery(contract Contract) error { // Do something then fail return errors.New("unable to commit transaction") } 

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

рд╣рдо рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рднреА рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрд▓ рдмреИрдХ рдХрд░рдирд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдПрдХ db рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕рдХреА рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА db.DBError рдирд╛рдордХ рдЕрд╕реНрдерд╛рдпреА рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

 func postHandler(customer Customer) Status { err := insert(customer.Contract) if err != nil { switch errors.Cause(err).(type) { default: log.WithError(err).Errorf("unable to server HTTP POST request for customer %s", customer.ID) return Status{ok: false} case *db.DBError: return retry(customer) } } return Status{ok: true} } func insert(contract Contract) error { err := db.dbQuery(contract) if err != nil { return errors.Wrapf(err, "unable to insert customer contract %s", contract.ID) } return nil } 

рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░реЛрдХреЗрдВ, рдЬреЛ рдХрд┐ pkg / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ:

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордирд╛ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ pkg / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдерд╛ред рдПрдХ рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

 switch err.(type) { default: log.WithError(err).Errorf("unable to server HTTP POST request for customer %s", customer.ID) return Status{ok: false} case *db.DBError: return retry(customer) } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдЧрд░ db.DBError рдХреЛ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрднреА рднреА рджреВрд╕рд░рд╛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рд╕реНрд▓рд╛рдЗрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди


рдХрднреА-рдХрднреА рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдХреА рдЕрдВрддрд┐рдо рд▓рдВрдмрд╛рдИ рдХреНрдпрд╛ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдлреВ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдмрд╛рд░ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрди рджреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХреА рд▓рдВрдмрд╛рдИ рд╕рдорд╛рди рд╣реЛрдЧреАред

рдореИрдВ рдЕрдХреНрд╕рд░ рд╕реНрд▓рд╛рдЗрд╕ рднрд░ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрддреЗ рд╣реИрдВ:

 var bars []Bar bars := make([]Bar, 0) 

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

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЖрдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ [] рдлреВ рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ рддрддреНрд╡ рд╣реИрдВред рд╕рдореНрдорд┐рд▓рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдУ (1) рд░рд╣реЗрдЧреА, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЕрдВрддрд┐рдо рд▓рдВрдмрд╛рдИ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдЗрд╕реЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ:

 func convert(foos []Foo) []Bar { bars := make([]Bar, len(foos)) for i, foo := range foos { bars[i] = fooToBar(foo) } return bars } 

  • рдпрд╛ рдЗрд╕реЗ 0 рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рдПрдХ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░реЗрдВ:

 func convert(foos []Foo) []Bar { bars := make([]Bar, 0, len(foos)) for _, foo := range foos { bars = append(bars, fooToBar(foo)) } return bars } 

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

рдкреНрд░рд╕рдВрдЧ рдкреНрд░рдмрдВрдзрди


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

рдЖрдЗрдП рдЗрд╕реЗ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрджрд░реНрдн рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
  • рд╕рдордп рд╕реАрдорд╛ - рдХрд╛ рдЕрд░реНрде рд╣реИ рдпрд╛ рддреЛ рдЕрд╡рдзрд┐ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 250 рдПрдордПрд╕) рдпрд╛ рддрд╛рд░реАрдЦ-рд╕рдордп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2019-01-08 01:00:00), рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдорд╛рд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (I / O рдЕрдиреБрд░реЛрдз ), рдЪреИрдирд▓ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЖрджрд┐)ред
  • рд╕рдВрдХреЗрдд рд░рджреНрдж рдХрд░реЗрдВ (рдореВрд▓ рд░реВрдк рд╕реЗ <-рдЪрд╛рди рд╕рдВрд░рдЪрдирд╛ {})ред рдпрд╣рд╛рдБ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рди рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рдХреЛрдИ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рджреЛ рдЕрдиреБрд░реЛрдз рдорд┐рд▓реЗ рд╣реИрдВред рдПрдХ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдз рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП)ред рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдореЗрдВ рд░рджреНрдж рдХрд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рджреВрд╕рд░рд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реА рд░рджреНрдж рдХрд░ рджреЗрдВрдЧреЗред
  • рдХреБрдВрдЬреА / рдореВрд▓реНрдп рд╕реВрдЪреА (рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд {} рдкреНрд░рдХрд╛рд░)ред

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

рд╣рдорд╛рд░реЗ рд╡рд┐рд╖рдп рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдпрд╣рд╛рдБ рдПрдХ рдЧрд▓рддреА рд╣реИ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓реАред

рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди urfave / cli рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ (рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ рдЧреЛ рдореЗрдВ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ)ред рдПрдХ рдмрд╛рд░ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рддрд░рд╣ рдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджрд░реНрдн рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрд╡реЗрджрди рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрджрд░реНрдн рдХреЛ рд░рджреНрдж рд╕рдВрдХреЗрдд рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

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

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

рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдПрдХ рд╕рдордЧреНрд░ рд╕рдВрджрд░реНрдн рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджрд░реНрдн ( urfave / cli рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд) рдХрд╛ рдирд╛рдо рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 ctx, cancel := context.WithTimeout(parent, 100 * time.Millisecond) response, err := grpcClient.Send(ctx, request) 

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

-Race рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛


рдЧреНрд░реЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд┐рдирд╛ рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдПрдХ рдмрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВред

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

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

рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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

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

 func count(filename string) (int, error) { file, err := os.Open(filename) if err != nil { return 0, errors.Wrapf(err, "unable to open %s", filename) } defer file.Close() scanner := bufio.NewScanner(file) count := 0 for scanner.Scan() { if scanner.Text() == "" { count++ } } return count, nil } 

рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╣рдо рдЙрд╕реА рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HTTP рдирд┐рдХрд╛рдп рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЧреЛ рджреЛ рдорд╣рд╛рди рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ: io.Reader рдФрд░ io.Writerред рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ io.Reader рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдЕрдореВрд░реНрдд рдХрд░реЗрдЧрд╛ред
рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдлрд╛рдЗрд▓ рд╣реИ? HTTP рдмреЙрдбреА? рдмрд╛рдЗрдЯ рдмрдлрд░? рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рднреА рдЙрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдЗрдирдкреБрдЯ рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдЗрдирдкреБрдЯ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк bufio.Reader рдФрд░ рдЗрд╕рдХреА ReadLine рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 func count(reader *bufio.Reader) (int, error) { count := 0 for { line, _, err := reader.ReadLine() if err != nil { switch err { default: return 0, errors.Wrapf(err, "unable to read") case io.EOF: return count, nil } } if len(line) == 0 { count++ } } } 

рдЕрдм рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛рдЙрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджреА рдЧрдИ рд╣реИ:

 file, err := os.Open(filename) if err != nil { return errors.Wrapf(err, "unable to open %s", filename) } defer file.Close() count, err := count(bufio.NewReader(file)) 

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

 count, err := count(bufio.NewReader(strings.NewReader("input"))) 

рдЧреЛрд░рд╛рдЙрдЯрд╛рдЗрдиреНрд╕ рдФрд░ рдЪрдХреНрд░ рдЪрд░


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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

 ints := []int{1, 2, 3} for _, i := range ints { go func() { fmt.Printf("%v\n", i) }() } 

1 2 3 рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ? рдирд╣реАрдВред

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

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рджреЛ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдкрд╣рд▓рд╛ рд╡реИрд░рд┐рдПрдмрд▓ i рдХреЗ рдХреНрд▓реЛрдЬрд░ (рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди) рдХреЗ рдорд╛рди рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ:

 ints := []int{1, 2, 3} for _, i := range ints { go func(i int) { fmt.Printf("%v\n", i) }(i) } 

рджреВрд╕рд░рд╛ рд▓реВрдк рдХреЗ рднреАрддрд░ рдПрдХ рдФрд░ рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:

 ints := []int{1, 2, 3} for _, i := range ints { i := i go func() { fmt.Printf("%v\n", i) }() } 

рдореБрдЭреЗ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛: = рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдз рд╣реИред рд▓реВрдк рдореЗрдВ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдПрдХ рдЕрд▓рдЧ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛрдирд╛ред рдЗрд╕рд▓рд┐рдП, i: = i рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг i рдмрдирд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╣рдо рдЗрд╕реЗ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рд╕реЗ рдкреБрдХрд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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


All Articles