最常见的应该是使用 io/ioutil 包下的 io.WriteFile() 函数直接将响应写入到一个文件中

但是我们需要使用 ioutil.ReadAll(resp.Body) 先将所有的响应读出来放到内存中。如果文件太大,那么就会消耗很多内存。

io 包提供了 io.Copy() 方法,该方法实现了两个文件之间的拷贝。


func main() {
	//发起http请求
	res,err := http.Get("http://xxxxx.com")
	if err!=nil{
		log.Panicln(err)
		return
	}
	//关闭释放
	defer res.Body.Close()
	data,dataErr:=ioutil.ReadAll(res.Body)
	if dataErr !=nil{
		log.Println(dataErr)
		return
	}
	//存放请求回来的数据 用一个map接收
	result := make(map[string]interface{})
	if err :=json.Unmarshal(data,&result);err!=nil{
		log.Println(err)
		return
	}
	//根据结构数据格式 进行类型断言
	list := result["data"].([]interface{})
	for _,v := range list{
		//类型断言
		item :=  v.(map[string]interface{})
		////开启goroutine 下载图片
		go Download(item["coverImage"].(string))
	}

}
//下载网络图片 保存到本地指定路径
func Download(url string){
	//发起网络请求
	res,err:=http.Get(url)
	if err!=nil{
		log.Println(err)
		return
	}
	// defer 释放资源
	defer res.Body.Close()
	//定义文件名字
	path := strings.Split(url,"/")
	name := path[len(path)-1]
	//创建文件
	out,err:= os.Create("./static/img/"+name)
	if err!=nil{
		log.Println(err)
		return
	}
	// defer延迟调用 关闭文件,释放资源
	defer out.Close()
	//添加缓冲 bufio 是通过缓冲来提高效率。
	wt:=bufio.NewWriter(out)
	_,_=io.Copy(wt,res.Body)
	//将缓存的数据写入到文件中
	_=wt.Flush()
}

复制代码