Golangで処理を書いている時、特に時間がかかる処理の場合、進捗がどのくらい進んでいるのかを知りたい時がありますよね。そんな時使うのがプログレスバーだったりするわけですが、いい感じで利用できるパッケージがないか探してみると思いの外見つかったので3つリストアップしてみました!
リストアップするだけだと味気ないのでfor文を回す処理を利用してそれぞれ出力してみました。
マルチプログレスバーについての記事も書いているので興味のある方はこちらも是非!
Golangでマルチプログレスバーを表示したい!!
pb
今回紹介する3つの中でスター数が2.7kと一番多い人気のパッケージです。人気なだけあって柔軟性が高そうな印象を受けました。
以下のコマンドでインストールできます。
go get github.com/cheggaaa/pb/v3
pbをインストールして以下のサンプルを実行してみました。
package main
import (
"time"
"github.com/cheggaaa/pb/v3"
)
func main() {
count := 100
bar := pb.Simple.Start(count)
bar.SetMaxWidth(80)
for i := 0; i < count; i++ {
bar.Increment()
time.Sleep(time.Millisecond * 30)
}
bar.Finish()
}
動かした結果がこれ。
uiprogress
同時に複数の進行状況バーをレンダリングでき、また、新しく処理が追加された場合でも追加の進行状況バーを追加できるようです。
以下のコマンドでインストールできます。
go get -v github.com/gosuri/uiprogress
uiprogressをインストールして以下のサンプルを使って実行してみました。
package main
import (
"time"
"github.com/gosuri/uiprogress"
)
func main() {
count := 100
uiprogress.Start()
bar := uiprogress.AddBar(count)
bar.AppendCompleted()
bar.PrependElapsed()
for bar.Incr() {
time.Sleep(time.Millisecond * 20)
}
}
実行結果がこれ。
progressbar
OSに依存せず利用できる、非常にシンプルなスレッドセーフなプログレスバーと言う謳い文句で案内されています。
以下のコマンドでインストールできます。
go get -u github.com/schollz/progressbar
progressbarをインストールして以下のサンプルを使って実行してみました。
package main
import (
"time"
"github.com/schollz/progressbar"
)
func main() {
count := 100
count64 := int64(count)
bar := progressbar.Default(count64)
for i := 0; i < count; i++ {
bar.Add(1)
time.Sleep(40 * time.Millisecond)
}
}
実行するとこんな感じ
まとめ
個人的に、使い心地と見た目でpbが好みでした。
これ採用して早速実装してみます!