「tail -f」-Go 中的類似生成器:io.Reader 的慣用方法
在程式設計領域,需要追蹤出現的文件內容的演變。 Python 提供了專門針對此任務的便捷函數,類似於 UNIX 的「tail -f」。然而,由於語言的細微差別,在 Go 中實作類似的功能需要不同的方法。
在 Go 中,問題中提供的程式碼使用 goroutine 來監視檔案並在新行可用時產生新行。雖然功能強大,但它可能會引起對資源使用和慣用的 Go 編程實踐的擔憂。
另一個解決方案是圍繞 io.Reader 建立一個包裝器,以表現出「類似尾巴」的行為。這種方法有許多優點:
「tailReader」本身的實作是簡單明了:
<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>
可選的輔助函數可用來實例化「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>
要使用“tailReader”,只需將其包裹在bufio.Scanner 或其他基於讀取器的IO 機制:
<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>
總之,“tailReader”方法利用Go 讀取器接口的優勢,為追蹤文件內容提供了慣用且高效的解決方案。它提供簡單性、資源效率以及與現有 Go 程式碼的無縫整合。
以上是如何在 Go 中實作類似「tail -f」的生成器:使用 io.Reader 的慣用方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!