Интерфейс 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 и число байтов.