使用 Go 语言下载一个文件,大家一般会怎么做呢,比如,我们要下载 https://www.twle.cn/static/i/img1.jpg 这张图片。
net/httphttp.Get()
代码一般如下
package main import ( "net/http" ) func main() { imgUrl := "https://www.twle.cn/static/i/img1.jpg" // Get the data resp, err := http.Get(imgUrl) if err != nil { return err } defer resp.Body.Close() }
但接下来呢 ? 实现方式就有很多了
io/ioutilio.WriteFile()
package main import ( "io/ioutil" "net/http" ) func main() { imgUrl := "https://www.twle.cn/static/i/img1.jpg" // Get the data resp, err := http.Get(imgUrl) if err != nil { panic(err) } defer resp.Body.Close() data, err := ioutil.ReadAll(resp.Body) if err != nil { panic(err) } ioutil.WriteFile("img1.jpg", data, 0644) }
ioutil.ReadAll(resp.Body)
ioio.Copy()
io.Copy() 方法
io.Copy()
func Copy(dst Writer, src Reader) (written int64, err error)
io.Copy()srcdstsrc
有了这个函数,我们就省去了先把内容读取到内存,然后将内存中的内容写到文件的过程,于是,我们的代码就可以改成如下方式
package main import ( "io" "net/http" "os" ) func main() { imgUrl := "https://www.twle.cn/static/i/img1.jpg" // Get the data resp, err := http.Get(imgUrl) if err != nil { panic(err) } defer resp.Body.Close() // 创建一个文件用于保存 out, err := os.Create("img1.jpg") if err != nil { panic(err) } defer out.Close() // 然后将响应流和文件流对接起来 _, err = io.Copy(out, resp.Body) if err != nil { panic(err) } }