>  기사  >  백엔드 개발  >  Go에서 동일한 \"tail -f\"를 만드는 방법은 무엇입니까?

Go에서 동일한 \"tail -f\"를 만드는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-30 03:33:02560검색

How to Create a

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(&amp;v); err != nil {
       log.Fatal(err)
    }
    fmt.Println("the value is ", v)
}</code>

장점

이 접근 방식은 여러 가지 장점을 제공합니다.

  • 간편한 종료: 간단히 파일을 닫으면 읽기가 중지됩니다.
  • 관용적인 Go 스타일: 이 작업에 불필요할 수 있는 비동기 고루틴이 필요하지 않습니다.
  • 호환성: 래퍼는 예상되는 모든 코드와 함께 사용할 수 있습니다. io.Reader.
  • 구성 가능한 절전 시간: 대기 시간이나 CPU 사용량을 최적화하기 위해 절전 간격을 조정할 수 있습니다.

위 내용은 Go에서 동일한 \"tail -f\"를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.