golang实现简易的进度条

首先了解两个转义字符:\r\n

  • \r: Carriage Return (回车键,缩写CR),表示回到行首
  • \n: Line Feed (换行键)
    你可能在http报文中了解过CR、LF这两个符号,他们组合起来\r\n代表报文中的换行。在windows系统里文件的换行也是<回车>+<换行>的组合,Unix系统中一般是\n

稍微多扯了两句,回到正题,\r的作用是回到行首(当前行),如果有多个输入存在的情况下,就会导致原有字符被覆盖,用代码解释一下可能更好理解。

package main

import (
    "fmt"
)

func main() {
    fmt.Printf("abcdefg\r")
    fmt.Printf("hij")
}
// 输出结果:  hijdefg

这段代码只打印了一行字符串,hijdefg。原理很简单,\r使输入光标回到了行首,第二次打印的字符会依次覆盖对应长度的字符。

图片.png

简易进度条

简易的进度条的实现方式就是利用回车符,不断覆盖原来打印的结果,给人造成一种在加载的感觉。
直接上代码,师傅们可以自己本地尝试一下。

package main

import (
    "fmt"
    "time"
)

func main() {
    for _, r := range `-\|/-\|/-\|/-\|/` {
        fmt.Printf("\r%c", r)
        time.Sleep(100 * time.Millisecond)
    }
    fmt.Printf(" \r") // 使用空格覆盖掉最后输出的字符

    for i := 0; i < 5; i++ {
        fmt.Printf("   \r") // 使用空格覆盖掉3个"."
        processBar := "."
        for j := 0; j < 3; j++ {
            fmt.Printf("%s\r", processBar)
            processBar += "."
            time.Sleep(400 * time.Millisecond)
        }
    }
}

具体实例

使用递归的方法计算斐波那契数列时可能会花费较长的时间,在等待的这段时间里制作一个进度条动画,以防无聊。

package main

import (
    "fmt"
    "time"
)

func main() {
    go spinner(100 * time.Millisecond)
    n := 45
    fmt.Printf("\rFibonacci(%d) = %d\n", n, fib(n))
}

func spinner(delay time.Duration) {
    for {
        for _, r := range `-\|/` {
            fmt.Printf("\r%c", r)
            time.Sleep(delay)
        }
    }
}

func fib(x int) int {
    if x < 2 {
        return x
    }
    return fib(x-1) + fib(x-2)
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容