request.Body(type io.ReadCloser)
画像が入っているものを使いたいです。
ioutil.ReadAll()
この本体をファイルに直接書き込んでデコードしたいので、使用したくないので、コンテンツへの参照のみを使用して、以降の関数呼び出しに渡します。
以下に示す例のように、リーダーの複数のインスタンスを作成してみました。
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))
}
しかし、2 回目の呼び出しでは常に になりますnil
。
同じリーダーに対して複数の個別の参照を渡す方法を教えてください。
ベストアンサー1
io.Reader
ストリームのように扱われます。このため、2 回読み取ることはできません。着信 TCP 接続を想像してください。着信したものを巻き戻すことはできません。
しかし、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))
}
編集:@mrclx が指摘したように、最初から読み取る必要がありますTeeReader
。そうしないと、バッファが空になります。