为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
墨色风雨 2022-06-13 16:19:39
如果我像这样在 Go 中创建一个循环:package mainimport (    "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,等。有没有一种简单的方法可以在打印下一行之前从上一次迭代中清除打印的行?
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

要指定整数的宽度,请%在动词后面使用数字。默认情况下,结果将右对齐并用空格填充。


使用%2d而不是%d. 它将解决您的问题。


package main


import (

    "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 main


import (

    "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()

    }

}


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信