바이트 슬라이스를 io.Reader로 변환


177

내 프로젝트에는 요청 응답의 바이트 슬라이스가 있습니다.

defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
    log.Println("StatusCode为" + strconv.Itoa(resp.StatusCode))
    return
}

respByte, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("fail to read response data")
    return
}

이것은 효과가 있지만에 대한 응답 본문을 얻으려면 io.Reader어떻게 변환합니까? 나는 새로운 리더 / 작가를 시도했지만 성공하지 못했습니다.


3
내가 올바르게 이해하면 응답을 io.Reader? 이 경우 resp.Body는 이미 해당 유형입니다.
Arjan

3
golang.org/pkg/bytes/#NewReader 는 a []byte를 a io.Reader(및 io.ReadSeeker)로
바꿉니다

@Arjan yap ~ body ... 요청을 마치면 기본 클래스에서 io.reader. 그러나 기본 클래스에서 응답을 얻고 싶습니다. 응답이 종료되었습니다. 응답 본문을 [] 바이트로 구조체에 저장하십시오.
Chan Willson

@ ANisus 내가 시도합니다 ..... thx 친구 .. 그건 그렇고 ... 그것은 다른 유형처럼 보인다 ..
Chan Willson

@ ChanWillson : 그 요구 사항이 더 합리적입니다. 본문을 닫은 후에는 읽을 수 없습니다. 인터페이스 *bytes.Reader를 구현하는 것이 좋습니다 io.Reader.
Arjan

답변:


304

슬라이스 io.Reader에서 구현되는 유형을 얻으려면 패키지 에서 []byte사용할 수 있습니다 .bytes.NewReaderbytes

r := bytes.NewReader(byteData)

이것은 (and ) 인터페이스 bytes.Reader를 구현하는 type 값을 반환합니다 .io.Readerio.ReadSeeker

그들이 같은 "유형"이 아닌 것에 대해 걱정하지 마십시오. io.Reader인터페이스이며 다양한 유형으로 구현할 수 있습니다. Go의 인터페이스에 대해 조금 더 배우려면 Effective Go : Interfaces and Types를 읽으십시오 .


a를 돌려 수있는 유사한 기능이 있습니까 []byte로는 io.Writer? 예 :bytes.NewWriter(destination)
byxor

4
@byxor 네, 당신이 찾고있는 것은 bytes.Buffer입니다. 거기에 다음 io.Writer과 같이 구현하는 버퍼를 만듭니다 w := bytes.NewBuffer(destination).
ANisus

나는이 오류를 이해하지 못한다 govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich

1
@VitalyZdanevich bytes.Reader포인터 리시버 가 있기 때문에 포인터 유형 ( *bytes.Reader)에서 기본 유형 ( bytes.Reader)으로 전환하고 있습니다. 별표 ( *)를 제거 하면 괜찮을 것입니다 :)
ANisus

-18
r := strings(byteData)

이것은 또한 차례에 작동 []byteio.Reader


4
Strings는 패키지이므로 string (byteData)을 의미한다고 가정합니다. 그런 식으로 바이트 슬라이스에서 문자열을 얻을 수 있습니다 (s 빼기). String은 Read () 메서드가 없으므로 io.Reader 인터페이스를 구현하지 않습니다. play.golang.org/p/eRMmtHsscd 는 문자열에서 Read ()가 호출 될 때 실패하는 예입니다.
jeffrey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.