下载文件并显示进度

参考文档: https://juejin.cn/post/7176452708704976953

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

type MyDownloader struct {
	io.Reader
	Total   int64
	Current int64
}

func (d *MyDownloader) Read(p []byte) (n int, err error) {
	n, err = d.Reader.Read(p)

	d.Current += int64(n)
	fmt.Printf("\ncurrent download, download process: %.2f%%", float64(d.Current*10000/d.Total)/100)
	if d.Current == d.Total {
		fmt.Printf("\ndownload finish, download process: %.2f%%", float64(d.Current*10000/d.Total)/100)
	}

	return
}

func downloadFile(url, filePath string) {
	resp, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	file, err := os.Create(filePath)
	if err != nil {
		panic(err)
	}
	defer file.Close()
	myDownloader := &MyDownloader{
		Reader: resp.Body,
		Total:  resp.ContentLength,
	}
	if _, err := io.Copy(file, myDownloader); err != nil {
		panic(err)
	}
}

func main() {
	url := "http://wl.wldev.com:9001/api/ng-server/fs/raw/vscode/4.18.0_linux_amd64/code-server.tar.gz?ngScope=app-store&auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDE0OTc0ODgsImlhdCI6MTcwMTQxMTA4OCwiaXNzIjoid2wiLCJhdXRoRGF0YSI6eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9fQ.yvYDZrU-LGWZPAeFtKxs75sOaAS4ahKvvKAujU-K35Y&timestamp=1701427439151"
	filename := "./wegame.zip"
	downloadFile(url, filename)
}