一尘不染

如何拥有在标准输出上更新的就地字符串

go

我想输出到stdout并让输出“覆盖”先前的输出。

例如; 如果我输出On 1/10,我希望下一个输出On 2/10覆盖On 1/10。我怎样才能做到这一点?


阅读 223

收藏
2020-07-02

共1个答案

一尘不染

stdout是一个流(io.Writer)。您无法修改已写入的内容。什么 可以
被改变是如何在情况下,它被打印到一个终端,其串流的表示。请注意,没有充分的理由假设这种情况。例如,用户可以随意将标准输出重定向到管道或文件。

因此正确的方法是首先检查:

  • 如果stdout要去终端
  • 该终端覆盖行/屏幕的程序是什么

以上两个都不在这个问题的范围内,但让我们假设终端是我们的设备。然后通常打印:

fmt.Printf("\rOn %d/10", i)

将覆盖终端中的前一行。\r代表carriage return,由许多终端实现,将光标移动到当前行的开头,因此提供了“覆盖行”功能。

作为具有不同支持的“覆盖”的“其他”终端的示例,这里是操场上的示例。

2020-07-02