"tail -f"-Go의 Generator와 유사: io.Reader를 사용한 관용적 접근 방식
프로그래밍 영역에서 다음이 필요합니다. 파일의 변화하는 내용을 따르는 경우가 자주 발생합니다. Python은 UNIX의 "tail -f"와 유사하게 이 작업에 맞는 편리한 기능을 제공합니다. 그러나 Go에서 유사한 기능을 구현하려면 언어의 미묘한 차이로 인해 다른 접근 방식이 필요합니다.
Go에서 질문에 제공된 코드는 goroutine을 사용하여 파일을 모니터링하고 사용 가능한 새 줄을 생성합니다. 기능적이지만 리소스 사용 및 관용적인 Go 프로그래밍 방식에 대한 우려가 발생할 수 있습니다.
대체 솔루션은 "꼬리와 같은" 동작을 나타내는 io.Reader 주위에 래퍼를 만드는 것입니다. 이 접근 방식은 여러 가지 장점을 제공합니다.
"tailReader" 자체의 구현은 다음과 같습니다. 간단함:
<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>
"tailReader"를 인스턴스화하는 데 선택적 도우미 함수를 사용할 수 있습니다.
<code class="go">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>
"tailReader"를 활용하려면 간단히 bufio.Scanner로 감싸거나 기타 리더 기반 IO 메커니즘:
<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()) } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading:", err) }</code>
요약하자면, "tailReader" 접근 방식은 Go 리더 인터페이스의 장점을 활용하여 파일 내용을 추적하기 위한 관용적이고 효율적인 솔루션을 제공합니다. 단순성, 리소스 효율성 및 기존 Go 코드와의 원활한 통합을 제공합니다.
위 내용은 Go에서 \'tail -f\'와 유사한 생성기를 구현하는 방법: io.Reader를 사용한 관용적 접근 방식?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!