Go 基礎之指標

2022-06-23 13:45:12 字數 2371 閱讀 5059

區別於c/c++中的指標,go語言中的指標不能進行偏移和運算,是安全指標。

任何程式資料載入記憶體後,在記憶體都有他們的位址,這就是指標。而為了儲存乙個資料在記憶體中的位址,我們就需要指標變數。

比如,「永遠不要高估自己」這句話是我的座右銘,我想把它寫入程式中,程式一啟動這句話是要載入到記憶體(假設記憶體位址0x123456),我在程式中把這段話賦值給變數a,把記憶體位址賦值給變數b。這時候變數b就是乙個指標變數。通過變數a和變數b都能找到我的座右銘。

每個變數在執行時都擁有乙個位址,這個位址代表變數在記憶體中的位置。go語言中使用&字元放在變數前面對變數進行「取位址」操作。 go語言中的值型別(int、float、bool、string、array、struct)都有對應的指標型別,如:*int*int64*string等。

取變數指標的語法如下:

ptr := &v    // v的型別為t
其中:

v:代表被取位址的變數,型別為t

ptr:用於接收位址的變數,ptr的型別就為*t,稱做t的指標型別。*代表指標。

舉個例子:

func main()
我們來看一下b := &a的圖示:

在對普通變數使用&操作符取位址後會獲得這個變數的指標,然後可以對指標使用*操作,也就是指標取值,**如下。

func main()
輸出如下:

type of b:*int

type of c:int

value of c:10

總結:取位址操作符&和取值操作符*是一對互補操作符,&取出位址,*根據位址取出位址指向的值。

指標傳值示例:

func modify1(x int) 

func modify2(x *int)

func main()

我們先來看乙個例子:

func main()
執行上面的**會引發panic,為什麼呢? 在go語言中對於引用型別的變數,我們在使用的時候不僅要宣告它,還要為它分配記憶體空間,否則我們的值就沒辦法儲存。而對於值型別的宣告不需要分配記憶體空間,是因為它們在宣告的時候已經預設分配好了記憶體空間。要分配記憶體,就引出來今天的new和make。 go語言中new和make是內建的兩個函式,主要用來分配記憶體。

new是乙個內建的函式,它的函式簽名如下:

func new(type) *type
其中,

type表示型別,new函式只接受乙個引數,這個引數是乙個型別

*type表示型別指標,new函式返回乙個指向該型別記憶體位址的指標。

new函式不太常用,使用new函式得到的是乙個型別的指標,並且該指標對應的值為該型別的零值。舉個例子:

func main()
本節開始的示例**中var a *int只是宣告了乙個指標變數a但是沒有初始化,指標作為引用型別需要初始化後才會擁有記憶體空間,才可以給它賦值。應該按照如下方式使用內建的new函式對a進行初始化之後就可以正常對其賦值了:

func main()
make也是用於記憶體分配的,區別於new,它只用於slice、map以及chan的記憶體建立,而且它返回的型別就是這三個型別本身,而不是他們的指標型別,因為這三種型別就是引用型別,所以就沒有必要返回他們的指標了。make函式的函式簽名如下:

func make(t type, size ...integertype) type
make函式是無可替代的,我們在使用slice、map以及channel的時候,都需要使用make進行初始化,然後才可以對它們進行操作。這個我們在上一章中都有說明,關於channel我們會在後續的章節詳細說明。

本節開始的示例中var b map[string]int只是宣告變數b是乙個map型別的變數,需要像下面的示例**一樣使用make函式進行初始化操作之後,才能對其進行鍵值對賦值:

func main()
二者都是用來做記憶體分配的。

make只用於slice、map以及channel的初始化,返回的還是這三個引用型別本身;

而new用於型別的記憶體分配,並且記憶體對應的值為型別零值,返回的是指向型別的指標。

Go語言基礎之指標

go語言中的函式傳參都是值拷貝,當想修改某個變數時,就使用指標來操作。go中的指標 取位址 根據位址取值 每個變數在執行時都有乙個記憶體位址。go中使用 變數名,對變數進行取位址操作。go中的值型別 int float bool string array struct 都有對應的指標型別如 int ...

Go語言基礎之指標

作為21世紀的c語言,go可能多方面思考,最終還是保留了指標 因為go語言是類c語言,所以為了提高效率,仍然保留了指標。但是如果沒有接觸過指標,可能學起來指標需要多多思考一下了。指標通常情況下,也被稱為小白勸退神奇。先看這兩行 var n1 int 666 fmt.println n1 結果 666...

Go語言基礎之指標

區別於c c 中的指標,go語言中的指標不能進行偏移和運算,是安全指標。go語言中的函式傳參都是值拷貝,當我們想要修改某個變數的時候,我們可以建立乙個指向該變數位址的指標變數。傳遞資料使用指標,而無須拷貝資料。型別指標不能進行偏移和運算。go語言中的指標操作非常簡單,只需要記住兩個符號 取位址 和 ...