Go語言入門總結(jié)(六)-指針

指針

1.&和*

在go語言中锥余,也有指針的概念宴倍,不同于java直奋。是沒有指針的概念的。但是go語言的指針也并沒有c中的復(fù)雜九杂。

首先需要了解的是指針相關(guān)的兩個符號 & 和 * 這兩種符號闽寡。
& 代表了地址操作符,表示的是取到的一個變量或者結(jié)構(gòu)的內(nèi)存地址
* 代表解地址操作尼酿,對于&類型的的變量取出它們值,如果放在類型前面則表示是指針類型植影。

func main() {
    a := "a"
    fmt.Println(&a)//0xc0000501f0

    b := &a
    fmt.Println(*b)//a
}

當(dāng)用*表示指針類型時裳擎,傳入的值需要是一個內(nèi)存地址的值,也就是傳入的值是使用&表示或者隱式指針思币。
如果改變內(nèi)存地址上的值鹿响,那么所有指向該地址的值都將被修改羡微。

func main() {
    //定義一個string的指針類型,然后通過取地址b賦值給a惶我,通過解引用打印出a
    var a *string
    b := "a"
    a = &b
    fmt.Println(*a)//a

    //這個時候如果修改b的值那么*a的值也將會改變妈倔,因為a存儲的是b的地址值
    //所以當(dāng)b的值改變時,a通過該地址解析出的值也會是b改變了的值
    b ="b"
    fmt.Println(*a)//b

    //當(dāng)然*a表示的也是a指向的內(nèi)存地址上的值绸贡,所以改變*a的值也相當(dāng)于改變了所有指向a地址的值盯蝴。
    //因為最開始將b的地址賦值給了a,所以*a改變時听怕,b的值也發(fā)生了改變
    *a = "c"
    fmt.Println(b)//c
}

上面例子中a可以理解為是一個普通的變量捧挺,如果將a賦值給其它變量,那和普通變量賦值沒什么區(qū)別尿瞭,對于系統(tǒng)來說是把a地址上的值拷貝了一份給另一個變量闽烙。

2.結(jié)構(gòu)和數(shù)組的指針

對于結(jié)構(gòu)和數(shù)組,go語言提供了一些人性化的操作声搁,自動解引用黑竞。

func main() {
    type skill struct{
        time int
    }

    type people struct {
        name string
        age  int32
        skill
    }

    var zhangshan = &people{name: "張三"}

    //兩種方式都是相同的結(jié)果,因為go語言幫我們自動解引用了疏旨,所以我們可以去除多余的括號和*
    fmt.Println((*zhangshan).name)
    fmt.Println(zhangshan.name)
    
    //但是如果你要改變該地址的值很魂,相當(dāng)于在這個地址,重新new一個people充石,那么*號必不可少
    *zhangshan = people{name: "李四"}
    
    //數(shù)組也會自動解引用
    num := &[8]int{0,1,2,3,4,5,6,7}

    fmt.Println(num[1])
    fmt.Println(num[1:4])
}

3.將指針作為參數(shù)或方法的接收者莫换、內(nèi)部指針

使用指針傳遞可以起到改變值的作用。

func main() {
    one := people{
        name: "張三",
        age: 17,
        skill:skill{
            time: 10,
        },
    }
    fmt.Println(one.age)//17
    agePlusMistaken(one)//數(shù)據(jù)只是拷貝了一份過去
    fmt.Println(one.age)//17

    agePlus(&one)

    fmt.Println(one.age)//18

    //同理骤铃,使用指針類型的作為接收者時拉岁,也會起到改變值的效果
    one.agePlus()
    fmt.Println(one.age)//19

    //對于嵌套結(jié)構(gòu)來說,go語言提供了內(nèi)部指針這種方式惰爬,為我們輕松確定結(jié)構(gòu)中指定字段的內(nèi)存地址
    fmt.Println(one.time)//10
    timePlus(&one.skill)
    fmt.Println(one.time)//11
}

