2 回答

TA貢獻1802條經(jīng)驗 獲得超10個贊
該Read()操作會改變輸入數(shù)組b。在第二個示例中,rot13()操作被操作覆蓋Read()。此外,該rot13()操作是在將任何數(shù)據(jù)讀入數(shù)組之前執(zhí)行的,因此您可能正在rot13()處理垃圾數(shù)據(jù)。
如果您希望第二個示例起作用,則需要編寫如下內(nèi)容:
func (r rot13Reader) Read(b []byte) (int, error) {
n, err := r.r.Read(b)
for i, v := range b {
b[i] = rot13(v)
}
return n, err
}

TA貢獻1864條經(jīng)驗 獲得超2個贊
返回不是問題,但在第一種情況下,您在轉(zhuǎn)換數(shù)據(jù)之前讀取數(shù)據(jù),在第二種情況下,您在緩沖區(qū)中轉(zhuǎn)換垃圾,然后才讀取數(shù)據(jù)(并簡單地傳遞已讀取的數(shù)據(jù))來自底層讀者)。
雖然這不是必需的正確性,我建議你不要每次都變換整個緩沖區(qū),而只是說已經(jīng)閱讀改變你的第一個例子中的部分,即for i, v := range b
到for i, v := range b[:n]
。那是因為io.Read
call 不能修改 slice 的長度b
,而只能修改它的內(nèi)容。
看一看 的文檔io.Reader
,它應該會讓您對這個界面的預期工作方式有更多的了解。
- 2 回答
- 0 關注
- 193 瀏覽
添加回答
舉報