我希望在程序等待时在控制台中创建动画。有很多简单的方法可以做到这一点,通常,我们只是在某个周期的迭代中绘制符号。 让我们的代码是:
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”,“”),但没有结果。我无法从屏幕中删除最后一个符号,它与下一个文本连接。如何擦除已打印到控制台的字符?
答案 0 :(得分:2)
您需要做的就是在完成后打印一个空格(0x20),这将覆盖微调器。
即:fmt.Fprint(os.Stdout, "\r \r")
将光标放回空格后的行首。
答案 1 :(得分:0)
fmt.Print("\033[H\033[2J")
这会将光标置于左上方,然后根据有用终端命令的文档清除控制台:
答案 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
}
在我看来,这是完整的解决方案!