>백엔드 개발 >Golang >Go에서 다중 읽기 작업을 위해 io.Reader를 어떻게 복제할 수 있나요?

Go에서 다중 읽기 작업을 위해 io.Reader를 어떻게 복제할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-25 02:06:13816검색

How Can I Duplicate an io.Reader for Multiple Read Operations in Go?

다중 작업을 위한 io.Reader 인스턴스 복제

문제

request.Body와 같은 io.ReadCloser 유형으로 작업할 때 문제가 발생할 수 있습니다. 여러 작업(예: 파일에 쓰기 및 디코딩)을 수행하려는 경우. ioutil.ReadAll()에 대한 직접 호출은 전체 스트림을 소비하므로 후속 작업이 불가능합니다.

해결책: io.TeeReader 사용

직접 읽기와 달리 io.TeeReader를 사용하면 사용자가 io를 복제할 수 있습니다. 동일한 콘텐츠에 대한 여러 참조를 가능하게 하는 리더 스트림입니다. 이는 동일한 데이터를 두 번 읽는 문제를 해결합니다.

구현

다음은 io.TeeReader를 사용한 구현입니다.

package main

import (
    "bytes"
    "io"
    "io/ioutil"
    "log"
    "strings"
)

func main() {
    r := strings.NewReader("io.Reader contents to be read")
    var buf bytes.Buffer
    tee := io.TeeReader(r, &buf)

    // Perform the first operation using tee.
    log.Println(ioutil.ReadAll(tee))

    // Perform the second operation using the duplicated content in the buffer.
    log.Println(ioutil.ReadAll(&buf))
}

Notes

  • 먼저 TeeReader에서 읽어서 내용을 채우는 것을 잊지 마세요. buffer.
  • 스트림의 여러 부분에 대한 여러 참조를 생성해야 하는 경우 io.MultiReader 또는 io.PipeReader를 사용하세요.

위 내용은 Go에서 다중 읽기 작업을 위해 io.Reader를 어떻게 복제할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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