2 回答

TA貢獻(xiàn)1824條經(jīng)驗 獲得超5個贊
在 Go 中,所有參數(shù)都按值傳遞,就像通過分配給參數(shù)或接收者(淺拷貝)一樣。
在 Go 中,切片的實現(xiàn)為
type slice struct {
? ? array unsafe.Pointer
? ? len? ?int
? ? cap? ?int
}
當(dāng)切片按值傳遞時,返回后,您將看不到對字段副本所做的任何更改struct。您只會看到底層數(shù)組元素的任何更改。
在您的情況下,您將覆蓋b( array, cap, len) 副本。
b = []byte(result)
當(dāng)您返回時,該副本將被丟棄。
您想要做的是更改bs的元素array。
例如,
package main
import (
? ? "io"
? ? "os"
? ? "strings"
)
func rot13(b byte) byte {
? ? switch {
? ? case b >= 'A' && b <= 'Z':
? ? ? ? return 'A' + (b-'A'+13)%26
? ? case b >= 'a' && b <= 'z':
? ? ? ? return 'a' + (b-'a'+13)%26
? ? }
? ? return b
}
type rot13Reader struct {
? ? r io.Reader
}
func (reader *rot13Reader) Read(b []byte) (int, error) {
? ? n, err := reader.r.Read(b)
? ? b = b[:n]
? ? for i := range b {
? ? ? ? b[i] = rot13(b[i])
? ? }
? ? return n, err
}
func main() {
? ? s := strings.NewReader("Lbh penpxrq gur pbqr!")
? ? r := rot13Reader{s}
? ? io.Copy(os.Stdout, &r)
}

TA貢獻(xiàn)1829條經(jīng)驗 獲得超13個贊
我不太確定,所以請在服用下面的食物時加入幾粒到幾磅的鹽。
首先,您應(yīng)該盡早添加錯誤檢查:
n, err := reader.r.Read(b)
if err != nil && err == io.EOF {
? ? fmt.Printf("\n%s, %d bytes read", err, n)
? ? return n, err
}
添加后,輸出就是您所期望的:
You cracked the code!
Lbh penpxrq gur pbqr!
EOF, 0 bytes read
這里的原因是讀者應(yīng)該返回 io.EOF,以防沒有任何內(nèi)容可供閱讀。
那么你為什么會經(jīng)歷上述奇怪的行為呢?快速瀏覽一下源代碼就會io.Copy
發(fā)現(xiàn),b
分配一次并重用。但由于b
未修改(未讀取任何字節(jié))并且您訪問它以從中讀取,因此它仍然保留與以前相同的值。不過,我認(rèn)為,根據(jù)最小意外原則,如果沒有讀到任何內(nèi)容,底層io.Reader
應(yīng)該是清晰的。b
- 2 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報