###### tags: `Golang Package`
# Progressbar
## Intro
就是一個bra條。

### Useage 1
有已知長度的預設進度條
``` go=
bar := progressbar.Default(100)
for i := 0; i < 100; i++ {
bar.Add(1)
time.Sleep(40 * time.Millisecond)
}
```

### Useage 2
無已知長度的進度條,只需將參數設為 -1
``` go=
bar := progressbar.Default(-1)
for i := 0; i < 100; i++ {
bar.Add(1)
time.Sleep(40 * time.Millisecond)
}
```

### Usecase 3
可使用於下載檔案的場景,會顯示相應的下載速度,由resp提供長度,如無法得知長度,可使用Useage 2的方法
``` go=
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()
bar := progressbar.DefaultBytes(
resp.ContentLength,
"downloading",
)
io.Copy(io.MultiWriter(bar), resp.Body)
```

https://github.com/schollz/progressbar
### Usecase 4
自訂進度條,可自訂項目如下所示
``` go=
// 設置寬度
OptionSetWidth(100)
// 未知長度的圖案顯示類型 0~75可選 ex:⦿、▹▹▹▹▸
OptionSpinnerType(int)
// 進度條樣式
OptionSetTheme(Theme{
// 進度條已完成的部分,顏色部分就是colorstring
Saucer: "[red]-[reset]",
// 進度條的頭
SaucerHead: "[red]>[reset]",
// 進度條還沒到的地方的樣式
SaucerPadding: " ",
// 進度條左邊框框
BarStart: "<",
// 進度條右邊框框
BarEnd: ">",
})
// 設置進度條是否可見 false:不可見
OptionSetVisibility(bool)
// 自適應最大長度,建議使用,否則當進度條寬度大於終端視窗時會出現進度條殘影
OptionFullWidth()
// 設置輸出樣式,沒感覺有什麼特別用處,可輸入os.Stderr / 預設os.Stdout
OptionSetWritter(io.writer)
// 是否要顯示0%的bar條
OptionSetRenderBlankState(bool)
// 設置bar條前的敘述
OptionSetDescription(string)
// 是否要啟用bar條顏色,colorstring
OptionEnableColorCodes(bool)
// 是否要顯示預測時間
OptionSetPredictTime(bool)
// 顯示 當前數/總數
OptionShowCount()
// 顯示每秒運行次數
OptionShowIts()
// 顯示每秒運行的單位, ex:筆/s、個/s
OptionSetItsString(string)
// bar條更新的間隔時間
OptionThrottle(time.Duration)
// 完成時清除bar條,有bug 沒用
OptionClearOnFinish()
// 完成後調用指定函式
OptionOnCompletion(func())
// 是否顯示Byte進度 (0.125 kB/s)
OptionShowBytes(bool)
// 使用ANSICode,用途不明
OptionUseANSICodes(bool)
```
額外補充[Colorstring](https://github.com/mitchellh/colorstring)
有以上自訂項目,就可以做到以下顯示
``` go=
bar := progressbar.NewOptions64(length,
//progressbar.OptionSetWriter(),
// 是否要顯示顏色
progressbar.OptionEnableColorCodes(true),
// 設置bar條長度
progressbar.OptionSetWidth(50),
// 設置title
progressbar.OptionSetDescription("正在轉換資料中..."),
// 設置bar條樣式
progressbar.OptionSetTheme(progressbar.Theme{
// 進度條樣式
Saucer: "[yellow]-[reset]",
// 進度條的頭
SaucerHead: "[yellow]─=≡Σ((つ•̀ω•́)つ[reset]",
// 進度條還沒到的地方的樣式
SaucerPadding: " ",
// 進度條左邊框框
BarStart: "[",
// 進度條右邊框框
BarEnd: "]",
}),
progressbar.OptionFullWidth(),
progressbar.OptionShowIts(),
progressbar.OptionSetItsString("筆"),
)
```

{%hackmd theme-dark %}