Go 中類似「tail -f」的產生器
任務是建立一個類似Python 的「tail -f」的函數,在寫入檔案時提供連續的行流,而不會阻塞主執行緒。
原始解決方案
提供的Go 程式碼使用非同步goroutine 不斷地監視文件中的新行,這會引發對慣用Go 風格和潛在過度複雜化的擔憂。
更簡潔的方法
更直接、更慣用的Go 方法包括創建一個包裝器僅在到達文件末尾時才休眠的文件讀取器:
<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>
用法
此包裝器可以在任何需要標準io.Reader 的地方使用。例如,要使用bufio.Scanner 循環行:
<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>
或者,閱讀器可用於更複雜的任務,例如處理附加的JSON 值:
<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>
優點
這個方法有幾個優點:
以上是如何在 Go 中建立“tail -f”等效項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!