本文原創文章,轉載註明出處,博客地址 https://segmentfault.com/u/to... 第一時間看後續精彩文章。以爲好的話,順手分享到朋友圈吧,感謝支持。segmentfault
關於參數傳遞,Golang文檔中有這麼一句:數組
after they are evaluated, the parameters of the call are passed by value to the數據結構
function and the called function begins execution.函數
函數調用參數均爲值傳遞,不是指針傳遞或引用傳遞。經測試引伸出來,當參數變量爲指針或隱式指針類型,參數傳遞方式也是傳值(指針自己的copy)測試
Slice是最經常使用的數據結構之一,下面以Slice爲例,解釋Golang的參數傳遞機制。lua
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 } }
函數執行結果爲:spa
befor:[0 0 0] after:[9 0 0]
從數據結構圖中可看出,Slice能夠理解成結構體類型,包含底層數組首元素地址、數組len、容量三個字段,slice對象在參數傳值過程當中,把三個字段的值傳遞過去了,實際上changeSliceMember函數內slice在內存中的地址和main中的slice內存地址不同,只是字段值是同樣的,而第一個字段Pointer的值就是底層數組首元素地址,所以能夠直接改變元素內容指針
package main func main() { value := new(int) modifyFunc(value) println("main:", value) } func modifyFunc(value *int) { value = nil println("modifyFunc:", value) }
執行結果:code
modifyFunc: 0x0 main: 0xc820049f30
能夠看出,即便傳值爲指針,仍未改變變量value在main中的值,由於modifyFunc中value的值爲指針,和main中的value值同樣,可是倆對象自己是兩個對象,讀者能夠細細體會對象