http下载文件的实质就是在响应体中拿到响应数据并写入到文件的操作,第二种形式是实现了一个实时显示下载进度的性能
package mainimport ( "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(){ //下载文件url url := "https://i1.hdslb.com/bfs/face/0d2f52b9e1dae83b2cd710b38ee911533db32774.jpg" //下载后保留的文件名 fileName := "example.png" //downloadFile(url, fileName) DownloadFileProgress(url, fileName)}