他の出力を上書きせずに進行状況をアニメーション化する方法は?

他の出力を上書きせずに進行状況をアニメーション化する方法は?

進行状況バーにアニメーションを適用するためにANSI制御コードを使用している間、しばらく実行されるGoプログラムを書いているとします。例えば、

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
        }
    }
}

このアプローチは、ワーカースレッドがタイムアウトした場合など、印刷したい別のゴールチンがない場合にのみ機能します。ゴルチンが印刷されると、ラインが上書きされ、アニメーションラインが「着色」されます。アニメーションロジックを理解するために、プロジェクト内のすべての印刷ステートメントを再構築せずにこの問題を簡単に解決する方法はありますか?

1つの解決策は、行をバッファリングし、アニメーションループにバッファを同期的に印刷させる印刷関数ラッパーを作成することです。ただし、これはプロジェクト内のすべてのコードにアニメーションロジックを認識させる必要があることを意味します。

関連情報