バイトスライスを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 []byteio.Reader(およびio.ReadSeeker)に「変換」します
ANisus

@Arjan yap〜body ...応答をio.readerとして取得したいのですが、リクエストを終了すると基本クラスで応答が強制終了されました。構造体の[] byteとして応答本文を保存するだけです。
Chan Willson、

私がしようとします@ANisus ....方法dude..by THXは...それの外観は、異なるタイプのようなものだ...
チャン・ウィルソン

@ChanWillson:その要件はより理にかなっており、閉じた後は本文を読み取ることができません。提案されているよう*bytes.Readerに、io.Readerインターフェースを実装する使用法。
Arjan、

回答:


304

スライスio.Readerから実装する型を取得[]byteするにbytes.NewReaderは、bytesパッケージで使用できます。

r := bytes.NewReader(byteData)

これは(および)インターフェースbytes.Readerを実装するタイプの値を返します。io.Readerio.ReadSeeker

それらが同じ「タイプ」でなくても心配しないでください。io.Readerインターフェースであり、さまざまなタイプで実装できます。Goのインターフェースの詳細については、「効果的なGo:インターフェースとタイプ」をご覧ください。


aをに[]byte変換する同様の関数はありio.Writerますか?例えばbytes.NewWriter(destination)
byxor

4
@byxorはい、あなたが探しているのはbytes.Bufferです。そこで、次のio.Writerように実装するバッファを作成しますw := bytes.NewBuffer(destination)
ANisus 2018年

私はこのエラーを理解できませんgovetcannot 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を除く)。文字列は、Read()メソッドがないため、io.Readerインターフェイスを実装していません。play.golang.org/p/eRMmtHsscdは、文字列に対してRead()が呼び出されたときに失敗する例です。
jeffrey 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.