Golang中參數(shù)傳遞詳解

關于參數(shù)傳遞,Golang文檔中有這么一句:

after they are evaluated, the parameters of the call are passed by value to the
function and the called function begins execution.

函數(shù)調用參數(shù)均為值傳遞,不是指針傳遞或引用傳遞。經(jīng)測試引申出來,當參數(shù)變量為指針或隱式指針類型,參數(shù)傳遞方式也是傳值(指針本身的copy)

Slice是最常用的數(shù)據(jù)結構之一,下面以Slice為例,解釋Golang的參數(shù)傳遞機制。

Slice數(shù)據(jù)結構如下:
image
示例代碼:
package main

import "fmt"

func main(){
    slice := make([]int, 3, 5)
    fmt.Println("before:", slice)
    changeSliceMember(slice)
    fmt.Println("after:", slice)
}

func changeSliceMember(slice []int) {
    if len(slice) > 1 {
    slice[0] = 9
    }
}

函數(shù)執(zhí)行結果為:

befor:[0 0 0]
after:[9 0 0]
解釋:

從數(shù)據(jù)結構圖中可看出,Slice可以理解成結構體類型,包含底層數(shù)組首元素地址、數(shù)組len、容量三個字段,slice對象在參數(shù)傳值過程中,把三個字段的值傳遞過去了,實際上changeSliceMember函數(shù)內slice在內存中的地址和main中的slice內存地址不一樣,只是字段值是一樣的,而第一個字段Pointer的值就是底層數(shù)組首元素地址,因此可以直接改變元素內容

可以與下面代碼做對比,理解:
package main

func main() {
    value := new(int)
    modifyFunc(value)
    println("main:", value)
}

func modifyFunc(value *int) {
    value = nil
    println("modifyFunc:", value)
}

執(zhí)行結果:

modifyFunc: 0x0
main: 0xc820049f30

可以看出,即使傳值為指針,仍未改變變量value在main中的值,因為modifyFunc中value的值為指針,和main中的value值一樣,但是倆對象本身是兩個對象,讀者可以細細體會

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 這里我們著重討論參數(shù)傳遞的方式以及在 Golang 中函數(shù)調用前后(當然包括參數(shù)傳遞)對實參的影響。先了解一些基...
    空城新月閱讀 11,165評論 0 8
  • 能力模型 選擇題 [primary] 下面屬于關鍵字的是()A. funcB. defC. structD. cl...
    _張曉龍_閱讀 25,121評論 14 224
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 取次花叢懶回顧,半緣修道半緣君。
    西席匠閱讀 129評論 0 0
  • 格局,感恩 1.英文朗讀 1小時! 2.聽英文有聲書 1小時! 3.復習電子 2小時! 4.聽了弗蘭克的分享,整理...
    橘子俠閱讀 219評論 0 0

友情鏈接更多精彩內容