Go で「tail -f」のようなジェネレーターを実装する方法: io.Reader を使用した慣用的なアプローチ?

Susan Sarandon
リリース: 2024-10-29 23:26:29
オリジナル
918 人が閲覧しました

How to Implement a

Go の「tail -f」のようなジェネレーター: io.Reader を使用した慣用的アプローチ

プログラミングの領域では、ファイルの内容の進化を追跡する必要が頻繁に発生します。 Python は、UNIX の「tail -f」に似た、このタスクに合わせた便利な関数を提供します。ただし、Go で同様の機能を実装するには、言語のニュアンスにより異なるアプローチが必要です。

Go では、質問で提供されているコードは goroutine を使用してファイルを監視し、新しい行が利用可能になったときに生成します。機能する一方で、リソースの使用法や慣用的な Go プログラミングの実践に関する懸念が生じる可能性があります。

別の解決策としては、「テールのような」動作を示す io.Reader の周囲にラッパーを作成することが含まれます。このアプローチには、次のような多くの利点があります。

  • 同期の簡素化: 「tailReader」型の存在により、ゴルーチンと呼び出しコード間の複雑な同期メカニズムが不要になります。
  • クリーナー API: io.Reader インターフェースを拡張することにより、「tailReader」は、io.Reader を期待する既存の Go コードおよびライブラリとシームレスに統合します。
  • リソース消費量の削減: ファイルの監視専用の goroutine を必要としないため、「tailReader」アプローチにより発生するオーバーヘッドが減り、CPU 使用率が削減されます。

「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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!