TCP

在这里,说一下我在实现该进度条功能时的一些思路。

成果演示

先看一下最终的成品效果展示:
进度条.gif

该进度条一共分三部分组成,第一部分是主体进度条,第二部分是百分比,第三部分是当前完成的数据和总数据的一个动态展示。

源码分析
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()
}

以上是一个最简单的调用,其运行效果如下所示:
进度条.gif
当然了,你也可以使用另一个初始化函数指定显示的图标,如下所示:

bar.NewOptionWithGraph(0, 100, "#")

展示效果则如下所示:
进度条5.gif

time.Sleep(100*time.Millisecond)