假设我正在用 Go 编写一个程序,该程序运行一段时间,同时使用 ANSI 控制代码为进度指示器线设置动画。例如,
outer:
for {
select {
case <-ticker:
fmt.Printf("\033[%dF\033[J", linesToOverwrite)
display()
case <-waitChan:
fmt.Printf("\033[%dF\033[J", linesToOverwrite)
display()
break outer
}
}
}
除非有一个单独的 goroutine 想要打印,例如当工作线程超时时,这种方法才有效。如果 goroutine 打印,该行将被覆盖,并且动画行将被“涂抹”。有没有一种简单的方法来解决这个问题,不需要重写我的项目中的所有打印语句来了解动画逻辑?
一种解决方案是编写一个打印函数包装器,它将缓冲行,然后让动画循环同步打印缓冲区。但这意味着我必须让项目中的所有代码都了解动画逻辑。