gpt4 book ai didi

image - 在 Go 中传递响应主体 (response.Body) 的有效方法是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 03:33:17 25 4
gpt4 key购买 nike

如果我有一些代码(如下例)从链接中获取图像,然后将其保存到磁盘,传递图像数据的最佳方式是什么?

我考虑过使用 ioutil.ReadAll(res.Body) 将其转换为 []byte 但传递它似乎很昂贵,虽然我无法分辨文档是否返回 slice 或数组。我还尝试返回一个指向 res.Body 的指针,一个 *io.ReadCloser 类型,但我不知道如何正确调用 .Close( ) 指向接口(interface)上的方法。

我知道将保存代码移动到 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 的新手,所以如果这段代码中有任何看起来不好的地方,请告诉我。

最佳答案

使用ioutil.ReadAll .该函数返回一段字节。

slice 可以高效传递。 slice 是指向支持数组的指针、长度和容量。

type ImageData struct {
Data []byte
Name string
}

func FetchImage(url string) ([]byte, error) {
res, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if res.StatusCode != 200 {
return nil, fmt.Errorf("%s: %d", url, res.StatusCode)
}
return ioutil.ReadAll(resp.Body)
}

func Save(data *ImageData) error {
file, err := os.Create(data.Name)
if err != nil {
return err
}
defer file.Close()
_, err := file.Write(data.Data)
return err
}

您也可以绕过响应主体,但要小心。必须关闭响应主体以释放底层连接。问题中的代码确实关闭了响应体,但很难看到,因为响应体是在关闭的地方传递给函数的。

关于image - 在 Go 中传递响应主体 (response.Body) 的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com