Go의 "tail -f"와 유사한 Generator
이 작업은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!