2014-08-27 9 views
10

stavo seguendo il tour golang e mi è stato chiesto di:interfaccia Reader e il metodo Read in golang

Implementare una rot13Reader che implementa io.Reader e legge da un io.Reader, modificando il flusso da applicando il codice di sostituzione ROT13 a tutti i caratteri alfabetici.

ho implementato il metodo per l'* rot13Reader

type rot13Reader struct { 
    r io.Reader 
} 

func (r *rot13Reader) Read(p []byte) (n int, e error){ 


} 

Tuttavia non posso ottenere la mia testa intorno a questo metodo Read.

Il p contiene tutti i byte letti? E quindi tutto ciò che dovrei fare è iterare su di loro e applicare la sostituzione ROT13?

Capisco che dovrebbe restituire il numero di byte letti e un errore EOF alla fine del file, ma non sono sicuro di quando e come questo metodo viene chiamato. Tornando alla mia domanda iniziale, lo p contiene tutti i dati letti? Se no, allora come posso arrivarci?

risposta

5

È necessario eseguire la scansione e "rot13" solo n byte (quello letto dallo io.Reader all'interno di rot13Reader).

func (r *rot13Reader) Read(p []byte) (n int, e error){ 
    n, err = r.r.Read(p) 
    for i:=range(p[:n]) { 
     p[i]=rot13(p[i]) 
    } 
    return 
} 

Il rot13Reader incapsulare ogni lettore e chiamare Read su detto Reader incapsulato.
Restituisce il contenuto di rot13'ed e il numero di byte letti.

+0

@Bula Ho modificato la risposta: era il nome del ricevitore 'rot13Reader'. L'ho cambiato in 'r', ma è meno chiaro, dato che' r' è * anche * il nome di 'io.Reader' all'interno della struttura' rot13Reader'. – VonC