Golang命令行加载动画工具 - 一个有趣的小包

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

GitHub

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("任务执行完毕")
}

这个实现包含了旋转动画的核心功能:

  1. 动画帧管理:使用Unicode字符创建流畅的旋转效果
  2. 并发控制:在goroutine中运行动画,不影响主程序执行
  3. 光标控制:使用\r回车符实现原地更新
  4. 状态管理:通过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(".")更加优雅和用户友好。

回到顶部