>백엔드 개발 >Golang >Go에서 io.Reader를 여러 번 읽으려면 어떻게 해야 합니까?

Go에서 io.Reader를 여러 번 읽으려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-18 19:36:11920검색

How Can I Read from an io.Reader Multiple Times in Go?

단일 io.Reader에서 여러 번 읽기

Go에서 소스에서 데이터를 읽기 위해 io.ReadCloser 인터페이스를 사용하면 여러 번 읽으려고 하면 도전해 보세요. 예를 들어, 파일에 직접 쓰고 디코딩하는 데 이미지가 포함된 request.Body(io.ReadCloser 유형)를 사용하려는 시나리오를 생각해 보세요.

문제:

다음 코드와 같이 판독기의 여러 인스턴스를 생성하려고 시도하면 두 번째 호출에서 nil이 반환됩니다. 값:

package main

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


func main() {
    r := strings.NewReader("some io.Reader stream to be read\n")
    a := &r
    b := &r
    log.Println(ioutil.ReadAll(*a))
    log.Println(ioutil.ReadAll(*b))

}

해결책:

io.Reader 인터페이스는 스트림을 모델링합니다. 즉, 스트림을 두 번 읽을 수 없습니다. 이러한 제한을 극복하기 위해 io.TeeReader 함수를 활용하여 중복 스트림을 생성할 수 있습니다.

package main

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

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

    log.Println(ioutil.ReadAll(tee))
    log.Println(ioutil.ReadAll(&buf)) 
}

이 코드는 io.TeeReader를 사용하여 r에서 중복 스트림을 생성하고 두 스트림 모두에 콘텐츠를 쓰는 방법을 보여줍니다. 티와 버프. tee에서 먼저 읽으면 버퍼가 스트림의 콘텐츠로 채워지는지 확인할 수 있습니다.

위 내용은 Go에서 io.Reader를 여러 번 읽으려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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