У меня была эта удобная функция в Python:
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.
Вот код:
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? У меня такое чувство, что использование асинхронного вызова для такой вещи является излишним, и это действительно беспокоит меня.