リンクから画像を取得してディスクに保存するコードを以下のように作成した場合、画像データを渡す最も良い方法は何ですか?Goで応答本体(response.Body)を渡す効率的な方法は何ですか?
ioutil.ReadAll(res.Body)
を使用して[]byte
に変換すると思っていましたが、ドキュメントからスライスまたは配列が返されるかどうかはわかりませんが、それを渡すのは高価なようです。私もres.Body
、*io.ReadCloser
タイプへのポインタを返そうとしましたが、指摘されたインターフェイスの.Close()
メソッドを正しく呼び出す方法を理解できませんでした。
保存コードをFetchImage
に移動すると、これを解決するのが最も簡単な方法ですが、可能であればこれらの部分を別々にしたいと思います。
type ImageData struct {
Data io.ReadCloser
Name string
}
func FetchImage(url string) (io.ReadCloser, error) {
res, err := http.Get(url)
if err != nil {
return nil, err
}
return res.Body, nil
}
func Save(data *ImageData) error {
defer data.Data.Close()
file, err := os.Create(data.Name)
defer file.Close()
if err != nil {
return err
}
_, err = io.Copy(file, data.Data)
if err != nil {
return err
}
return nil
}
func main() {
body, err := fetcher.FetchImage("https://imgur.com/asdf.jpg")
if err != nil {
panic(err)
}
imageData := ImageData{body, "asdf.jpg"}
saver := Saver{config.BaseDir, 1}
err = saver.Save(&imageData)
if err != nil {
panic(err)
}
}
さらに、私はこのコードに悪いように見えるものがあれば、非常に新しいです。私に知らせてください。
お返事ありがとうございます。しかし、少し冗長ではありません。なぜなら、res.Bodyがすでにそのインターフェースを満たしているときに、新しいReaderをio.Copyに渡す必要があるからです。 – Wilfred
io.Copyを使用する代わりに直接書き込みを書き込みます。 'file.Write(data)' –