go語言:函數(shù)參數(shù)傳遞詳解

參數(shù)傳遞是指在程序的傳遞過程中柒爵,實際參數(shù)就會將參數(shù)值傳遞給相應的形式參數(shù),然后在函數(shù)中實現(xiàn)對數(shù)據(jù)處理和返回的過程。比較常見的參數(shù)傳遞有:值傳遞赡艰,按地址傳遞參數(shù)或者按數(shù)組傳遞參數(shù)。

1斤葱、常規(guī)傳遞

使用普通變量作為函數(shù)參數(shù)的時候慷垮,在傳遞參數(shù)時只是對變量值得拷貝,即將實參的值復制給變參揍堕,當函數(shù)對變參進行處理時料身,并不會影響原來實參的值。

例如:

package main
import (
"fmt"
)
func swap(a int, b int) {
var temp int
temp = a
a = b
b = temp
}
func main() {
x := 5
y := 10
swap(x, y)
fmt.Print(x, y)
}
輸出結(jié)果:5 10

傳遞給swap的是x衩茸,y的值得拷貝芹血,函數(shù)對拷貝的值做了交換,但卻沒有改變x,y的值楞慈。

2幔烛、指針傳遞

函數(shù)的變量不僅可以使用普通變量,還可以使用指針變量囊蓝,使用指針變量作為函數(shù)的參數(shù)時饿悬,在進行參數(shù)傳遞時將是一個地址看唄,即將實參的內(nèi)存地址復制給變參聚霜,這時對變參的修改也將會影響到實參的值狡恬。

我們還是用上面的的例子,稍作修改如下:

package main
import (
"fmt"
)
func swap(a *int, b *int) {
var temp int
temp = *a
*a = *b
*b = temp
}
func main() {
x := 5
y := 10
swap(&x, &y)
fmt.Print(x, y)
}
輸出結(jié)果:10 5

3俯萎、數(shù)組元素作為函數(shù)參數(shù)

使用數(shù)組元素作為函數(shù)參數(shù)時傲宜,其使用方法和普通變量相同,即是一個“值拷貝”夫啊。

例:

package main
import (
"fmt"
)
func function(a int) {
a += 100
}
func main() {
var s = [5]int{1, 2, 3, 4, 5}
function(s[2])
fmt.Print(s[2])
}
輸出結(jié)果:3

可以看到將數(shù)組元素s[2]的值作為函數(shù)的實參函卒,不管對形參做什么操作,實參都沒有改變。

4报嵌、數(shù)組名作為函數(shù)參數(shù)

和其他語言不同的是虱咧,go語言在將數(shù)組名作為函數(shù)參數(shù)的時候,參數(shù)傳遞即是對數(shù)組的復制锚国。在形參中對數(shù)組元素的修改都不會影響到數(shù)組元素原來的值腕巡。這個和上面的類似,就不貼代碼了血筑,有興趣的自行編寫代碼測試下吧绘沉。

5、slice作為函數(shù)參數(shù)

在使用slice作為函數(shù)參數(shù)時豺总,進行參數(shù)傳遞將是一個地址拷貝车伞,即將底層數(shù)組的內(nèi)存地址復制給參數(shù)slice。這時喻喳,對slice元素的操作就是對底層數(shù)組元素的操作另玖。例如:

package main
import (
"fmt"
)
func function(s1 []int) {
s1[0] += 100
}
func main() {
var a = [5]int{1, 2, 3, 4, 5}
var s []int = a[:]
function(s)
fmt.Println(s[0])
}
運行結(jié)果:101

6、函數(shù)作為參數(shù)

在go語言中表伦,函數(shù)也作為一種數(shù)據(jù)類型谦去,所以函數(shù)也可以作為函數(shù)的參數(shù)來使用。例如:

package main
import (
"fmt"
)
func function(a, b int, sum func(int, int) int) {
fmt.Println(sum(a, b))
}
func sum(a, b int) int {
return a + b
}
func main() {
var a, b int = 5, 6
f := sum
function(a, b, f)
}
運行結(jié)果:11

函數(shù)sum作為函數(shù)function的形參蹦哼,而變量f是一個函數(shù)類型鳄哭,作為function()調(diào)用時的實參。

原文出處:golang語言社區(qū)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窃诉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赤套,更是在濱河造成了極大的恐慌飘痛,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件容握,死亡現(xiàn)場離奇詭異,居然都是意外死亡剔氏,警方通過查閱死者的電腦和手機塑猖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谈跛,“玉大人羊苟,你說我怎么就攤上這事「泻叮” “怎么了蜡励?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我凉倚,道長兼都,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任稽寒,我火速辦了婚禮扮碧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杏糙。我一直安慰自己慎王,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布宏侍。 她就那樣靜靜地躺著柬祠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪负芋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天嗜愈,我揣著相機與錄音旧蛾,去河邊找鬼。 笑死蠕嫁,一個胖子當著我的面吹牛锨天,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剃毒,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼病袄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赘阀?” 一聲冷哼從身側(cè)響起益缠,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎基公,沒想到半個月后幅慌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡轰豆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年胰伍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酸休。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡骂租,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斑司,到底是詐尸還是另有隱情渗饮,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抽米,受9級特大地震影響特占,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜云茸,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一是目、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧标捺,春花似錦懊纳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闺兢,卻和暖如春茂缚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屋谭。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工脚囊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桐磁。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓悔耘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親我擂。 傳聞我的和親對象是個殘疾皇子衬以,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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