參數(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ū)