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