golang——用簡單的方式理解指針

定義

指針,就是保存對(duì)象的內(nèi)存地址。用指針的好處就是節(jié)約內(nèi)存空間。
定義一個(gè)指針類型的變量很簡單,就是在變量名前加*

//基礎(chǔ)類型指針
var ps *string
var pi *int
var pf *float64
var pb *bool

//結(jié)構(gòu)體指針
type Person struct {
    name string
    age  int
}

var pperson *Person

使用

在把指針使用的得心應(yīng)手之前,首先要熟悉go語言中這兩個(gè)操作符:*與&。
先說說&。&變量名,表示對(duì)變量取地址。&可以理解為一個(gè)方法簡寫,這個(gè)方法的唯一參數(shù)是變量名,返回值是一個(gè)內(nèi)存地址(即一個(gè)指針類型變量)。&的使用如下:

//先定義指針
var ps *string
//再定義變量
var s string
s = "i am string"
//通過&操作符取s的內(nèi)存地址,地址保存到指針ps中
ps = &s
fmt.Printf("value of s:%s\n",s)
fmt.Printf("value of ps:%v\n",ps)

以上代碼的執(zhí)行結(jié)果:

value of s:i am string
value of ps:0xc42007a1c0

需要注意的一點(diǎn)就是指針與變量必須是同類型的。你不能把一個(gè)int類型的變量地址賦給一個(gè)string類型的指針。

再來說說*。*在指針的使用中有兩個(gè)角色:
其一,作為指針類型的定義符,本文開篇就用到了
其二,與&符做相反操作,&變量名是對(duì)變量取地址,而*指針名則是對(duì)指針地址取其保存的內(nèi)容。同樣可以理解*是一個(gè)方法的簡寫,此方法唯一參數(shù)是一個(gè)指針類型變量(也就是一個(gè)內(nèi)存地址),返回值是這個(gè)地址保存的變量真實(shí)值。接上段代碼:

fmt.Printf("ps point to:%s\n",*ps)

輸出:

ps point to:i am string

從這三行輸出上可以很明確的看出兩個(gè)操作符的作用了。需要注意的一點(diǎn)就是有兩個(gè)用途,在看別人的代碼時(shí),把這兩種場景區(qū)分開,明確了解每個(gè)起的什么作用,就不會(huì)迷失于*&之海了。


上面只是演示指針怎么用,而實(shí)際項(xiàng)目當(dāng)中最常用的場景就是用指針作方法返回值和參數(shù)了。不難理解,在函數(shù)傳參和返回值的時(shí)候,用指針類型代替值類型,通過引用取值(指針就是對(duì)值的引用),復(fù)用已創(chuàng)建對(duì)象,減少內(nèi)存開銷,當(dāng)然就達(dá)到了節(jié)約內(nèi)存,提高程序效率的目的。實(shí)際傳遞的數(shù)據(jù)類型往往是結(jié)構(gòu)體:

//結(jié)構(gòu)體指針
type Person struct {
    Name string
    Age  int
}

var pperson *Person
var person Person

person = Person{
    "luna",
    20,
}
pperson = &person

然后定義一個(gè)方法,對(duì)于傳入的Person對(duì)象,年齡增加1并返回,參數(shù)和返回值都是用指針:

func yearGone(p *Person) *Person {
    p.Age += 1
    return p
}

func main() {
    person = Person{
        "luna",
        20,
    }
    fmt.Printf("last year:%v\n", person)
    p := yearGone(&person)
    fmt.Printf("now:%v\n", *p)
    fmt.Printf("person now:%v\n", person)
}

輸出:

last year:{luna 20}
now:{luna 21}
person now:{luna 21}

這里從頭到尾,就只創(chuàng)建一個(gè)Person對(duì)象person,所有操作都是對(duì)它自己。注意打印p的內(nèi)容時(shí)用了*p,因?yàn)閜是指針類型變量,直接打印p只是個(gè)地址而已。
當(dāng)你看別人的代碼困惑與為什么這里用了指針而那里沒用時(shí),我的建議是永遠(yuǎn)不要問別人為什么用了(沒用)指針-_-。有時(shí)這個(gè)原因只是“看心情而已”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,612評(píng)論 3 44
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,137評(píng)論 2 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,641評(píng)論 1 32
  • 第十章 指針 1. 地址指針的基本概念: 在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在存儲(chǔ)器中的。一般把存儲(chǔ)器中的一個(gè)字節(jié)稱為...
    堅(jiān)持到底v2閱讀 1,166評(píng)論 2 3
  • 前言 python 版本比較多,2 和 3 相差非常大,很多項(xiàng)目需要跑在同一臺(tái)服務(wù)器上,那就必須有隔離環(huán)境。比如有...
    test小星星閱讀 871評(píng)論 0 2

友情鏈接更多精彩內(nèi)容