【问题标题】:Clearing the rest of the line while printing from Go program in Linux/macOS terminal and using carriage return在 Linux/macOS 终端中从 Go 程序打印并使用回车时清除其余行
【发布时间】:2020-10-23 13:54:55
【问题描述】:

如果我像这样在 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 secondssTime out in 8 secondss 等。

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

【问题讨论】:

    标签: go newline carriage-return


    【解决方案1】:

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

    使用%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)
        }
    }
    
    

    更新

    你也可以在你的 go 代码中执行printf '\33c\e[3J' 命令来清理终端。

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

    【讨论】:

    • 我尝试在% 之后添加一个数字以及左右对齐和其他东西,但我的强迫症对我想出的任何东西都不满意:( 这是一个非常一个简单的例子,也可以通过在\r之前添加简单的空格来解决,但是在一些更“复杂”的情况下,以前的迭代可能会有很多垃圾,所以我也需要一些东西来避免这种情况。 ..
    • 完美!我不得不使用一些不同的语法 - cmd := exec.Command("bash", "-c", `printf '\33[K'`) 就我而言,仅使用“从光标右侧清除行”转义命令(\33[K)就足够了!
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多