Я имел эту удобную функцию в Python:Go: «хвост -f» -как генератор
def follow(path):
with open(self.path) as lines:
lines.seek(0, 2) # seek to EOF
while True:
line = lines.readline()
if not line:
time.sleep(0.1)
continue
yield line
Это делает что-то похожее на UNIX tail -f
: вы получите последние строки файла, как они приходят. Это удобно, потому что вы можете получить генератор без блокировки и передать его другой функции.
Тогда я должен был сделать то же самое в Go. Я новичок в этом языке, поэтому я не уверен, что то, что я сделал, является идиоматическим/правильным для Go.
Вот код:
func Follow(fileName string) chan string {
out_chan := make(chan string)
file, err := os.Open(fileName)
if err != nil {
log.Fatal(err)
}
file.Seek(0, os.SEEK_END)
bf := bufio.NewReader(file)
go func() {
for {
line, _, _ := bf.ReadLine()
if len(line) == 0 {
time.Sleep(10 * time.Millisecond)
} else {
out_chan <- string(line)
}
}
defer file.Close()
close(out_chan)
}()
return out_chan
}
Есть ли уборщик способ сделать это в Go? У меня такое чувство, что использование асинхронного вызова для такой вещи является излишним, и это действительно беспокоит меня.
Используйте 'os.SEEK_END', а не' 2'. 'time.Sleep (10)' спит в течение 10 наносекунд, вы, вероятно, имели в виду 'time.Sleep (10 * time.Millisecond)'. Когда 'io.Reader' дает вам' io.EOF', вы не должны ожидать, что он когда-либо даст вам больше данных; EOF == ** end ** файла/пара, больше данных. –
Спасибо, я редактировал код. – oopcode