Вы никогда не модифицируя b
в читателе. Смысл функции io.Reader
Read
состоит в том, что вы помещаете данные непосредственно в базовый массив b
.
Считая функцию rot13()
также в месте модифицирует, это будет работать (редактировать:. Я пытался сохранить этот код близко к версии, так что вы можете увидеть, что изменилось Простейшее решения JimB является более идиоматическим решением эта проблема):
func (old_reader rot13Reader) Read(b []byte) (int, error) {
tmp_bytes := make([]byte, len(b))
old_len, err := old_reader.r.Read(tmp_bytes)
tmp_bytes = tmp_bytes[:old_len]
rot13(tmp_bytes)
for i := range tmp_bytes {
b[i] = tmp_bytes[i]
}
return old_len, err
}
Пример (с загасил rot13()
): https://play.golang.org/p/vlbra-46zk
на стороне записки, из идиоматической Perspect, old_reader
это не имя собственное приемника (равно как и в old_len
правильное имя переменной). Go предпочитает короткие имена приемников (например, r
или rdr
в этом случае), а также предпочитайте верблюд для подчеркивания (символы подчеркивания на самом деле срабатывают предупреждение golint
).
Редактировать2: Более идиоматическая версия вашего кода. Удержал тот же механизм действия, немного почистил его.
func (rdr rot13Reader) Read(b []byte) (int, error) {
tmp := make([]byte, len(b))
n, err := rdr.r.Read(tmp)
tmp = tmp[:n]
rot13(tmp)
for i := range tmp {
b[i] = tmp[i]
}
return n, err
}
Исходя из этого, удаляя кусочек tmp
байтов и с помощью назначения b
непосредственно приводит к идиоматических решения JimB к проблеме.
Редактировать3: Обновлено, чтобы исправить проблему. Павел указал в комментариях.
Спасибо! Выходные параметры - злые :( – devmeow
Это очень сложно использовать предварительно выделенный буфер чтения, если вы не передадите его в качестве параметра. – JimB
Этот код не совсем прав (хотя он будет работать для ' strings.Reader') - 'Read' может возвращать ошибку и ненулевое' n', а когда этот декодер не будет декодировать результат. 'n, err: = old_reader.r.Read (b) ; rot13 (b [: n]); return n, err' является более точным. –