go中的引用類型

首先,go中的賦值,都是值傳遞c++

a := 1
b := a

x := Struct{}
y := x
複製代碼

他們都是在內存中有獨立空間的,也就是copy的過程,因此這裏對y的某個屬性的改動,並不會影響xgolang

那麼咱們要讓兩個變量指向同一個內存怎麼辦呢,可使用引用類型:數組

y := &x
複製代碼

這時候,y的類型是*Struct,這時候咱們能夠對y進行修改,修改完以後,x也會發現變化,由於y如今是一個引用類型,他指向的是x結構體所在的內存bash

咱們能夠經過:函數

y.variable = xxx
複製代碼

來直接調用引用類型的結構體賦值,可是要注意的是,這是go的語法糖,他只是幫助咱們簡化了經過指針來獲取實際內存的過程,完整的寫法應該是這樣的:ui

(*y).variable = xxx
複製代碼

*y是對指針的反引用,能夠理解爲*y == xspa

爲何設計這個語法糖呢,是由於在go裏面咱們是沒法直接操做指針,像c++中直接對內存地址進行計算進而獲得其餘內存地址的運算,在go裏面是默認不支持的設計

print(y) // 獲得相似0x8123這樣的內存地址數據

// 理論上能夠獲得一個新的內存地址,可是在go裏默認是不支持的
newAddr := y + 4
複製代碼

由於沒法直接操做地址,因此go就提供語法糖,讓咱們在使用引用類型進行操做的時候,默認就是對引用所指向的內存地址進行操做。指針

注意咱們是能夠對引用類型直接賦值的,可是賦值的類型也必須是引用類型code

y = &Struct{} // 這樣是能夠的,可是不能是y = Struct{}

a := 1
b := &a
b = 2  // 這是不行的,由於b的類型是 *int
複製代碼

特殊的引用類型

可以經過make()函數建立的都是引用類型,好比slicemapslice雖然看起來像數組,可是他實際上是一個指向數組內存空間的一個指針類型

type Slice struct {
    point Point // 內存地址
    len int
    cap int
}
複製代碼

因此咱們在執行:

a := []int
b = a
複製代碼

會發現,好像b和a指向的是同一個數組,事實確實如此。go中全部的賦值都是值傳遞,而slice的賦值,也是對slice對象的一次拷貝,也就是說a和b是不一樣的slice對象,可是他們指向同一個數組

同理map也是如此,就很少講來。

相關文章
相關標籤/搜索