The essence of HTTP download file is to get the response data in the response body and write it to the file. The second way is to implement a real-time display of download progress function

package main import ( "fmt" "io" "net/http" "os" ) func downloadFile(url, fileName string) { resp, err := http.Get(url) if err ! = nil { panic(err) } defer func() {_ = resp.Body.Close()}() file, err := os.Create(fileName) if err ! = nil { panic(err) } defer file.Close() n, err := io.Copy(file, resp.Body) fmt.Println(n, err) } type Reader struct { io.Reader Total int64 Currnet int64 } func (r *Reader) Read(p []byte) (n int, err error) { n, err = r.Reader.Read(p) r.Currnet += int64(n) fmt.Printf("\r %.2f%%", float64(r.Currnet * 10000 / r.Total) / 100) return } func DownloadFileProgress(url, fileName string){ resp, err := http.Get(url) if err ! = nil { panic(err) } defer func() {_ = resp.Body.Close()}() file, err := os.Create(fileName) if err ! = nil { panic(err) } defer file.Close() reader := &Reader{ Reader: resp.Body, Total: resp.ContentLength, } io.Copy(file, Reader)} func main () {/ / download file url: url = "https://i1.hdslb.com/bfs/face/0d2f52b9e1dae83b2cd710b38ee911533db32774.jpg" // DownloadFile (url, fileName) DownloadFileProgress(url, fileName)}