問題
Go でファイルを末尾にするには、次のループが必要ですEOF でスリープすると、エラーが発生しやすく非効率的になる可能性があります。これを行うためのよりクリーンな方法はありますか?
解決策
ゴルーチンを使用する代わりに、EOF でスリープするリーダーのラッパーを作成します:
<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) } } 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>
使用法
このリーダーは、bufio.Scanner や json.Decoder を含む任意の io.Reader で使用できます。例:
<code class="go">t, err := newTailReader("somefile") if err != nil { log.Fatal(err) } defer t.Close() // Use with bufio.Scanner scanner := bufio.NewScanner(t) for scanner.Scan() { fmt.Println(scanner.Text()) } // Use with json.Decoder 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 サイトの他の関連記事を参照してください。