Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Mencipta Setara \"tail -f\" dalam Go?
"tail -f"-like Generator in Go
Tugasnya ialah untuk mencipta fungsi yang serupa dengan "tail -f" Python yang menyediakan aliran baris berterusan daripada fail semasa ia ditulis, tanpa menyekat utas utama.
Penyelesaian Asal
Kod Go yang disediakan menggunakan goroutin tak segerak untuk sentiasa pantau fail untuk baris baharu, yang menimbulkan kebimbangan tentang gaya Go idiomatik dan kemungkinan komplikasi berlebihan.
Pendekatan Lebih Bersih
Pendekatan Go yang lebih mudah dan idiomatik melibatkan mencipta pembalut di sekeliling pembaca fail yang tidur hanya apabila sampai ke penghujung fail:
<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>
Penggunaan
Pembungkus ini boleh digunakan di mana-mana sahaja io.Pembaca standard dijangka. Contohnya, untuk menggelung pada baris menggunakan bufio.Pengimbas:
<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()) }</code>
Sebagai alternatif, pembaca boleh digunakan untuk tugas yang lebih kompleks, seperti mengendalikan nilai JSON yang ditambahkan:
<code class="go">t, err := newTailReader("somefile") if err != nil { log.Fatal(err) } defer t.Close() dec := json.NewDecoder(t) for { var v SomeType if err := dec.Decode(&v); err != nil { log.Fatal(err) } fmt.Println("the value is ", v) }</code>
Kelebihan
Pendekatan ini menawarkan beberapa kelebihan:
Atas ialah kandungan terperinci Bagaimana untuk Mencipta Setara \"tail -f\" dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!