这篇文章主要讲解了“go语言怎么实时显示下载进度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言怎么实时显示下载进度”吧!

本示例说明如何从网上将文件下载到本地计算机。通过io.Copy()直接使用并传递响应主体,我们将数据流式传输到文件中,而不必将其全部加载到内存中-小文件不是问题,但下载大文件时会有所不同。

packagemainimport("io""net/http""os")funcmain(){fileUrl:="http://topgoer.com/static/2/9.png"iferr:=DownloadFile("9.png",fileUrl);err!=nil{panic(err)}}//downloadfile会将url下载到本地文件,它会在下载时写入,而不是将整个文件加载到内存中。funcDownloadFile(filepathstring,urlstring)error{//Getthedataresp,err:=http.Get(url)iferr!=nil{returnerr}deferresp.Body.Close()//Createthefileout,err:=os.Create(filepath)iferr!=nil{returnerr}deferout.Close()//Writethebodytofile_,err=io.Copy(out,resp.Body)returnerr}

带进度条的大文件下载
下面的示例是带有进度条的大文件下载,我们将响应主体传递到其中,io.Copy()但是如果使用a,TeeReader则可以传递计数器来跟踪进度。在下载时,我们还将文件另存为临时文件,因此在完全下载文件之前,我们不会覆盖有效文件。

packagemainimport("fmt""io""net/http""os""strings""github.com/dustin/go-humanize")typeWriteCounterstruct{Totaluint64}func(wc*WriteCounter)Write(p[]byte)(int,error){n:=len(p)wc.Total+=uint64(n)wc.PrintProgress()returnn,nil}func(wcWriteCounter)PrintProgress(){fmt.Printf("\r%s",strings.Repeat("",35))fmt.Printf("\rDownloading...%scomplete",humanize.Bytes(wc.Total))}funcmain(){fmt.Println("DownloadStarted")fileUrl:="http://topgoer.com/static/2/9.png"err:=DownloadFile("9.png",fileUrl)iferr!=nil{panic(err)}fmt.Println("DownloadFinished")}funcDownloadFile(filepathstring,urlstring)error{out,err:=os.Create(filepath+".tmp")iferr!=nil{returnerr}resp,err:=http.Get(url)iferr!=nil{out.Close()returnerr}deferresp.Body.Close()counter:=&WriteCounter{}if_,err=io.Copy(out,io.TeeReader(resp.Body,counter));err!=nil{out.Close()returnerr}fmt.Print("\n")out.Close()iferr=os.Rename(filepath+".tmp",filepath);err!=nil{returnerr}returnnil}

感谢各位的阅读,以上就是“go语言怎么实时显示下载进度”的内容了,经过本文的学习后,相信大家对go语言怎么实时显示下载进度这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!