您當前的位置:首頁 > 體育

Go的引數是傳值還是傳引用問題

作者:由 歡樂毅城 發表于 體育時間:2021-06-24

Go中所有的引數傳遞都是

值傳遞

,複製的都是一個副本。但是,這裡分兩種情況討論,

引用型別

非引用型別

非引用型別(值型別):int,string,float,bool,陣列和struct;

特點:值型別變數聲明後,變數存的是值,記憶體通常在棧上分配,棧在函式呼叫後會被釋放。

引用型別:指標,slice,map,channel,介面,函式等。

特點:變數存放的是一個記憶體地址值,這個地址值指向的空間存的才是最終的值。記憶體通常在堆中分配,當沒有任務變數引用這個地址時,該地址對應的資料空間就成為一個垃圾,透過GC回收。

Go的引數是傳值還是傳引用問題

slice、map,chan初始化時返回一個有初始值(非零)的T型別。可以透過某個變數型別本身的指標(如map,chan)或者該變數型別內部的元素的指標(如slice的第一個元素的指標)修改該變數型別的值。

因此slice也跟chan與map一樣,屬於值傳遞,傳遞的是第一個元素的指標的副本。

總結

:Go語言中只存在

值傳遞

要麼是該值的副本,要麼是指標的副本

),不存在引用傳遞。之所以對於引用型別的傳遞可以修改原內容資料,是因為在底層預設使用該引用型別的指標進行傳遞,但是也是使用指標的副本,依舊是值傳遞。

標簽: 指標  型別  引用  傳遞  變數