\r\n
\r\n\r\n<回车>+<换行>\n
\r
package main

import (
    "fmt"
)

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

简易进度条

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

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)
}