进度条
这是一个非常简单的线程安全进度条,应该可以在所有操作系统上正常工作。我为croc需要一个进度条,但尝试过的所有方案都存在问题,所以我自己开发了一个。为了保持操作系统的通用性,我不打算支持多行输出。
安装
go get -u github.com/schollz/progressbar/v3
使用
基本用法
bar := progressbar.Default(100)
for i := 0; i < 100; i++ {
bar.Add(1)
time.Sleep(40 * time.Millisecond)
}
效果如下:
I/O 操作
progressbar
实现了io.Writer
接口,因此它可以自动检测写入流的字节数,所以你可以将它用作io.Reader
的进度条。
req, _ := http.NewRequest("GET", "https://dl.google.com/go/go1.14.2.src.tar.gz", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
f, _ := os.OpenFile("go1.14.2.src.tar.gz", os.O_CREATE|os.O_WRONLY, 0644)
defer f.Close()
bar := progressbar.DefaultBytes(
resp.ContentLength,
"downloading",
)
io.Copy(io.MultiWriter(f, bar), resp.Body)
效果如下:
未知长度的进度条
未知长度的进度条实际上是一个旋转器。任何长度为-1的进度条都会自动转换为可自定义类型的旋转器。例如,上面的代码可以将resp.ContentLength
设置为-1
来运行。
效果如下:
自定义
你可以进行很多自定义设置 - 更改输出器、颜色、宽度、描述、主题等。查看所有选项。
bar := progressbar.NewOptions(1000,
progressbar.OptionSetWriter(ansi.NewAnsiStdout()), //你需要安装 "github.com/k0kubun/go-ansi"
progressbar.OptionEnableColorCodes(true),
progressbar.OptionShowBytes(true),
progressbar.OptionSetWidth(15),
progressbar.OptionSetDescription("[cyan][1/3][reset] 正在写入可修改文件..."),
progressbar.OptionSetTheme(progressbar.Theme{
Saucer: "[green]=[reset]",
SaucerHead: "[green]>[reset]",
SaucerPadding: " ",
BarStart: "[",
BarEnd: "]",
}))
for i := 0; i < 1000; i++ {
bar.Add(1)
time.Sleep(5 * time.Millisecond)
}
效果如下:
贡献
欢迎提交 Pull 请求。随时可以...
- 修改文档
- 添加新功能
- 修复 bug
- 提出改进建议
致谢
感谢 @Dynom 在 2.0 版本中做出的巨大改进!
感谢 @CrushedPixel 添加了描述和颜色代码支持!
感谢 @MrMe42 添加了一些小功能!
感谢 @tehstun 提交了一些很棒的 PR!
感谢 @Benzammour 和 @haseth 帮助创建了 v3!
感谢 @briandowns 编译了旋转器列表。
许可证
MIT