蟲蟲用6個簡例帶你玩轉Golang指針

蟲蟲用6個簡例帶你玩轉Golang指針

學過C語言的老司機都知道,指針就是一個變量,用於存儲另一個變量的內存地址。

那麼什麼是變量呢?在現代計算機體系結構中所有的需要執行的信息代碼都需要存儲在內存中,為了管理存儲在內存的數據,內存是劃分為不同的區域的,不同區域都用內存地址來標識。一個典型的內存地址是個16進制的8位數(一個字節)比如0xAFFFF(這是一個內存地址的十六進制表示)。

要訪問數據,我們需要知道它的存儲地址。我們可以跟蹤存儲與我們的程序相關的數據的所有內存地址。但是要記住這些內存地址,非常費勁,怎麼辦呢?

於是我們引入了變量的概念。變量只是給存儲數據的內存地址的好記得別名。指針也是一個變量。但它是一種特殊的變量,因為它存儲的數據不僅僅是一個普通的值,如簡單的整數或字符串,而是另一個變量的內存地址。

蟲蟲用6個簡例帶你玩轉Golang指針

在上面的圖中,指針p包含變量a的地址值0x0001。

The of a pointer is nil. That means any uninitialized pointer will have the value nil. Let's see a complete example -

package main

import "fmt"

func main() {

var p *int

fmt.Println("p = ", p)

}

# Output

p =

//類型T的指針

var p *T

類型T是指針指向的變量的類型。比如整型指針:

//類型為整型指針

var p *int

p指針只能保存int變量的內存地址。

指針的零值,不是0,而是nil。任何未初始化的指針值都為nil。我們直接擼一個代碼:

package main

import "fmt"

func main() {

var p *int

fmt.Println("chongchong p = ", p)

}

蟲蟲用6個簡例帶你玩轉Golang指針

初始化指針

初始化一個指針,只需給他賦予其他變量的內存地址接口。變量的地址可以使用使用&運算符獲得:

var x = 100

var p *int = &x

上面我們通過對x做&運算符來獲取其地址,然後將該地址分配給指針p。

var p = &x

擼代碼之例2 :

package main

import "fmt"

func main() {

var a = 3.1415926

var p = &a

fmt.Println("chongchong value a = ", a)

fmt.Println("chongchong Address a = ", &a)

fmt.Println("chongchong value p = ", p)

}

輸出結果

蟲蟲用6個簡例帶你玩轉Golang指針

指針解引用

要獲得指針指向地址的值,我們可以使用*運算符。這叫解引用。

package main

import "fmt"

func main() {

var a = 100

var p = &a

fmt.Println("chongchong a = ", a)

fmt.Println("chongchong p = ", p)

fmt.Println("chongchong *p = ", *p)

}

輸出入下:

蟲蟲用6個簡例帶你玩轉Golang指針

通過*運算符不僅能取值,還可以對指向變量值做修改。以下示例通過指針p設置存儲在變量a中的值:

package main

import "fmt"

func main() {

var a = 8888

var p = &a

fmt.Println("chongchong a = ", a)

*p +=1112

fmt.Println("chongchong a(altered)= ", a)

}結果如下:

蟲蟲用6個簡例帶你玩轉Golang指針

多重指針

指針可以指向任何類型的變量。所以也可以指向另一個指針。以下示例顯示如何創建指向另一個指針的指針:

package main

import "fmt"

func main() {

var a = 3.141596

var p = &a

var pp = &p

fmt.Println("a = ", a)

fmt.Println("chong address a = ", &a)

fmt.Println("p = ", p)

fmt.Println("chongchong p = ", &p)

fmt.Println("pp = ", pp)

fmt.Println("chongchong *pp = ", *pp)

fmt.Println("chongchong **pp = ", **pp)

}

結果輸出為

蟲蟲用6個簡例帶你玩轉Golang指針

Go中沒有指針算術

老司機,都知道,可以在C/C ++中隊指針做計算,但是golang就不支持那樣做了。

package main

func main() {

var x = 67

var p = &x

var p1 = p + 1 // Compiler Error: invalid operation

}

但是,golang中可以使用==運算符來比較兩個相同類型的指針是否相等。

包主要

package main

import "fmt"

func main() {

var a = 3014

var p1 = &a

var p2 = &a

if p1 == p2 {

fmt.Printf("chongchong p1(%x) = p2(%x) value(%d): \n",p1,p2,*p1)

}

}

結果為:

蟲蟲用6個簡例帶你玩轉Golang指針


分享到:


相關文章: