문제
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!