什么是 pb?

pb是一个Go语言的终端进度条库。

什么时候需要pb?

终端显示的工具进行定时等待、IO传输等操作时,都可以用pb来显示当前进度。

pb入门

安装pb

  1. go get github.com/cheggaaa/pb/v3

快速上手

  1. package main
  2. import (
  3. "time"
  4. "github.com/cheggaaa/pb/v3"
  5. )
  6. func main() {
  7. count := 100000
  8. // 创建进度条并开始
  9. bar := pb.StartNew(count)
  10. for i := 0; i < count; i++ {
  11. bar.Increment()
  12. time.Sleep(50 * time.Microsecond)
  13. }
  14. // 结束进度条
  15. bar.Finish()
  16. }

我们可以看到如下的效果

  1. 47921 / 100000 [--------------------->______________________] 47.92% 13945 p/s

自定义进度条的方法

  1. // 创建进度条
  2. bar := pb.New(count)
  3. // 设置刷新速度(时间间隔)(默认为200毫秒)
  4. bar.SetRefreshRate(time.Second)
  5. // 强制设置io.Writer,默认为os.Stderr
  6. bar.SetWriter(os.Stdout)
  7. // 进度条将数字格式化为字节(B、KiB、MiB等)
  8. bar.Set(pb.Bytes, true)
  9. // 进度条使用SI字节前缀名称(B,kB)代替IEC(B,KiB)
  10. bar.Set(pb.SIBytesPrefix, true)
  11. // 设置自定义的进度条模板
  12. bar.SetTemplateString(myTemplate)
  13. // 设置模板后检查错误
  14. if err := bar.Err(); err != nil {
  15. return
  16. }
  17. // 进度条开始
  18. bar.Start()

IO操作的进度条

  1. package main
  2. import (
  3. "crypto/rand"
  4. "io"
  5. "io/ioutil"
  6. "github.com/cheggaaa/pb/v3"
  7. )
  8. func main() {
  9. var limit int64 = 1024 * 1024 * 500
  10. // 我们将把500MiB从/dev/rand复制到/dev/null
  11. reader := io.LimitReader(rand.Reader, limit)
  12. writer := ioutil.Discard
  13. // 开始进度条
  14. bar := pb.Full.Start64(limit)
  15. // 创建代理读取器
  16. barReader := bar.NewProxyReader(reader)
  17. // 从代理读取器复制
  18. io.Copy(writer, barReader)
  19. // 结束进度条
  20. bar.Finish()
  21. }

运行效果

  1. 258.07 MiB / 500.00 MiB [---------------->_______________] 51.61% 180.84 MiB p/s ETA 1s

自定义进度条模板

基于内置文本/模板包的渲染。您可以使用现有pb的元素,也可以创建自己的元素。

element.go 文件中描述了所有可用元素。

我们可以将下面这个例子带入到上面IO操作的进度条的DEMO中,这里就不展示效果了。

  1. tmpl := `{{ red "With funcs:" }} {{ bar . "<" "-" (cycle . "↖" "↗" "↘" "↙" ) "." ">"}} {{speed . | rndcolor }} {{percent .}} {{string . "my_green_string" | green}} {{string . "my_blue_string" | blue}}`
  2. // 开始基于我们的模板的进度条
  3. bar := pb.ProgressBarTemplate(tmpl).Start64(limit)
  4. // 设置字符串元素的值
  5. bar.Set("my_green_string", "green").Set("my_blue_string", "blue")

总结

pb可以帮助我们丰富Golang编写的终端工具,希望大家可以借此开发出更多实用且有趣的东西。
[

](https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/121298592)