函數調用的值傳遞和引用傳遞:Go 語言沒有引用傳遞

需要明確的是,Go 沒有引用變量,所以 Go 語言裡調用函數的時也沒有引用傳遞。

什麼是引用變量?

在一些開發語言中(比如 C++),對已存在的變量可以聲明別名,這種別名稱為引用變量。

可以看到 a、b 和 c 都指向相同的內存位置。對 a 的寫操作會影響 b 和 c。當你想在不同的範圍內聲明引用變量時,這是很有用的——即函數調用時。

Go 語言沒有引用變量

與 C++ 不同,Go 程序中定義的每個變量都佔用一個惟一的內存位置。

創建兩個共享同一內存位置的變量是不可能的。可以創建兩個指向同一內存位置的變量,不過這與兩個變量共享同一內存位置是不同的。

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

map 和 channel 是引用?

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

如果map m 是 C++ 風格的引用變量,則在 main() 聲明的 m 和 在 fn() 聲明的 m 會共享相同的內存空間。但是,因為對 fn() 中 m 賦值不影響 main() 的 m,所以我們可以看出 map 不是引用變量。

總結

Go 沒有引用傳遞,因為 Go 沒有引用變量。

原文地址:https://dave.cheney.net/2017/04/29/there-is-no-pass-by-reference-in-go

原文作者:Dave Cheney
中文由 Golang來啦作者 SeekLoad 翻譯,譯者水平有限,如有翻譯或理解錯誤,煩請幫忙指出,感謝!


分享到:


相關文章: