How to Create a \'tail -f\' Equivalent in Go?

DDD
Release: 2024-10-30 03:33:02
Original
579 people have browsed it

How to Create a

"tail -f"-like Generator in Go

The task is to create a function similar to Python's "tail -f" that provides a continuous stream of lines from a file as they are written, without blocking the main thread.

Original Solution

The provided Go code uses an asynchronous goroutine to constantly monitor the file for new lines, which raises concerns about idiomatic Go style and potential overcomplication.

Cleaner Approach

A more straightforward and idiomatic Go approach involves creating a wrapper around the file reader that sleeps only when reaching the end of the file:

<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>
Copy after login

Usage

This wrapper can be used anywhere a standard io.Reader is expected. For example, to loop over lines using 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>
Copy after login

Alternatively, the reader can be used for more complex tasks, such as handling appended JSON values:

<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(&amp;v); err != nil {
       log.Fatal(err)
    }
    fmt.Println("the value is ", v)
}</code>
Copy after login

Advantages

This approach offers several advantages:

  • Easy shutdown: Simply closing the file stops the reader.
  • Idiomatic Go style: It avoids the need for asynchronous goroutines, which can be unnecessary for this task.
  • Compatibility: The wrapper can be used with any code that expects an io.Reader.
  • Configurable sleep time: The sleep interval can be adjusted to optimize latency or CPU usage.

The above is the detailed content of How to Create a \'tail -f\' Equivalent in Go?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!