使用 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)
    }
}