画像を含む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
になります。
同じリーダーに複数の個別の参照を渡すにはどうすればよいですか?
io.Reader
はストリームのように扱われます。このため、二度読むことはできません。入ってくる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))
}
ReadAll
を呼び出すとバッファが空になるため、2番目の呼び出しは常に何も返しません。できることは、ReadAll
の結果を保存し、それを関数で再利用することです。例えば:
bytes, _ := ioutil.ReadAll(r);
log.Println(string(bytes))
@TheHippoの答えは正しいです私はこれを追加したいだけです(しかし、私は49の評判しか持っていないので追加できませんでした:(バッファは空になります。
技術的には、1人のリーダーで複数回読むことはできません。
これは2回印刷されます。
package main
import (
"io/ioutil"
"log"
"strings"
)
func main() {
r := strings.NewReader("some io.Reader stream to be read\n")
stringData, _ := ioutil.ReadAll(r)
log.Println(stringData)
log.Println(stringData)
}