我们在Linux使用yum安装插件或手动安装包时,发现安装过程各种颜色和进度条很炫酷,它们是怎么实现的呢?快来一起学习打印一个炫酷的进度条吧!
一、知识储备
1. 字体属性
代码 | 功能 |
---|---|
\033[0m | 关闭所有属性 |
\033[1m | 设置高亮度 |
\033[4m | 下划线 |
\033[5m | 闪烁 |
\033[7m | 反显 |
\033[8m | 消隐 |
\033[30m -- \033[37m | 设置前景色 (字体色) |
\033[40m -- \033[47m | 设置背景色 |
2. 字体及背景颜色
颜色 | 字体色 | 背景色 |
---|---|---|
黑色 | 30 | 40 |
红色 | 31 | 41 |
绿色 | 32 | 42 |
黄色 | 33 | 43 |
蓝色 | 34 | 44 |
紫色 | 35 | 45 |
青色 | 36 | 46 |
白色 | 37 | 47 |
3. 光标控制
代码 | 功能 |
---|---|
\033[nA | 光标上移n行 |
\033[nB | 光标下移n行 |
\033[nC | 光标右移n行 |
\033[nD | 光标左移n行 |
\033[y;xH | 设置光标位置 |
\033[2J | 清空控制台 |
\033[K | 清除从光标到行尾的内容 |
\033[s | 保存光标位置 |
\033[u | 恢复光标位置 |
\033[?25l | 隐藏光标 |
\033[?25h | 显示光标 |
\r | 光标移动至行首 |
二、代码演示
1. 代码
package main
import
(
"fmt"
"time"
"sync"
)
var wg sync.WaitGroup
func main(){
fmt.Printf("===============================begin test ==============================\n")
time.Sleep(time.Second)
wg.Add(1)
go func(){
defer wg.Done()
fmt.Println()
total := 1000000
for i:=1;i<=total;i++{
/*do some task*/
cursorUp := 1
cursorDown := 1
fmt.Printf("\r\033[%dA\033[K\033[1;44;37mTask1:[%d/%d]\033[0m" +
"\033[%dB\r\033[K\033[1;43;31mTask2:[%d/%d]\033[0m",
cursorUp, i, total, cursorDown, i*2, total*2)
if i == total{
fmt.Printf("\r\033[%dA\033[K\033[4;42;37mTask1:[success]\033[0m" +
"\033[%dB\r\033[K\033[4;42;37mTask2:[success]\033[0m", cursorUp, cursorDown)
}
}
fmt.Println()
}()
/*do something*/
wg.Wait()
}
2. 结果展示
(1)运行中
(2)运行结束
3. for循环printf内容解析
(1) 首先 \r 使光标回到行首,\033[%dA 使光标上移一行,此时光标位于上一行行首。
(2) 使用\033[K清除光标到行尾的内容,为了防止以后的进度条信息长度不一导致结尾有上一行的显示遗留。
(3) \033[1;44;37m 设置高亮(默认为高亮,可不设置),蓝色背景,白色字体。
(4) Task1:[%d/%d] 输出进度1。
(5) \033[0m 还原设置的属性。
(6) \033[%dB\r 使光标下移一行并回到行首。
(7) 033[K 清空当前行,作用与第2步相同。
(8) \033[1;43;31m 设置高亮,黄色背景,红色字体。
(9) Task2:[%d/%d] 输出进度2。
(10) \033[0m 还原设置的属性。
(11) 循环以上操作。
(12) 达到最后一次循环,\033[4;42;37m 设置下划线,绿色背景,白色字体,打印success。