рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдЧреЛрд░реЛрдЯрд╛рдЗрди рдХреА рдореМрдд

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


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

рд▓реЗрдЦ рдЕрдиреБрд╡рд╛рдж


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

рдпрджрд┐ рдЖрдк рд╕рдореБрджрд╛рдп рдореЗрдВ рдХрдИ рджрд┐рдиреЛрдВ рддрдХ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рд╕реБрдирддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдХреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдЧрд░реНрд╡ рд╕реЗ рд╕реБрдиреЗрдВрдЧреЗ:

рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╡рд╛рдж рди рдХрд░реЗрдВ, рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред

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

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

рдЕрдкрдиреЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЧреЛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЦреБрд▓реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдкреГрд╖реНрдарднреВрдорд┐ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд╛ рдкреВрд░рд╛ рд╣реЛрдирд╛ ред

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

 type LineReader struct { Ch chan string r *bufio.Reader } func NewLineReader(r io.Reader) *LineReader { lr := &LineReader{ Ch: make(chan string), r: bufio.NewReader(r), } go lr.loop() return lr } 

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

рдЕрдм рдЖрдЗрдП рд╕реНрд╡рдпрдВ рдкрд╛рд╢ рджреЗрдЦреЗрдВ:

 рдлрдВрдХ (рдПрд▓рдЖрд░ * рд▓рд╛рдЗрдирд░рд╛рдЗрдбрд░) рд▓реВрдк () {
         {рдХреЗ рд▓рд┐рдП
                 рд▓рд╛рдЗрди, рдЗрд░реЗрдЯ: = lr.r.ReadSlice ('\ n')
                 рдЕрдЧрд░ рдЧрд▓рдд рд╣реИ! = nil {
                         рдкрд╛рд╕ (lr.Ch)
                         рд╡рд╛рдкрд╕реА
                 }
                 lr.Ch <- string (рд▓рд╛рдЗрди)
         }
 }

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

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

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

рдХрд╛рд░реНрдп рдореЙрдбрд▓ рд╕рд░рд▓ рд╣реИ: рдордХрдмрд░реЗ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧреЛрд░реЛрдЗрди рдЬреАрд╡рд┐рдд рд╣реИ, рдорд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдореГрдд рд╣реИ, рд╕рд╛рде рд╣реА рдореГрддреНрдпреБ рдХрд╛ рдХрд╛рд░рдг рднреА рд╣реИред

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

type LineReader struct {
Ch chan string
r *bufio.Reader
t tomb.Tomb
}
 
func NewLineReader(r io.Reader) *LineReader {
lr := &LineReader{
Ch: make(chan string),
r: bufio.NewReader(r),
}
go lr.loop()
return lr
}

рдпрд╣ рдмрд╣реБрдд рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдирдпрд╛ рдХреНрд╖реЗрддреНрд░, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рд╣рдо рддреНрд░реБрдЯрд┐ рдЯреНрд░реИрдХрд┐рдВрдЧ рдФрд░ рд░реБрдХрд╛рд╡рдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

func (lr *LineReader) loop() {
defer lr.t.Done()
for {
line, err := lr.r.ReadSlice('n')
if err != nil {
close(lr.Ch)
lr.t.Kill(err)
return
}
select {
case lr.Ch <- string(line):
case <-lr.t.Dying():
close(lr.Ch)
return
}
}
}

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

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

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

func (lr *LineReader) Stop() error {
lr.t.Kill(nil)
return lr.t.Wait()
}

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

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

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

  $ рдЧреЛ рдХреЛ рд▓реЙрдиреНрдЪрдкреИрдб.net/tomb рдорд┐рд▓рддрд╛ рд╣реИ

рд╡рд┐рд╕реНрддреГрдд рдПрдкреАрдЖрдИ рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ:

gopkgdoc.appspot.com/pkg/launchpad.net/tomb

рд╕реМрднрд╛рдЧреНрдп рд╣реИ

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


All Articles