"tail -f"-Like Generator in Go: Pendekatan Idiomatik dengan io.Reader
Dalam alam pengaturcaraan, keperluan untuk ikuti perkembangan kandungan fail yang sering timbul. Python menawarkan fungsi mudah yang disesuaikan dengan tugas ini, serupa dengan "tail -f" UNIX. Walau bagaimanapun, melaksanakan keupayaan serupa dalam Go memerlukan pendekatan yang berbeza disebabkan nuansa bahasa.
Dalam Go, kod yang diberikan dalam soalan menggunakan goroutine untuk memantau fail dan menghasilkan baris baharu apabila ia tersedia. Walaupun berfungsi, ia mungkin menimbulkan kebimbangan tentang penggunaan sumber dan amalan pengaturcaraan Go yang idiomatik.
Penyelesaian alternatif melibatkan mencipta pembalut di sekeliling io.Reader yang mempamerkan gelagat "seperti ekor". Pendekatan ini menawarkan beberapa kelebihan:
Pelaksanaan "tailReader" itu sendiri adalah mudah:
<code class="go">type tailReader struct { io.ReadCloser } func (t tailReader) Read(b []byte) (int, error) { for { n, err := t.ReadCloser.Read(b) if n > 0 { return n, nil } else if err != io.EOF { return n, err } time.Sleep(10 * time.Millisecond) } }</code>
Fungsi pembantu pilihan boleh digunakan untuk membuat instantiate "tailReader":
<code class="go">func newTailReader(fileName string) (tailReader, error) { f, err := os.Open(fileName) if err != nil { return tailReader{}, err } if _, err := f.Seek(0, 2); err != nil { return tailReader{}, err } return tailReader{f}, nil }</code>
Untuk menggunakan "tailReader," hanya bungkusnya di sekeliling bufio.Scanner atau mekanisme IO berasaskan pembaca yang lain:
<code class="go">t, err := newTailReader("somefile") if err != nil { log.Fatal(err) } defer t.Close() scanner := bufio.NewScanner(t) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading:", err) }</code>
Ringkasnya, pendekatan "tailReader" memanfaatkan kekuatan antara muka pembaca Go untuk menyediakan penyelesaian yang idiomatik dan cekap untuk mengikuti kandungan fail. Ia menawarkan kesederhanaan, kecekapan sumber dan penyepaduan yang lancar dengan kod Go sedia ada.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Penjana \'tail -f\'-Like dalam Go: Pendekatan Idiomatik dengan io.Reader?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!