golang 值型別和引用型別

2021-10-06 20:39:12 字數 1625 閱讀 6026

1.值型別和引用型別

package main

import

("fmt"

)func

add(num int

)func

addarry

(arry [3]

int)

func

addslice

(slice [

]int

)func

addmap

(m map

[int

]int)}

func

main()

//值型別

fmt.

println

("arry before"

, arry)

addarry

(arry)

fmt.

println

("arry after"

, arry)

slice :=

int//引用型別

fmt.

println

("slice before"

, slice)

addslice

(slice)

fmt.

println

("slice after"

, slice)

m :=

make

(map

[int

]int

)//引用型別

m[1]=

1 fmt.

println

("map before"

, m)

addmap

(m) fmt.

println

("map after"

, m)

}

執行後的結果是:

num after 10

arry before [87

6]arry after [87

6]slice before [87

6]slice after [107

6]map before map[1

:1]map after map[1

:2]

可以看到單個值和陣列都是屬於值型別,在函式內部修改值但是外部並不會改變,而切片和字典屬於引用型別,在函式內部修改值,外部的值隨之改變。

值型別:

變數直接儲存,記憶體通常在棧中分配。

基本資料型別int、float、bool、string以及陣列和struct。

引用型別:

變數儲存的是乙個位址,這個位址儲存最終的值。記憶體通常在堆上分配。通過gc**。

slice、map、chan等都是引用型別

也就是值型別賦值或者函式傳參過後,進行了拷貝操作,已經是兩個指向不同記憶體位址的變數,而引用型別,賦值或者函式傳參過後,指向的還是同乙個記憶體位址,所以引用型別在函式內層修改值過後,外層變數上的值也會隨之改變。

由於結構體是值型別,所以在對儲存了大量資料的結構體進行函式傳參時最好使用指標傳參。

如果直接使用結構體那麼會進行大量資料的記憶體拷貝,導致記憶體資源浪費。

引用型別和值型別

c 是一種型別安全的語言。每乙個變數都要求定義為乙個特定的型別,並且要求儲存在變數中的值只能是這種型別的值。變數既能儲存值型別,也可以儲存引用型別,還可以是指標。這一課將講述前兩種型別,關於指標的討論我們將在下一課中進行。下面是關於值型別和引用型別不同點的概論 如果乙個變數v儲存的是值型別,則它直接...

引用型別和值型別

c 中值型別和引用型別作為方法引數傳遞的時候其實都可以說是 值 的傳遞,只不過這裡的 值 指代的東西有所區別。當方法的引數為值型別時,方法傳遞的是值本身的值。當方法的引數為引用型別時,方法傳遞的則是應用型別的引用的位址,也就是引用型別位址在棧上的值。舉個引用型別作為引數傳遞的例子 static vo...

值型別和引用型別

為了更好地說明兩種型別之間的區別,借用如下的 來說明 值型別引用型別 記憶體分配地點 分配在棧中 分配在堆中 效率效率高,不需要位址轉換 效率低,需要進行位址轉換 記憶體 使用完後,立即 使用完後,不是立即 等待gc 賦值操作 進行複製,建立乙個同值新物件 只是對原有物件的引用 函式引數與返回值 是...