go語言的陣列是引用嗎 Go 語言沒有引用傳遞

2021-10-17 09:43:56 字數 1246 閱讀 7459

『就要學習 go 語言』系列 -- 第 31 篇分享好文

需要明確的是,go 沒有引用變數,所以 go 語言裡呼叫函式的時也沒有引用傳遞。

在一些開發語言中(比如 c++),對已存在的變數可以宣告別名,這種別名稱為引用變數。

1#include 

23int main() 

可以看到 a、b 和 c 都指向相同的記憶體位置。對 a 的寫操作會影響 b 和 c。當你想在不同的範圍內宣告引用變數時,這是很有用的——即函式呼叫時。

與 c++ 不同,go 程式中定義的每個變數都占用乙個惟一的記憶體位置。

1package main

23import "fmt"

45func main() 

建立兩個共享同一記憶體位置的變數是不可能的。可以建立兩個指向同一記憶體位置的變數,不過這與兩個變數共享同一記憶體位置是不同的。

1package main

23import "fmt"

45func main() 

上面這段**,b 和 c 都具有相同的值 -- 即變數 a 的位址,但 a、c 儲存在記憶體中不同的位置。改變 b 的內容不會影響到 c。

錯!map 和 channel 不是引用,如果是的話下面這段**會輸出 false。

1package main

23import "fmt"

45func fn(m map[int]int) 

89func main() 

如果map m 是 c++ 風格的引用變數,則在 main() 宣告的 m 和 在 fn() 宣告的 m 會共享相同的記憶體空間。但是,因為對 fn() 中 m 賦值不影響 main() 的 m,所以我們可以看出 map 不是引用變數。

go 沒有引用傳遞,因為 go 沒有引用變數。

推薦閱讀:

指標與引用

800 字徹底理解 go 指標

指標(譯)

如果我的文章對你有所幫助,點讚、**都是一種支援!

給個[在看],是對四哥最大的支援

Go語言引用型別

切片 1 切片定義 a 宣告乙個切片var slice int var slice int var slice int int b 通過make來建立切片var slice make int,10 c 通過 語法來定義切片slice int slice make int,10 slice make ...

Go語言 陣列

定義陣列的長度和型別,預設使用型別的零值進行初始化 var a1 10 int 不指定陣列的長度,指定型別,缺省會使用初始值設定陣列的長度 初始值有幾個,陣列長度就是幾 var a2 int 指定陣列的長度和型別,同時初始化全部或者部分的數字,元素會從前到後順序初始化 初始化時物件的數量不能大於陣列...

GO語言 陣列

陣列是同一種資料型別元素的集合。在go語言中,陣列從宣告時就確定,使用時可以修改陣列成員,但是陣列大小不可變化。基本語法 定義乙個長度為3元素型別為int的陣列a var a 3 intvar 陣列變數名 元素數量 t比如 var a 5 int,陣列的長度必須是常量,並且長度是陣列型別的一部分。一...