TCP
在这里,说一下我在实现该进度条功能时的一些思路。
成果演示先看一下最终的成品效果展示:
该进度条一共分三部分组成,第一部分是主体进度条,第二部分是百分比,第三部分是当前完成的数据和总数据的一个动态展示。
源码分析fmt.Printf\r
type Bar struct {
percent int64 //百分比
cur int64 //当前进度位置
total int64 //总进度
rate string //进度条
graph string //显示符号
}
curtotalratestringgraph#=@
初始化
NewOptionNewOptionWithGraphNewOption
func (bar *Bar) NewOption(start, total int64) {
bar.cur = start
bar.total = total
if bar.graph == "" {
bar.graph = "█"
}
bar.percent = bar.getPercent()
for i := 0; i < int(bar.percent); i += 2 {
bar.rate += bar.graph //初始化进度条位置
}
}
starttotaltotalstart0start0starti += 201002%getPercentcurtotal
func (bar *Bar) getPercent() int64 {
return int64(float32(bar.cur) / float32(bar.total) * 100)
}
graph
func (bar *Bar) NewOptionWithGraph(start, total int64, graph string) {
bar.graph = graph
bar.NewOption(start, total)
}
进度条展示
那么,如何实现显示功能呢?
一般调用显示进度条时,都是放在循环中执行的,因此,我们只需要在循环中能够展示出每轮循环当前的进度状态即可。
func (bar *Bar) Play(cur int64) {
bar.cur = cur
last := bar.percent
bar.percent = bar.getPercent()
if bar.percent != last && bar.percent%2 == 0 {
bar.rate += bar.graph
}
fmt.Printf("\r[%-50s]%3d%% %8d/%d", bar.rate, bar.percent, bar.cur, bar.total)
}
fmt.Printf\rrate21001%
结束
Finish
func (bar *Bar) Finish(){
fmt.Println()
}
如何调用
Bar
func main(){
var bar progressbar.Bar
bar.NewOption(0, 100)
for i:= 0; i<=100; i++{
time.Sleep(100*time.Millisecond)
bar.Play(int64(i))
}
bar.Finish()
}
以上是一个最简单的调用,其运行效果如下所示:
当然了,你也可以使用另一个初始化函数指定显示的图标,如下所示:
bar.NewOptionWithGraph(0, 100, "#")
展示效果则如下所示:
time.Sleep(100*time.Millisecond)