ホームページ  >  記事  >  バックエンド開発  >  Go で同等の「tail -f」を作成するにはどうすればよいですか?

Go で同等の「tail -f」を作成するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-30 03:33:02560ブラウズ

How to Create a

Go の "tail -f" のようなジェネレーター

このタスクは、Python の "tail -f" に似た関数を作成することです。メインスレッドをブロックすることなく、ファイルに書き込まれる行の継続的なストリームを提供します。

元のソリューション

提供された Go コードは、非同期ゴルーチンを使用して常にファイルに新しい行がないか監視します。これにより、慣用的な 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(&amp;v); err != nil {
       log.Fatal(err)
    }
    fmt.Println("the value is ", v)
}</code>

利点

このアプローチにはいくつかの利点があります:

  • 簡単なシャットダウン: ファイルを閉じるだけでリーダーが停止します。
  • 慣用的な Go スタイル: このタスクには不必要な可能性がある非同期ゴルーチンの必要性を回避します。
  • 互換性: ラッパーは、次のことを期待するあらゆるコードで使用できます。 io.Reader.
  • 構成可能なスリープ時間: スリープ間隔を調整して、レイテンシーまたは CPU 使用率を最適化できます。

以上がGo で同等の「tail -f」を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。