如何将下面的代码转换为使用流/管道,这样我就不需要将全部内容读入内存?

package main
import ("net/http";"io/ioutil")

func main() {
        resp, err := http.Get("http://example.com/")
        check(err)
        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        check(err)
        err = ioutil.WriteFile("./data.txt", body, 0666)
        check(err)
}
func check(e error) {
        if e != nil {
                panic(e)
        }
}

推荐答案

io.Copy()怎么样?其文件可在以下网址找到:http://golang.org/pkg/io/#Copy

不过这很简单.给它一个io.Reader和一个io.Writer,它会复制数据,一次复制一小块(例如,不是一次在内存中复制所有数据).

因此,您可以try 编写类似以下内容的代码:

func main() {
  resp, err := http.Get("...")
  check(err)
  defer resp.Body.Close()
  out, err := os.Create("filename.ext")
  if err != nil {
    // panic?
  }
  defer out.Close()
  io.Copy(out, resp.Body)
}

我还没有测试过上面的内容;我只是从上面的示例中快速地将它们组合在一起,但如果不是在金钱上,它应该是很接近的.

Go相关问答推荐

获取k8s群集作用域运算符的命名空间

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

如何描述OpenAPI规范中围棋的数据类型.JSON?

在Uber FX中实现后台进程正常关闭的正确方式是什么?

CURL和Postman HTTP POST工作,但Golang请求失败,状态为400

如何用Golang解码这个嵌套的json?

Go 中将 int 切片转换为自定义 int 切片指针类型的函数

如何在golang中使用viper获取对象的配置数组?

使用反射在Go中递归迭代 struct 体和集合字段

如何忽略打印达到最大深度限制 go colly

如何使用 GolangCI 删除未使用的导入

如何使用 go 包设置标头键和值:shurcooL/graphql 或 hasura/go-graphql-client?

Go:如何在将 float64 转换为 float32 时判断精度损失

也许在 golang 中包(字符串和字符串类型不匹配)

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

仅在工作日运行 cron

将 .gz 文件添加到 tar.gz 文件,但在添加之前解码 gz.输出文件被剪辑(损坏)

golang pic.ShowImage 为什么它不生成图像而是向我发送base64值

如何根据 Go 中第二次出现的分隔符拆分字符串?

如何迭代在泛型函数中传递的片的并集?