从控制台golang擦除符号

时间:2018-01-10 14:55:01

标签: go symbols erase

我希望在程序等待时在控制台中创建动画。有很多简单的方法可以做到这一点,通常,我们只是在某个周期的迭代中绘制符号。 让我们的代码是:

func Spinner(delay time.Duration) {
    for !StopSpinner{
        for _, r := range `-\|/` {
            fmt.Printf("\r%c", r)
            time.Sleep(delay)
        }
    }
}

问题是 - 当控制台屏幕中没有动画时,如何删除动画。 我尝试了转义序列,如fmt.Print(“\ b”)或fmt.Printf(“\ r \ n%s”,“”),但没有结果。我无法从屏幕中删除最后一个符号,它与下一个文本连接。如何擦除已打印到控制台的字符?

3 个答案:

答案 0 :(得分:2)

您需要做的就是在完成后打印一个空格(0x20),这将覆盖微调器。

即:fmt.Fprint(os.Stdout, "\r \r")将光标放回空格后的行首。

答案 1 :(得分:0)

fmt.Print("\033[H\033[2J")

这会将光标置于左上方,然后根据有用终端命令的文档清除控制台:

https://www.student.cs.uwaterloo.ca/~cs452/terminal.html

答案 2 :(得分:0)

  

您需要做的就是在完成后打印一个空格(0x20)   将覆盖微调器。

     

ie:fmt.Fprint(“\ r \ n \ r”)将光标放回行首   在空间之后。

这个答案很有帮助,谢谢! 但是,有一个重要的细节! 因为微调器函数有延迟,所以当StopSpinner布尔标志设置为true时,它无法完全停止。所以,我添加了一个同步通道。

func Spinner(delay time.Duration) {
    for !StopSpinner {
        for _, r := range `-\|/` {
            fmt.Printf("\r%c", r)
            time.Sleep(delay)
        }
    }
    fmt.Fprint("\r \r")
    c <- struct{}{}
}

现在,调用函数等待,而我的微调器停止。

var c chan struct{} = make(chan struct{}) // event marker

func callingFunc(){
  StopSpinner = false
  go Spinner(100 * time.Millisecond)

  // do something...
   StopSpinner = true

   <-c // wait spinner stop

   //do something else
}

在我看来,这是完整的解决方案!