Go の「tail -f」のようなジェネレーター: 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 中国語 Web サイトの他の関連記事を参照してください。