Go 插件每日推荐之 spinner | Go 主题月

1,305 阅读3分钟

大家好,我是 @洛竹

本文首发于 洛竹的官方网站

本文同步于公众号『洛竹早茶馆』,转载请联系作者。

创作不易,养成习惯,素质三连!

spinner 是一个简单的包,可以向任何终端应用程序中添加一个 spinner /progress 指示器。可以在下面找到示例,也可以在 examples 目录中找到完整的示例。

有关该库及其功能的更多详细信息,请在安装后参考本地的 godoc。

安装

go get github.com/briandowns/spinner

可用的字符集

(由其切片索引编号)

索引字符集GIF
0←↖↑↗→↘↓↙Sample Gif
1▁▃▄▅▆▇█▇▆▅▄▃▁1.gif
2▖▘▝▗2.gif
3┤┘┴└├┌┬┐3.gif
4◢◣◤◥4.gif
5◰◳◲◱5.gif
6◴◷◶◵6.gif
7◐◓◑◒7.gif
8.oO@*Sample Gif
9|/-\9.gif
10◡◡⊙⊙◠◠10.gif
11⣾⣽⣻⢿⡿⣟⣯⣷Sample Gif
12>))'> >))'> >))'> >))'> >))'> <'((< <'((< <'((<Sample Gif
13⠁⠂⠄⡀⢀⠠⠐⠈13.gif
14⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏14.gif
15abcdefghijklmnopqrstuvwxyz15.gif
16▉▊▋▌▍▎▏▎▍▌▋▊▉16.gif
17■□▪▫17.gif
18←↑→↓18.gif
19╫╪19.gif
20⇐⇖⇑⇗⇒⇘⇓⇙Sample Gif
21⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈21.gif
22⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈Sample Gif
23⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁Sample Gif
24⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋24.gif
25ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン25.gif
26. .. ...26.gif
27▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▏▎▍▌▋▊▉█▇▆▅▄▃▂▁27.gif
28.oO°Oo.28.gif
29+x29.gif
30v<^>30.gif
31>>---> >>---> >>---> >>---> >>---> <---<< <---<< <---<< <---<< <---<<Sample Gif
32| || ||| |||| ||||| |||||| ||||| |||| ||| || |Sample Gif
33[] [=] [==] [===] [====] [=====] [======] [=======] [========] [=========] [==========]Sample Gif
34(*---------) (-*--------) (--*-------) (---*------) (----*-----) (-----*----) (------*---) (-------*--) (--------*-) (---------*)34.gif
35█▒▒▒▒▒▒▒▒▒ ███▒▒▒▒▒▒▒ █████▒▒▒▒▒ ███████▒▒▒ ██████████35.gif
36[ ] [=> ] [===> ] [=====> ] [======> ] [========> ] [==========> ] [============> ] [==============> ] [================> ] [==================> ] [===================>]36.gif
37🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛37.gif
38🕐 🕜 🕑 🕝 🕒 🕞 🕓 🕟 🕔 🕠 🕕 🕡 🕖 🕢 🕗 🕣 🕘 🕤 🕙 🕥 🕚 🕦 🕛 🕧38.gif
39🌍 🌎 🌏39.gif
40◜ ◝ ◞ ◟40.gif
41⬒ ⬔ ⬓ ⬕41.gif
42⬖ ⬘ ⬗ ⬙42.gif
43[>>> >] []>>>> [] [] >>>> [] [] >>>> [] [] >>>> [] [] >>>>[] [>> >>]43.gif

特性

  • 开始
  • 停止
  • 重启
  • 反转方向
  • 更新 spinner 字符集
  • 更新 spinner 速度
  • 前缀或者后缀文字
  • 修改 spinner 颜色、背景色和文字属性
  • 获取 spinner 状态
  • 链,管道,重定向输出
  • 在 spinner 完成时输出最终字符串

示例

package main

import (
	"github.com/briandowns/spinner"
	"time"
)

func main() {
	s := spinner.New(spinner.CharSets[9], 100*time.Millisecond)  // 构建新的 spinner
	s.Start()                                                    // 开始
	time.Sleep(4 * time.Second)                                  // 模拟真实的工作
	s.Stop()
}

更新字符集并重启 spinner

s.UpdateCharSet(spinner.CharSets[1])  // 用不同的字符集更新 spinner
s.Restart()                           // 重启 spinner
time.Sleep(4 * time.Second)
s.Stop()

更新旋转速度并重新启动微调器

s.UpdateSpeed(200 * time.Millisecond) // 更新 spinner 转动的速度
s.Restart()
time.Sleep(4 * time.Second)
s.Stop()

反转 spinner 旋转的方向

s.Reverse() // 反转 spinner 旋转的方向
s.Restart()
time.Sleep(4 * time.Second)
s.Stop()

提供你自己的 spinner

或者给我发送一个 issue 或者 pull request 添加到项目里。

someSet := []string{"+", "-"}
s := spinner.New(someSet, 100*time.Millisecond)

spinner 的前缀和后缀文字

s.Prefix = "prefixed text: " // spinner 前缀
s.Suffix = "  :appended text" // spinner 后缀

设置或改变 spinner 的颜色

默认颜色是 white。spinner 需要重启来应用改变。

s.Color("red") // 设置 spinner 颜色为 red

您可以同时指定背景色和前景色,以及其他属性,例如 bold underline

s.Color("red", "bold") // Set the spinner color to a bold red 设置 spinner 为粗体红色

或将背景设置为黑色,将前景设置为粗体红色:

s.Color("bgBlack", "bold", "fgRed")

下面是完整的 color 和属性列表:

// default colors
red
black
green
yellow
blue
magenta
cyan
white

// attributes
reset
bold
faint
italic
underline
blinkslow
blinkrapid
reversevideo
concealed
crossedout

// foreground text
fgBlack
fgRed
fgGreen
fgYellow
fgBlue
fgMagenta
fgCyan
fgWhite

// foreground Hi-Intensity text
fgHiBlack
fgHiRed
fgHiGreen
fgHiYellow
fgHiBlue
fgHiMagenta
fgHiCyan
fgHiWhite

// background text
bgBlack
bgRed
bgGreen
bgYellow
bgBlue
bgMagenta
bgCyan
bgWhite

// background Hi-Intensity text
bgHiBlack
bgHiRed
bgHiGreen
bgHiYellow
bgHiBlue
bgHiMagenta
bgHiCyan
bgHiWhite

生成数字序列

setOfDigits := spinner.GenerateNumberSequence(25)  // 生成25位数字的字符串
s := spinner.New(setOfDigits, 100*time.Millisecond)

获取 spinner 状态

fmt.Println(s.Active())

Unix管道和重定向

dekz 建议并撰写的功能

将 Spinner Writer 设置为 Stderr 可以增强向链,管道或重定向输出的功能,从而向用户显示进度。

这是此时设置 Writer 的首选方法。

s := spinner.New(spinner.CharSets[11], 100*time.Millisecond, spinner.WithWriter(os.Stderr))
s.Suffix = " Encrypting data..."
s.Start()
// Encrypt the data into ciphertext
fmt.Println(os.Stdout, ciphertext)
> myprog encrypt "Secret text" > encrypted.txt
⣯ Encrypting data...
> cat encrypted.txt
1243hjkbas23i9ah27sj39jghv237n2oa93hg83

最终字符串输出

spinner/indicator 完成后添加其他输出。最终输出字符串可以是多行的,并将被写入配置了 io.Writer 的任何地方。

s := spinner.New(spinner.CharSets[9], 100*time.Millisecond)
s.FinalMSG = "Complete!\nNew line!\nAnother one!\n"
s.Start()                 
time.Sleep(4 * time.Second)
s.Stop()                   

输出:

Complete!
New line!
Another one!