引言

大家好,我是jony。

最近在工作中写一个批处理脚本,令人抓狂的是每次都不知道脚本要跑到啥时候结束,于是想到给程序添加个进度条。

逛了一圈,没找到特别趁手的轮子,本着有手就行的原则,今天简单地给大家撸一个终端进度条。

原理

\r
\n

上才艺

首先从核心功能出发,进度条要告诉我的信息有

  • 一共要完成多少任务
  • 现在完成了多少任务
  • 到什么时候才能完成全部任务
[█████████████████████████]100/100 [eta]16:33:39

抽象的用户调用函数有3个

New()Done()Finish()

是不是和sync.WaitGroup很像。

调用代码大概长这样:

所以根据用户调用需求,首先定义进度条结构体。

然后根据用户调用的函数,给出函数实现,当然这里面加了一些函数参数可选项。

可以在初始化实例的时候自定义一些元素,比如填充字符,比如时间格式或者是每隔多少时间刷新一次进度条等等。

那么处理完了用户怎么使用之后,我们就来开始处理怎么给用户展示进度条效果。

要想根据进度填充不同的字符比例,先算进度百分比,长下面这样子。

因为我们进度条并不需要那么精确,所有这里都用的是整数来处理,更方便一些,不用做各种类型转换。

接下来算任务什么时候完成,这里用的算法是,用当前完成了多少个任务和花了多少时间来估算总任务数的要花费多少时间,得到预计什么时候完成,代码是这样子的:

QPS
[█████████████████████████]100/100 [eta]16:33:39 [qps]9

当然,为了更酷炫一点,同时还引入了emoji字符,能够根据字符自适应地调整显示效果。

下面是项目github地址,供大家参考

知识点总结

下面是知识点总结

\rtime.NewTicker()