Интерфейс Reader и метод Read в golang

Я следил за голанг-туром, и меня попросили:

Внедрите rot13Reader, который реализует io.Reader и читает из io.Reader, изменяя поток, применяя шифр замещения ROT13 ко всем алфавитным символам.

Я впервые применил метод к * rot13Reader

   type rot13Reader struct {
    r io.Reader
}

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


}

Однако я не могу обойти этот метод чтения.

Включает ли p все прочитанные байты? И, следовательно, все, что мне нужно сделать, это перебрать их и применить подстановку ROT13?

Я понимаю, что он должен вернуть количество прочитанных байтов и ошибку EOF в конце файла, однако я не уверен, когда и как этот метод вызывается. Итак, вернувшись к моему первоначальному вопросу, p содержит все прочитанные данные? Если нет, то как я могу добраться до него?

Ответ 1

Вы должны сканировать и "rot13" только n байт (тот, который читается io.Reader внутри 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
}

rot13Reader инкапсулировать любого считывателя и вызвать Read на указанном инкапсулированном Reader.
Он возвращает содержимое rot13'ed и число байтов.