go語言的值傳遞和指針傳遞

Go允許通過指針(有時稱為引用)和值來傳遞參數(shù)。在這篇文章中,我們將比較兩種方法,特別注意可能影響選擇的不同情境祈惶。

指針傳遞與值傳遞

嚴格地說,go方法或函數(shù)只有一種傳遞方式扮匠,那就是值傳遞行瑞。每次將一個變量作為參數(shù)傳遞時,都會創(chuàng)建一個新的變量副本并將其傳遞給所調(diào)用的函數(shù)或方法餐禁。副本分配在不同的內(nèi)存地址。

在指針傳遞變量的情況下突照,將創(chuàng)建指向相同內(nèi)存地址的新副本帮非。為了感受它們之間的差異,我們來看看它是如何工作的讹蘑。

值傳遞

package main

import "fmt"

type Person struct {  
    firstName string
    lastName  string
}

func changeName(p Person) {  
    p.firstName = "Bob"
}

func main() {  
    person := Person {
        firstName: "Alice",
        lastName: "Dow",
    }

    changeName(person)

    fmt.Println(person)
}

運行代碼將得到以下輸出:

{Alice Dow}

請注意末盔,即使函數(shù)changeName將firstName更改為“Bob”,但更改不會影響main函數(shù)中的變量person座慰。發(fā)生這種情況是因為函數(shù)changeName修改了變量person的一個副本陨舱,而不是person本身。

指針傳遞

package main

import "fmt"

type Person struct {  
    firstName string
    lastName  string
}

func changeName(p *Person) {  
    p.firstName = "Bob"
}

func main() {  
    person := Person {
        firstName: "Alice",
        lastName: "Dow",
    }

    changeName(&person)

    fmt.Println(person)
}

運行代碼將得到以下輸出:

{Bob Dow}

在這種情況下版仔,函數(shù)main中的變量person在函數(shù)changeName中被修改游盲。發(fā)生這種情況是因為&person和p是存儲在相同內(nèi)存地址的相同結構的兩個不同指針。

預定的選擇

有時選擇是由使用上下文預先確定的蛮粮。讓我們來看看最常見的用例益缎。

變量不能被修改

我們沒有其他的選擇,只能通過值傳遞然想。所以這個變量不能在下游修改莺奔。反之亦然,如果變量被期望修改变泄,它必須通過指針傳遞令哟。

變量是一個大的結構

如果變量是一個大的結構恼琼,性能是一個問題,最好是通過指針傳遞變量屏富。這樣可以避免在內(nèi)存中復制整個結構晴竞。

變量是一個map或slice

Go中的map和slice是引用類型,應該通過值傳遞役听。

值傳遞通常開銷更小

即使Go看起來有點像C颓鲜,它的編譯器工作方式也不同。C的類比并不總是和Go一起工作典予。在Go中值傳遞可能比指針傳遞開銷更小甜滨。發(fā)生這種情況是因為Go使用逃逸分析來確定變量是否可以安全地分配到函數(shù)的棧幀上,這可能比在堆上分配變量開銷小的多瘤袖。通過值傳遞可以簡化Go中的逃逸分析衣摩,并為變量提供更好的分配機會。

最后

有時如何通過變量的選擇是由變量類型或其用法預先確定的捂敌。否則艾扮,強烈建議按值傳遞變量。此外占婉,與使自己的選擇保持一致非常重要泡嘴,以免混淆自己和隊友。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逆济,一起剝皮案震驚了整個濱河市酌予,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奖慌,老刑警劉巖抛虫,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異简僧,居然都是意外死亡建椰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門岛马,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棉姐,“玉大人,你說我怎么就攤上這事啦逆×潞#” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵蹦浦,是天一觀的道長扭吁。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么侥袜? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任蝌诡,我火速辦了婚禮,結果婚禮上枫吧,老公的妹妹穿的比我還像新娘浦旱。我一直安慰自己,他們只是感情好九杂,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布颁湖。 她就那樣靜靜地躺著,像睡著了一般例隆。 火紅的嫁衣襯著肌膚如雪甥捺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天镀层,我揣著相機與錄音镰禾,去河邊找鬼。 笑死唱逢,一個胖子當著我的面吹牛吴侦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坞古,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼备韧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痪枫?” 一聲冷哼從身側(cè)響起织堂,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎听怕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虑绵,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡尿瞭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翅睛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片声搁。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捕发,靈堂內(nèi)的尸體忽然破棺而出疏旨,到底是詐尸還是另有隱情,我是刑警寧澤扎酷,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布檐涝,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谁榜。R本人自食惡果不足惜幅聘,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窃植。 院中可真熱鬧帝蒿,春花似錦、人聲如沸巷怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胖替,卻和暖如春豫缨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背好芭。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工舍败, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裙戏。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓累榜,卻偏偏與公主長得像灵嫌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寿羞,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容