Sie nie b
in Ihrem Leser zu modifizieren. Die Semantik von io.Reader
's Read
Funktion ist, dass Sie die Daten in b
' s zugrunde liegenden Array direkt setzen.
die rot13()
Funktion auch an Ort und Stelle ändert Unter der Annahme, dies funktionieren wird (bearbeitet:. Ich habe versucht, auf Ihre Version diesen Code zu halten, schließen, so können Sie sehen, was leichter geändert hat JimB-Lösung ist eine idiomatische Lösung dieses Problem):
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
}
Beispiel (mit stubbed rot13()
): https://play.golang.org/p/vlbra-46zk
Auf einer Seite zur Kenntnis, von einer idiomatischen perspect ist old_reader
kein richtiger Empfängername (noch ist old_len
ein richtiger Variablenname). Go bevorzugt kurze Empfänger-Namen (wie r
oder rdr
in diesem Fall), und auch Camelcase zu Unterstrichen bevorzugen (Unterstriche werden tatsächlich eine golint
Warnung ausgelöst).
Edit2: Eine idiomatische Version Ihres Codes. Behielt den gleichen Mechanismus der Aktion, nur ein wenig aufgeräumt.
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
}
Daraus die tmp
Byte Scheibe zu entfernen und mit dem Ziel b
direkt in JimB der idiomatische Lösung des Problems führt.
Edit3: Aktualisiert, um das Problem zu beheben, auf das Paul in Kommentaren hingewiesen hat.
Danke! Ausgabeparameter ist böse :( – devmeow
Es ist ein bisschen schwierig, einen vorher zugewiesenen Lesepuffer zu verwenden, wenn Sie es nicht als Parameter übergeben. – JimB
Dieser Code ist nicht ganz richtig (obwohl es für ein 'arbeitet strings.Reader ') -' Read' kann einen Fehler und ein von Null verschiedenes 'n' zurückgeben, und wenn dies der Fall ist, dekodiert das Dekodiergerät das Ergebnis nicht.' n, err: = old_reader.r.Read (b) ; rot13 (b [: n]); return n, err "ist genauer. –