猿问

在 Linux/macOS 终端中从 Go 程序打印并使用回车时清除其余行

如果我像这样在 Go 中创建一个循环:


package main


import (

    "fmt"

    "time"

)


func main() {

    for i := 10; i >= 0; i-- {

        fmt.Printf("Time out in %d seconds\r", i)

        time.Sleep(1 * time.Second)

    }

}

并在 Linux 或 macOS 终端中运行该程序,我将看到在第一次迭代中正确打印的行(Time out in 10 seconds)但在下一次迭代中(在这种情况下是每隔一个迭代),因为要打印的字符串短一个字符,我会看到上次迭代的剩余部分作为最后的附加s字符 - Time out in 9 secondss,Time out in 8 secondss,等。


有没有一种简单的方法可以在打印下一行之前从上一次迭代中清除打印的行?


墨色风雨
浏览 177回答 1
1回答

繁星coding

要指定整数的宽度,请%在动词后面使用数字。默认情况下,结果将右对齐并用空格填充。使用%2d而不是%d. 它将解决您的问题。package mainimport (    "fmt"    "time")func main() {    for i := 10; i >= 0; i-- {        fmt.Printf("Time out in %2d seconds\r", i)        time.Sleep(1 * time.Second)    }}去游乐场更新:你也可以printf '\33c\e[3J'从你的 go 代码中执行命令来清理终端。package mainimport (    "fmt"    "os"    "os/exec"    "time")var clearScreen = func() {    cmd := exec.Command(`printf '\33c\e[3J'`) // clears the scrollback buffer as well as the screen.    cmd.Stdout = os.Stdout    cmd.Run()}func main() {    for i := 10; i >= 0; i-- {        fmt.Printf("Time out in %2d seconds\r", i)        time.Sleep(1 * time.Second)        clearScreen()    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答