Go指針,如此輕鬆掌握,但願有收穫

開篇語

依稀記得大學必修課,C語言中的指針,簡直是噩夢,指來指去,有沒有暈乎乎的感受,我在想是否是也由於如此,因此Java語言的開發者C才比C語言的多,Java正由於解決了C的痛點,因此今天才能變成語言排行榜佔其首,Go做爲後起之秀,又引入這麼複雜難懂的概念,可見指針咱們仍是須要學習的,下面咱們一塊兒體驗一下go的指針吧golang

指針的理解

  • 個人理解指針(Point),一個變量指向內存中存儲某個值的地址,那麼這個變量是一個指針變量,我的是如此理解的,也就是說指針指的是地址,而不是值
  • 百度百科的定義,指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向存在電腦存儲器中另外一個地方的值。因爲經過地址能找到所需的變量單元,能夠說,地址指向該變量單元。所以,將地址形象化的稱爲「指針」。意思是經過它能找到以它爲地址的內存單元。

Go的指針

在Go中指針有兩個概念,一個指針變量是能夠指向任何一個值的內存地址,指針變量也是佔用存儲空間的,在32位系統中佔用4個字節,在64位系統中佔用8個字節,與這個地址存儲的值的大小沒有關係指針類型指針類型和指針變量一塊出現,指的是這個指針變量的類型是什麼,好比咱們聲明瞭一個temp int = 1,那麼temp變量的這個類型是 int,同時指針變量也是有指針類型的,用 *T表示,T是type的意思,表明具體的類型,好比 pointTemp *int  = &temp, 表明 pointTemp這個變量是指針變量,類型是*int咱們看下面一段代碼編程

func PointStudy()  {   
    // 每個變量在運行時都有一個地址(這個地址存儲着這個變量對應的值)  
    var temp int = 1   
    //  go語言的取地址符, temp 變量,經過&符號來獲取temp這個變量在內存中的地址,咱們將獲取到的地址賦值給一個指針變量 pointTemp ,類型*int   
    var pointTemp *int= &temp
   fmt.Println(temp)   
   fmt.Println(pointTemp)
}
//輸出結果
1
0xc00005a2d0

指針變量也是變量,變量、指針和地址三者的關係是:每個變量都有本身地址,每個指針的值就是地址(也就是這個指針經過fmt.Println輸出後一個地址)微信

如何獲取指針對應的地址的值,go語言中經過 &符號 獲取變量地址,經過 * 來獲取地址存儲的值編程語言

func PointStudy()  {   
// 每個變量在運行時都有一個地址(這個地址存儲着這個變量對應的值)   
var temp int = 1   
// go語言獲取地址符, temp 變量,經過&符號來獲取temp這個變量在內存中的地址,咱們將獲取到的地址賦值給一個指針變量 pointTemp ,類型爲 *int   
var pointTemp *int =temp   
fmt.Println(pointTemp)   
fmt.Println(*pointTemp)}
//輸出結果0xc00005a2d01
// 思考一下這行代碼輸出什麼
fmt.Println(*&temp)

值傳遞和指針傳遞

值傳遞和指針傳遞go語言函數調用時有兩種傳遞方式一種是值傳遞函數

  • 一種是值傳遞,看以下代碼
func ValueTransmit(){  
    temp := 1   
    fmt.Println(";value transmit before:",temp)  
    method1(temp)   
    fmt.Println("value transmit after:",temp)
}
func method1(temp int)  {  
    fmt.Println("method before:",temp)  
    temp = 2   
    fmt.Println("method after;",temp)
}
//結果
value transmit before: 1
method1 before: 1
method1 after 2
value transmit after: 1
//從上邊代碼能夠看出值傳遞是一種copy的方式,temp從ValueTransmit傳遞到method1(),是把temp從新copy了一份,methd1中修改temp是不會影響ValueTransmit中的temp
  • 一種是指針傳遞,看以下代碼:
func PointTransmit(){   
    var temp = 1  
    fmt.Println("point transmit before:",temp)   
    method2(&temp)  
    fmt.Println("point transmit after",temp)
}
func method2(temp *int)  {  
    fmt.Println("method2 before:",*temp)  
    *temp = 2  
    fmt.Println("method2 after:",*temp)
}
//結果
point transmit before: 1
method2 before: 1
method2 after 2
point transmit after: 2

//從上面的代碼中能夠看出指針傳遞後, 對指針所指向地址的值修改後,對其它方法是可見的

歡迎你們關注微信公衆號:「golang那點事」,更多精彩期待你的到來學習

相關文章
相關標籤/搜索