我有一個(gè)關(guān)于閱讀器界面的問(wèn)題,定義如下:type Reader interface { Read(p []byte) (n int, err error)}我有以下使用閱讀器界面的代碼:package mainimport ( "fmt" "os")// Reading files requires checking most calls for errors.// This helper will streamline our error checks below.func check(e error) { if e != nil { panic(e) }}func main() { // You'll often want more control over how and what // parts of a file are read. For these tasks, start // by `Open`ing a file to obtain an `os.File` value. f, err := os.Open("configuration.ini") check(err) // Read some bytes from the beginning of the file. // Allow up to 5 to be read but also note how many // actually were read. b1 := make([]byte, 10) n1, err := f.Read(b1) check(err) fmt.Printf("%d bytes: %s\n", n1, string(b1)) f.Close()}如您所見(jiàn),上面的代碼b1被定義為字節(jié)切片,并將其Read作為值參數(shù)傳遞給方法。在Read方法之后,b1包含文件中的前 10 個(gè)字母。對(duì)我來(lái)說(shuō),上面的代碼非常令人困惑的是,為什么b1在Read方法之后突然包含值。在 Golang 中,當(dāng)我向方法傳遞值時(shí),它將作為值傳遞而不是作為引用傳遞。為了澄清,我在說(shuō)什么,我做了一個(gè)示例應(yīng)用程序:package mainimport ( "fmt")func passAsValue(p []byte) { c := []byte("Foo") p = c}func main() { b := make([]byte, 10) passAsValue(b) fmt.Println(string(b))}在passAsValue函數(shù)之后,b不包含任何值,并且我在 golang 中期望的是,參數(shù)將作為值傳遞給函數(shù)或方法。那么,為什么第一個(gè)代碼片段可以更改傳遞參數(shù)的內(nèi)容?如果該Read方法需要[]byte切片指針,那么我會(huì)同意,但在這種情況下不會(huì)。
3 回答

慕碼人2483693
TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
一切都是按值傳遞的(通過(guò)創(chuàng)建被傳遞值的副本)。
但是,由于在Go切片只是描述符用于底層數(shù)組中,描述符將被復(fù)制,這將是指相同的底層數(shù)組,因此,如果在修改的連續(xù)段內(nèi)容的切片的,相同的基本陣列被修改。
如果在函數(shù)中修改了切片值本身,那不會(huì)在調(diào)用處體現(xiàn)出來(lái),因?yàn)榍衅抵皇且粋€(gè)副本,副本會(huì)被修改(不是原始的切片描述符值)。
如果你傳遞一個(gè)指針,指針的值也是按值傳遞的(指針值會(huì)被復(fù)制),但在這種情況下,如果你修改了指向的值,那將與調(diào)用處相同(復(fù)制指針和原始指針指向同一個(gè)對(duì)象/值)。
- 3 回答
- 0 關(guān)注
- 197 瀏覽
添加回答
舉報(bào)
0/150
提交
取消