ich diese komfortable Funktion in Python hatte:Go: "tail -f" -ähnlichen Generator
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
Es macht etwas Ähnliches zu UNIX tail -f
: Sie letzten Zeilen einer Datei zu erhalten, wie sie kommen. Es ist praktisch, weil Sie den Generator ohne Blockierung erhalten und es an eine andere Funktion übergeben können.
Dann musste ich das gleiche in Go tun. Ich bin neu in dieser Sprache, also bin ich mir nicht sicher, ob das, was ich getan habe, idiomatisch/korrekt genug für Go ist. Hier
ist der Code:
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
}
Gibt es eine sauberere Weg, dies in Gehen Sie zu tun? Ich habe das Gefühl, dass ein asynchroner Aufruf für so etwas ein Overkill ist, und es stört mich wirklich.
Verwenden Sie 'os.SEEK_END' anstelle von' 2'. 'time.Sleep (10)' schläft für 10 Nanosekunden, du meinst wahrscheinlich 'time.Sleep (10 * time.Millisecond)'. Sobald ein "io.Reader" Ihnen "io.EOF" gibt, sollten Sie nicht erwarten, dass es Ihnen jemals mehr Daten geben wird; EOF == ** Ende ** der Datei/Steam, keine weiteren Daten. –
Danke, ich habe den Code bearbeitet. – oopcode