我在Python有這個方便的功能:轉到:「尾-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'。睡覺(10)'睡10納秒,你可能意思是'睡覺(10 *時間。毫秒)'。一旦'io.Reader'給你'io.EOF',你不應該指望它給你更多的數據;文件/蒸汽的EOF == **結束**,不再有數據。 –
謝謝你,我編輯了代碼。 – oopcode