不知不覺已經工做一週了,面對java轉go第一件不適應的事,就是指針它lei了,由於java把指針給隱藏了,我學習java的時候並無太在乎指針的問題,可是在看go文檔時赫然發現指針它又回來了。
咱們首先得明確這一點,先問個其餘問題java
var num int = 6;//這行代碼表示什麼複製代碼
確定有聰明小夥伴會說:這是定義了一個整型的數並給它賦值爲6嘛。golang
恭喜你答對了bash
從計算機角度來講你是在內存空間中申請了一塊地方,在將6放了進去
學習
那麼問題來了spa
var ptr *int指針
這個代碼又表明什麼呢?code
其實*int和int寫的位置都是同樣的,也就是表明說他們的表明的都是類型,int表明整形,而*int表明整形的指針。cdn
這時,你就應該明白了指針是一種類型。blog
那麼指針是幹什麼用的呢?內存
回想一下,在平常生活中咱們都去過超市買東西,買東西的時候要把包放到櫃子裏,每次存櫃子的時候機器是否是會給你一個紙質的條形碼?條形碼上面是否是寫着櫃子是XXX號?咱們如今把電腦的內存就想像成這些櫃子,咱們平時寫的數據就像你的包同樣。而指針就是咱們手中的那張紙質的條形碼。咱們經過這個條形碼來找到那個櫃子取出或者放入咱們的包。從計算機的角度來講,他根據指針來找到內存地址來存入數據。
上面咱們大概知道指針是個什麼東西了,那麼它該如何使用呢?咱們在拿上面的那個代碼舉例子
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的地址記錄了
不少同窗(包括我)都對被*這個符號常常搞蒙好比說如下幾行代碼
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裏總結的指針一些知識
(第一次寫技術博客有什麼錯誤的地方還但願你們多多指正,之後我會常常寫一些本身在學習遇到的一些知識點,但願可以互相學習( ̄▽ ̄))