如果我有一些代码,例如下面的示例,它从链接中获取图像然后将其保存到磁盘,那么传递图像数据的最佳方法是什么?
我想过使用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)
}
}
此外,我对 Go 很陌生,所以如果这段代码中有任何看起来不好的地方,请告诉我。
子衿沉夜
Cats萌萌
相关分类