Bagaimana untuk Melaksanakan Penjana \'tail -f\'-Like dalam Go: Pendekatan Idiomatik dengan io.Reader?

Susan Sarandon
Lepaskan: 2024-10-29 23:26:29
asal
918 orang telah melayarinya

How to Implement a

"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:

  • Penyegerakan Ringkas: Kewujudan jenis "tailReader" menghapuskan keperluan untuk mekanisme penyegerakan yang kompleks antara goroutine dan kod panggilan.
  • API Pembersih: Dengan memanjangkan antara muka io.Reader, "tailReader" disepadukan dengan lancar dengan kod Go sedia ada dan perpustakaan yang mengharapkan io.Reader.
  • Penggunaan Sumber Lebih Rendah: Tanpa memerlukan goroutine khusus untuk memantau fail, pendekatan "tailReader" menanggung lebih sedikit overhed dan mengurangkan penggunaan CPU.

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!