66

stdout に出力し、その出力で前の出力を「上書き」したいと考えています。

例えば; を出力On 1/10したら、次の出力On 2/10で上書きしたいOn 1/10。これどうやってするの?

4

4 に答える 4

114

stdoutストリーム ( io.Writer) です。既に書き込まれている内容を変更することはできません。変更できるのは、ストリームが端末に出力される場合のストリームの表現方法です。このシナリオを想定する正当な理由はないことに注意してください。たとえば、ユーザーは stdout をパイプまたはファイルに自由にリダイレクトできます。

したがって、適切なアプローチは、最初に確認することです。

  • stdout が端末に送信される場合
  • 行/画面を上書きするその端末の手順は何ですか

上記は両方ともこの質問の範囲外ですが、端末が私たちのデバイスであると仮定しましょう。次に、通常は次のように印刷します。

fmt.Printf("\rOn %d/10", i)

ターミナルの前の行を上書きします。\rの略でcarriage return、現在の行の先頭にカーソルを移動するように多くの端末で実装されているため、「行の上書き」機能が提供されます。

別の方法でサポートされている「上書き」を使用する「その他」の端末の例として、プレイグラウンドでの例を次に示します。

于 2013-03-15T21:54:08.550 に答える
33

出力に複数の行を書き直したい場合は、このソリューションを使用してください。たとえば、この方法を使用して、まともなコンウェイの「ライフ ゲーム」出力を作成しました。

免責事項:これはANSI端末でのみ機能し、fmtこれを使用する以外にGo固有の回答でもありません。

fmt.Printf("\033[0;0H")
// put your other fmt.Printf(...) here

簡単な説明: これは、カーソルを画面上の特定の場所に移動するように ANSI 端末に指示するエスケープ シーケンスです。は\033[いわゆるエスケープ シーケンスであり0;0H、カーソルを端末の行 0、列 0 に移動するよう端末に指示するコードのタイプです。

ソース: https://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements

于 2015-11-03T21:57:24.837 に答える