解讀GO語言中的值傳遞和引用傳遞

2021-09-11 19:23:47 字數 808 閱讀 7439

以下內容大部分來自許世偉《go語言程式設計》,在此只是為了做乙個筆記,方便日後 遺忘時容易找到 複習的資料

go語言中絕大部分型別都是基於值語義(值傳遞),包括:

基本型別:如byte、int、bool、float32、float64和string等;

複雜型別:如陣列(array)、結構體(struct)、指標(pointer)等

在c++和c語言中,陣列作為函式引數傳遞的時候,陣列名會退化為指標。但是在go語言中,陣列和基本型別都沒有區別,是很純粹的值型別。

go語言中有下面四個型別比較特別,看起來像引用型別:

陣列切片:指向陣列(array)的乙個區間

map:極其常見的資料結構,提供鍵值查詢的能力

channel:執行體(goroutine)間提供的通訊設施

介面(inte***ce):對一組滿足某個契約的型別的抽象

但是上述並不影響我們將go語言看做值語義。下面簡單介紹下這四個看起來像引用的資料型別:

陣列切片內部是指向陣列的指標,所以可以改變所指向的陣列元素並不奇怪,陣列切片型別本身的賦值仍然是值語義(指標拷貝只不過是新生成了乙個臨時指標,臨時指標和原指標指向了同一塊記憶體)

map本質是乙個字典指標,channel和map類似,本質上還是乙個指標。將它們設計為引用型別而不是統一的值型別的原因是:完整複製乙個channel或map並不是常規需求

同樣介面具備引用語義,是因為內部維持兩個指標。懶得打字了,直接上原文圖(內容來自許世偉的《go語言程式設計》)

C語言中的值傳遞與址傳遞和引用傳遞

c語言中的值傳遞與址傳遞 在剛接觸c語言的學習過程中,很多小白都會在函式引數傳遞上被難住,由於我也是小白,所以我也不例外。之前在做oj的時候遇到一題,掛在了自定義的函式引數傳遞的問題上。下面先放兩個簡單的例子。函式swap用來交換兩個數的值。include void swap int m,int n...

go中的值傳遞和引用傳遞

切片和地圖都是引用型別。當地被賦值為乙個新變數的時候,它們指向同乙個內部資料結構。因此,改變其中乙個變數,就會影響到另一變數。以下為引用型別示例 package main import fmt 和 slices 類似,map 也是引用型別。當 map 被賦值為乙個新變數的時候,它們指向同乙個內部資料...

go語言初體驗陣列,值傳遞,引用傳遞。

1.安裝了intleij idea 以後安裝了相對應版本idea版本的go外掛程式。liteide 和 goland 也可以用。package main import fmt func printarray arr 5 int arr 0 100001 func main arr3 int var ...