go語言:函數參數傳遞詳解

參數傳遞是指在程序的傳遞過程當中,實際參數就會將參數值傳遞給相應的形式參數,而後在函數中實現對數據處理和返回的過程。比較常見的參數傳遞有:值傳遞,按地址傳遞參數或者按數組傳遞參數。golang

一、常規傳遞數組

使用普通變量做爲函數參數的時候,在傳遞參數時只是對變量值得拷貝,即將實參的值複製給變參,當函數對變參進行處理時,並不會影響原來實參的值。bash

例如:函數

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)
}
複製代碼

輸出結果:5 10測試

傳遞給swap的是x,y的值得拷貝,函數對拷貝的值作了交換,但卻沒有改變x,y的值。ui

二、指針傳遞spa

函數的變量不只可使用普通變量,還可使用指針變量,使用指針變量做爲函數的參數時,在進行參數傳遞時將是一個地址看唄,即將實參的內存地址複製給變參,這時對變參的修改也將會影響到實參的值。指針

咱們仍是用上面的的例子,稍做修改以下:code

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)
}
複製代碼

輸出結果:10 5內存

三、數組元素做爲函數參數

使用數組元素做爲函數參數時,其使用方法和普通變量相同,便是一個「值拷貝」。

例:

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])
}
複製代碼

輸出結果:3

能夠看到將數組元素s[2]的值做爲函數的實參,無論對形參作什麼操做,實參都沒有改變。

四、數組名做爲函數參數

和其餘語言不一樣的是,go語言在將數組名做爲函數參數的時候,參數傳遞便是對數組的複製。在形參中對數組元素的修改都不會影響到數組元素原來的值。這個和上面的相似,就不貼代碼了,有興趣的自行編寫代碼測試下吧。

五、slice做爲函數參數

在使用slice做爲函數參數時,進行參數傳遞將是一個地址拷貝,即將底層數組的內存地址複製給參數slice。這時,對slice元素的操做就是對底層數組元素的操做。例如:

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])
}
複製代碼

運行結果:101

六、函數做爲參數

在go語言中,函數也做爲一種數據類型,因此函數也能夠做爲函數的參數來使用。例如:

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)
}
複製代碼

運行結果:11

函數sum做爲函數function的形參,而變量f是一個函數類型,做爲function()調用時的實參。

原文出處:golang語言社區

相關文章
相關標籤/搜索