2013-03-15 5 views

risposta

59

stdout è un flusso (io.Writer). Non è possibile modificare ciò che è stato già scritto su di esso. Ciò che può modificare è come viene rappresentato il flusso nel caso in cui venga stampato su un terminale. Nota che non ci sono buone ragioni per assumere questo scenario. Ad esempio, un utente può reindirizzare lo stdout su una pipe o su un file a piacimento.

Quindi l'approccio corretto è quello di primo controllo:

  • se lo stdout sta andando a un terminale
  • cosa è procedura che del terminale di sovrascrivere una linea/schermo

Sia della sopra sono fuori dallo scopo di questa domanda, ma supponiamo che un terminale sia il nostro dispositivo. Quindi, di solito, stampa:

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

sovrascriverà la riga precedente nel terminale. \r corrisponde a carriage return, implementato da molti terminali come spostamento del cursore all'inizio della riga corrente, fornendo quindi la funzione di "sovrascrittura".

Come esempio di terminale "altro" con "sovrascrittura" supportata in modo diverso, ecco un esempio su playground.

+0

Come cancellare la coda della riga precedente? se 'i' inizia da 10, allora la soluzione stamperà' Su 90', 'Su 80', ... – coanor

+0

@coanor: O cancella la linea stampando gli spazi, o tampona ogni valore con spazi. –

+0

@zzzz qualsiasi soluzione che usi con il pacchetto 'log'? perché 'fmt' non è thread-safe –

16

Utilizzare questa soluzione se si desidera riscrivere più righe sull'output. Ad esempio, ho realizzato un output decente Conway's "Game of Life" utilizzando questo metodo.

DISCLAIMER: funziona solo su terminali ANSI e, inoltre, l'utilizzo di fmt non è una risposta specifica per Go.

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

breve spiegazione: questa è una sequenza di escape che indica al terminale ANSI per spostare il cursore in un punto particolare sullo schermo. \033[ è la cosiddetta sequenza di escape e il 0;0H è il tipo di codice che indica al terminale di spostare il cursore sulla riga 0, colonna 0 del terminale.

Fonte: https://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements

+2

awesome wiki" conway game of life "... grazie a un link – KingRider

+0

Questa soluzione ha funzionato perfettamente per me sul terminale OSX. La risposta accettata in realtà non ha fatto nulla per me. – Tyguy7

Problemi correlati