第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Reader 界面更改值

Reader 界面更改值

Go
慕慕森 2021-10-04 09:40:55
我有一個關(guā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()}如您所見,上面的代碼b1被定義為字節(jié)切片,并將其Read作為值參數(shù)傳遞給方法。在Read方法之后,b1包含文件中的前 10 個字母。對我來說,上面的代碼非常令人困惑的是,為什么b1在Read方法之后突然包含值。在 Golang 中,當我向方法傳遞值時,它將作為值傳遞而不是作為引用傳遞。為了澄清,我在說什么,我做了一個示例應用程序: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ù)或方法。那么,為什么第一個代碼片段可以更改傳遞參數(shù)的內(nèi)容?如果該Read方法需要[]byte切片指針,那么我會同意,但在這種情況下不會。
查看完整描述

3 回答

?
慕碼人2483693

TA貢獻1860條經(jīng)驗 獲得超9個贊

一切都是按值傳遞的(通過創(chuàng)建被傳遞值的副本)。

但是,由于在Go切片只是描述符用于底層數(shù)組中,描述符將被復制,這將是指相同的底層數(shù)組,因此,如果在修改的連續(xù)段內(nèi)容的切片的,相同的基本陣列被修改。

如果在函數(shù)中修改了切片值本身,那不會在調(diào)用處體現(xiàn)出來,因為切片值只是一個副本,副本會被修改(不是原始的切片描述符值)。

如果你傳遞一個指針,指針的值也是按值傳遞的(指針值會被復制),但在這種情況下,如果你修改了指向的值,那將與調(diào)用處相同(復制指針和原始指針指向同一個對象/值)。


查看完整回答
反對 回復 2021-10-04
  • 3 回答
  • 0 關(guān)注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號