不知不覺已經工作一週了,面對java轉go第一件不適應的事,就是指標它lei了,因為java把指標給隱藏了,我學習java的時候並沒有太在意指標的問題,但是在看go文件時赫然發現指標它又回來了。
問題1 那麼指標它到底是個什麼?
我們首先得明確這一點,先問個其他問題
var num int = 6;//這行程式碼表示什麼複製程式碼
肯定有聰明小夥伴會說:這是定義了一個整型的數並給它賦值為6嘛。
恭喜你答對了
從計算機角度來說你是在記憶體空間中申請了一塊地方,在將6放了進去
那麼問題來了
var ptr *int
這個程式碼又代表什麼呢?
其實*int和int寫的位置都是一樣的,也就是代表說他們的代表的都是型別,int代表整形,而*int代表整形的指標。
這時,你就應該明白了指標是一種型別。
那麼指標是幹什麼用的呢?
回想一下,在日常生活中我們都去過超市買東西,買東西的時候要把包放到櫃子裡,每次存櫃子的時候機器是不是會給你一個紙質的條形碼?條形碼上面是不是寫著櫃子是XXX號?我們現在把電腦的記憶體就想像成這些櫃子,我們平時寫的資料就像你的包一樣。而指標就是我們手中的那張紙質的條形碼。我們通過這個條形碼來找到那個櫃子取出或者放入我們的包。從計算機的角度來說,他根據指標來找到記憶體地址來存入資料。
問題2 指標怎麼使用?
上面我們大概知道指標是個什麼東西了,那麼它該如何使用呢?我們在拿上面的那個程式碼舉例子
var num int = 6;//沒錯,又是我複製程式碼
我們為什麼要定義這個數,是不是為了將這個6存到這個變數num裡方便我們以後去使用它?
var ptr *int//現在我們又定義了一個整型的指標複製程式碼
現在我們定義了一個整形的指標也是為了將一個數的地址儲存下來存入這個變數prt裡
var ptr *int = &num複製程式碼
到了這行程式碼很多人又開始迷惑了,這是啥啊。首先我們需要知道&這個符號的作用,它是取出一個變數的地址。
而指標需要存的就是一個地址,所以我們藉助&這個運算子將num的地址取出並存到prt這個變數當中。
好了,這時候我們可以說ptr這個針指向了num這個變數
這時我們輸出一下這些值
package main
import "fmt"
func main() {
var num int = 6
var ptr *int = &num
fmt.Println(&num)
fmt.Println(ptr)
}複製程式碼
結果是
0xc000060080
0xc000060080複製程式碼
具體出現的值每個計算機可能都不一樣,但這兩個值一定是相同的。
這就說明prt將num的地址記錄了
問題3 *這個符號出現的位置不同,作用也不一樣你知道嗎?
很多同學(包括我)都對被*這個符號經常搞蒙比如說以下幾行程式碼
package main
import "fmt"
func main() {
var num int = 6
var ptr *int = &num
fmt.Println(*ptr)
*ptr = 7
fmt.Println(ptr)
fmt.Println(*ptr)
}複製程式碼
感覺哪都是*,有什麼區別嗎
其實是有的
我們先輸出一下結果
6
0xc000060080
7複製程式碼
我們會發現輸出有沒有*差別會很大
首先這一行程式碼var ptr *int = &num
這裡的*是告訴計算機它是一個指標變數,*int代表著它是一個指向int型變數的指標
而fmt.Println(*ptr)這裡的*是什麼作用呢?
記不記得&這個符號?
它是取出一個變數的地址
因為ptr此時存的是num變數的地址
fmt.Println(*ptr)這裡的*的作用:通過地址來取值
等等等,等一下,怎麼*一會來定義一會來取值啊,它到底什麼作用啊?
*的作用其實看它出現在哪裡
出現在定義裡面它的作用是告訴計算機這是一個指標變數
package main
import "fmt"
func main() {
var num int = 6
var ptr *int = &num
}複製程式碼
而出現在除了定義以外的地方表示通過地址來取出裡面的值
package main
import "fmt"
func main() {
var num int = 6
var ptr *int = &num
*ptr = 7 //這裡等價於num = 7
}複製程式碼
好了以上就是我在golang裡總結的指標一些知識
(第一次寫技術部落格有什麼錯誤的地方還希望大家多多指正,以後我會經常寫一些自己在學習遇到的一些知識點,希望能夠互相學習( ̄▽ ̄))