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

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

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

Go
GCT1015 2021-06-02 13:53:13
我想输出到标准输出并让输出“覆盖”之前的输出。例如; 如果我输出On 1/10,我希望下一个输出On 2/10覆盖On 1/10。我怎样才能做到这一点?
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

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

所以正确的做法是首先检查:

  • 如果标准输出将进入终端

  • 该终端覆盖行/屏幕的程序是什么

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

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

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

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


查看完整回答
反对 回复 2021-06-07
?
catspeake

TA贡献1111条经验 获得超0个赞

一个字符串将替换整个字符串的解决方案


fmt.Printf("\033[2K\r%d", i)


例如,它正确地从 10 打印到 0:


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

    fmt.Printf("\033[2K\r%d", i)

    time.Sleep(1 * time.Second)

}

fmt.Println()

以前的答案没有解决。


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

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