Masalah
Mengekor fail dalam Go memerlukan gelung dengan tidur pada EOF, yang boleh terdedah kepada ralat dan tidak cekap. Adakah terdapat cara yang lebih bersih untuk melakukan ini?
Penyelesaian
Daripada menggunakan goroutine, buat pembalut di sekeliling pembaca yang tidur pada EOF:
<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) } } 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>
Penggunaan
Pembaca ini boleh digunakan dengan mana-mana io.Reader, termasuk bufio.Scanner dan json.Decoder. Contohnya:
<code class="go">t, err := newTailReader("somefile") if err != nil { log.Fatal(err) } defer t.Close() // Use with bufio.Scanner scanner := bufio.NewScanner(t) for scanner.Scan() { fmt.Println(scanner.Text()) } // Use with json.Decoder 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
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta \'tail -f\' Seperti Penjana dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!