Golang的值型別和引用型別的範圍、儲存區域、區別

OldBoy~發表於2018-08-14

常見的值型別和引用型別分別有哪些?

值型別:基本資料型別 int 系列, float 系列, bool, string 、陣列和結構體struct,使用這些型別的變數直接指向存在記憶體中的值,值型別的變數的值通常儲存在棧中。

引用型別:指標、slice切片、map、管道chan、interface 等都是引用型別

資料儲存的兩大塊:棧和堆

在記憶體裡分成兩大塊,棧和堆,值型別的變數通常儲存在棧區,引用型別通常儲存在堆區,在golang中,但有可能值型別也儲存在堆區,反過來也有可能引用型別儲存在棧區。

兩種型別的區別(拷貝操作和函式傳參)

值型別:值型別的變數通常在棧中分配。當使用等號=將一個變數的值賦給另一個變數時,如num=100, j = num,實際上是在記憶體中將num的值進行了拷貝。可以通過 &i 獲取變數 i 的記憶體地址。  值拷貝

引用型別:變數儲存的是一個地址,這個地址對應的空間才真正儲存資料(值),記憶體通常在堆上分配,當沒有任何變數引用這個地址時,該地址對應的資料空間就成為一個垃圾,由GC來回收。 

引用型別擁有更復雜的儲存結構:(1)分配記憶體 (2)初始化一系列屬性等一個引用型別的變數r1儲存的是r1的值所在的記憶體地址(數字),或記憶體地址中第一個數字所在的位置,這個記憶體地址被稱之為指標,這個指標實際上也被存在另外的某一個數字中。 可以看本篇文章瞭解Golang指標基本介紹及使用案例

相關文章