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(&v); err != nil { log.Fatal(err) } fmt.Println("the value is ", v) }</code>
利点
このアプローチにはいくつかの利点があります:
以上がGo で同等の「tail -f」を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。