ho avuto questa comoda funzione in Python:Go: "tail -f" generatore -come
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
Si fa qualcosa di simile a UNIX tail -f
: si ottiene ultime righe di un file come vengono. È conveniente perché è possibile ottenere il generatore senza bloccare e passarlo a un'altra funzione.
Poi ho dovuto fare la stessa cosa in Go. Sono nuovo in questa lingua, quindi non sono sicuro se quello che ho fatto sia idiomatico/corretto abbastanza per Go.
Ecco il codice:
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
}
Esiste un modo più pulito per fare questo in Go? Ho la sensazione che usare una chiamata asincrona per una cosa del genere sia eccessivo, e mi infastidisce davvero.
Usa 'os.SEEK_END' piuttosto che' 2'. 'time.Sleep (10)' dorme per 10 nanosecondi, probabilmente intendevi 'time.Sleep (10 * time.Millisecond)'. Una volta che un 'io.Reader' ti dà' io.EOF' non dovresti aspettarti che ti dia mai più dati; EOF == ** fine ** di file/vapore, non più dati. –
Grazie, ho modificato il codice. – oopcode