---
# System prepended metadata

title: Progressbar
tags: [Golang Package]

---

###### tags: `Golang Package`

# Progressbar

## Intro
就是一個bra條。

![](https://i.imgur.com/ASmLKeT.png)


### Useage 1 
有已知長度的預設進度條
``` go=

	bar := progressbar.Default(100)
	for i := 0; i < 100; i++ {
		bar.Add(1)
		time.Sleep(40 * time.Millisecond)
	}

```
![](https://i.imgur.com/ZeJHbPi.gif)


### Useage 2

無已知長度的進度條，只需將參數設為 -1

``` go= 
	bar := progressbar.Default(-1)
	for i := 0; i < 100; i++ {
		bar.Add(1)
		time.Sleep(40 * time.Millisecond)
	}
```

![](https://i.imgur.com/jztuCWM.gif)


### 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://i.imgur.com/OzTeQAY.gif)



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("筆"),
            )

```
![](https://i.imgur.com/MNyPRrr.gif)




{%hackmd theme-dark %}