type people struct {
    name string
    age  int32
    skill
}

func (p *people) agePlus(){
    p.age++
}

func agePlus(p *people){
    p.age++
}

func agePlusMistaken(p people){
    p.age++
}

type skill struct{
    time int
}

func timePlus(s *skill){
    s.time++
}

并且大家應(yīng)該注意到喊暖,上面的代碼在one并不是一個內(nèi)存地址類型。但是對于結(jié)構(gòu)體來說撕瞧,他可以自動傳入的引用或非引用參數(shù)陵叽,而不需要加&號。
但是對于內(nèi)部嵌套數(shù)據(jù)的地址丛版,則必須得通過&來進行調(diào)用

4.隱式指針

對于map來說巩掺,它本身就是一種指針,所以在傳遞的時候默認就是以指針形式傳遞页畦,對它的修改也會導(dǎo)致它原本的數(shù)據(jù)被修改胖替。(文章4說map的時候有提到過)
切片也是通過指針來設(shè)置他在一個數(shù)組里面的長度、容量和位置的。

5.指針和接口

接口也可以使用指針類型的接收者独令。
但是當(dāng)接收者為非指針時端朵,無論傳遞指針和非指針形式,對傳遞的值都不會有影響燃箭,也都可以正常調(diào)用冲呢。
但是當(dāng)接收者為指針類型時,只能傳遞指針類型的變量招狸,并且在接口內(nèi)部修改值會對外部值產(chǎn)生影響敬拓。

func main() {
    p := people{
        name: "張三",
        age: 10,
    }
    hello(p)
    fmt.Println(p.age)//10
    hello(&p)
    fmt.Println(p.age)//10

    p2 := people2{
        name: "張三",
        age: 10,
    }
    //hello(p2)  當(dāng)變?yōu)橹羔槙r,只能傳遞指針類型
    fmt.Println(p2.age)//10
    hello(&p2)
    fmt.Println(p2.age)//11
}

type speaker interface {
    speak() string
}

type people struct {
    name string
    age  int32
}

func (p people) speak() string {
    p.age++
    return p.name + " 說你好呀瓢颅!"
}

type people2 struct {
    name string
    age  int32
}

func (p *people2) speak() string {
    p.age++
    return p.name + " 說你好呀恩尾!"
}

func hello(t speaker) {
    fmt.Println(t.speak())
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挽懦,隨后出現(xiàn)的幾起案子翰意,更是在濱河造成了極大的恐慌,老刑警劉巖信柿,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冀偶,死亡現(xiàn)場離奇詭異,居然都是意外死亡渔嚷,警方通過查閱死者的電腦和手機进鸠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來形病,“玉大人客年,你說我怎么就攤上這事∧牵” “怎么了量瓜?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長途乃。 經(jīng)常有香客問我绍傲,道長,這世上最難降的妖魔是什么耍共? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任烫饼,我火速辦了婚禮,結(jié)果婚禮上试读,老公的妹妹穿的比我還像新娘杠纵。我一直安慰自己,他們只是感情好钩骇,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布淡诗。 她就那樣靜靜地躺著骇塘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪韩容。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天唐瀑,我揣著相機與錄音群凶,去河邊找鬼。 笑死哄辣,一個胖子當(dāng)著我的面吹牛请梢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播力穗,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼毅弧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了当窗?” 一聲冷哼從身側(cè)響起够坐,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崖面,沒想到半個月后元咙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡巫员,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年庶香,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片简识。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赶掖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出七扰,到底是詐尸還是另有隱情奢赂,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布戳寸,位于F島的核電站呈驶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疫鹊。R本人自食惡果不足惜袖瞻,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拆吆。 院中可真熱鬧聋迎,春花似錦、人聲如沸枣耀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牺堰,卻和暖如春拄轻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伟葫。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工恨搓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筏养。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓斧抱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渐溶。 傳聞我的和親對象是個殘疾皇子辉浦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353