GoLang學習筆記(十八)函式的傳值和傳引用

2021-09-09 06:26:57 字數 1471 閱讀 4621

值傳遞:是指在呼叫函式時將實際引數複製乙份傳遞到函式中,在函式中如果對值進行修改,不會影響到實際引數

引用傳遞:是指在呼叫函式時將實際引數的位址傳遞乙份到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數

嚴格來說go語言只有值傳遞一種傳參方式,go語言是沒有引用傳遞的。

go語言中可以借助傳指標來實現引用傳遞的效果,函式引數使用指標引數,傳參時其實是在拷貝乙份指標引數,也就是拷貝了乙份變數位址

go語言中,string、int、bool、陣列、stuct都屬於非引用資料型別。

go語言中,指標、slice切片、map、chan都是引用資料型別,引用的時候也是類似指標位址。

傳引用和引用型別是兩個概念。

先來測試基本的string和int,寫兩個函式:

func changeintval(a int) 

func changeintptr(a *int)

func changestrin**al(str string)

func changestringptr(str *string)

然後在main()函式裡呼叫:

a := 10

//傳值

changeintval(a)

//傳引用

changeintptr(&a)

str := "hello world"

//傳值

changestrin**al(str)

//傳引用

changestringptr(&str)

執行結果如下:

可以看到在非引用型別資料,只能通過指標這種引用型別,才能改變原值的資料。

也可以看到值傳遞的時候,僅僅是將原值複製了乙份,進行拷貝後,放在了乙個新的記憶體位址中。

再比較一下兩個非常相似的資料型別:陣列(非引用資料型別)與切片(引用資料型別)

還是先寫兩個函式:

func changearrayval(ints [4]int) 

func changearrayptr(ints *[4]int)

func changesliceval(ints int)

func changesliceptr(ints *int)

還是在main()函式裡進行呼叫:

ints := [4]int

//傳值

changearrayval(ints)

//傳引用

changearrayptr(&ints)

ints1 := int

//傳值

changesliceval(ints1)

//傳引用

changesliceptr(&ints1)

執行結果如下:

可以看到陣列這種非引用資料型別和前面兩個非引用資料型別是一樣的,不能通過函式傳值的方式進行修改。

而切片則不同,切片本身就是引用型別,所以直接就能修改。

Golang學習筆記 函式

go函式定義格式如下 func function name parameter list return types 例如 func add n1,n2 int int go可以很靈活的建立函式,並作為另外乙個函式的實參 type gettownumberresultfunc func int int...

golang學習筆記 函式

不定引數型別函式定義 args type package main import fmt func func01 a byte,args int func main 輸出 len arg is 3 a is c 定義函式型別 package main import fmt func add a,b ...

Golang學習筆記 九 函式

什麼是函式?函式是乙個打包好的語句序列單元,我們將多個語句邏輯定義成為乙個函式,這樣方便我們在程式中多次呼叫,而在golang語言,函式更是一等公民,在我們的開發中隨處可見。乙個函式,由關鍵字func 函式名 形參列表,返回值列表和函式體五個部分組成,格式如下 func name arg int e...