如何在不覆盖其他输出的情况下动画进度?

如何在不覆盖其他输出的情况下动画进度?

假设我正在用 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 打印,该行将被覆盖,并且动画行将被“涂抹”。有没有一种简单的方法来解决这个问题,不需要重写我的项目中的所有打印语句来了解动画逻辑?

一种解决方案是编写一个打印函数包装器,它将缓冲行,然后让动画循环同步打印缓冲区。但这意味着我必须让项目中的所有代码都了解动画逻辑。

相关内容