Golang命令行加载动画工具 - 一个有趣的小包
Golang命令行加载动画工具 - 一个有趣的小包
我厌倦了在应用中使用 fmt.Printf(".") 来显示进度,所以编写了一个简单的旋转指示器库。市面上已经有很多类似的库,但这个是属于我自己的,希望你喜欢!
falun/golang-progress
golang-progress - 这是一个用于终端的进度指示器。使用 Go 语言编写。

func main() {
fmt.Println("hello world")
}
更多关于Golang命令行加载动画工具 - 一个有趣的小包的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
太棒了!!!
干得漂亮,感谢分享……
更多关于Golang命令行加载动画工具 - 一个有趣的小包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个很实用的Go语言库!我来分析一下这个进度指示器的实现原理,并提供一个更完整的示例代码。
package main
import (
"fmt"
"time"
)
// Spinner 旋转指示器结构体
type Spinner struct {
frames []string
delay time.Duration
active bool
pos int
}
// NewSpinner 创建新的旋转指示器
func NewSpinner() *Spinner {
return &Spinner{
frames: []string{"⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"},
delay: 100 * time.Millisecond,
active: false,
pos: 0,
}
}
// Start 开始显示旋转动画
func (s *Spinner) Start() {
s.active = true
go func() {
for s.active {
fmt.Printf("\r%s 处理中...", s.frames[s.pos])
s.pos = (s.pos + 1) % len(s.frames)
time.Sleep(s.delay)
}
}()
}
// Stop 停止旋转动画
func (s *Spinner) Stop() {
s.active = false
fmt.Printf("\r%s 完成!\n", "✓")
}
func main() {
spinner := NewSpinner()
fmt.Println("开始执行任务...")
spinner.Start()
// 模拟耗时任务
time.Sleep(3 * time.Second)
spinner.Stop()
fmt.Println("任务执行完毕")
}
这个实现包含了旋转动画的核心功能:
- 动画帧管理:使用Unicode字符创建流畅的旋转效果
- 并发控制:在goroutine中运行动画,不影响主程序执行
- 光标控制:使用
\r回车符实现原地更新 - 状态管理:通过
active标志控制动画启停
还可以扩展更多功能:
// 带百分比显示的进度条
type ProgressBar struct {
total int
current int
width int
}
func NewProgressBar(total int) *ProgressBar {
return &ProgressBar{
total: total,
width: 50,
}
}
func (p *ProgressBar) Update(current int) {
p.current = current
percent := float64(current) / float64(p.total)
filled := int(percent * float64(p.width))
bar := "["
for i := 0; i < p.width; i++ {
if i < filled {
bar += "="
} else {
bar += " "
}
}
bar += "]"
fmt.Printf("\r%s %.1f%% (%d/%d)", bar, percent*100, current, p.total)
}
这个库的设计很好地解决了命令行应用中的进度显示需求,比简单的fmt.Printf(".")更加优雅和用户友好。

