Go語言函數值傳遞和參照傳遞

2020-07-16 10:05:08
Go語言預設使用按值傳遞來為函數傳遞引數,也就是傳遞引數的副本,函數接收引數副本之後,在使用變數的過程中可能對副本的值進行更改,但不會影響到原來的變數 。

如果你希望函數可以直接修改引數的值,而不是對引數的副本進行操作,則需要將引數的地址(變數名前面新增 & 符號,比如 &variable)傳遞給函數,這就是按參照傳遞,比如 Function(&arg1) ,此時傳遞給函數的是一個指標。

幾乎在任何情況下,傳遞指標的消耗都比傳遞副本來得少,在函數呼叫時,像切片(slice)、字典(map)、介面(interface)、通道(channel)這樣的參照型別都是預設使用參照傳遞(即使沒有顯示的指出指標)。

有些函數只是完成一個任務,並沒有返回值,我們僅僅是利用了這種函數的副作用,就像輸出文字到終端,傳送一個郵件或者是記錄一個錯誤等,但是絕大部分的函數還是帶有返回值的。

下面的範例中 MultiPly3Nums 函數帶有三個形參,分別是 a 、b 、c ,還有一個 int 型別的返回值(被註釋的程式碼具有和未註釋部分同樣的功能,只是多引入了一個本地變數):
package main
import "fmt"
func main() {
    fmt.Printf("Multiply 2 * 5 * 6 = %dn", MultiPly3Nums(2, 5, 6))
    // var i1 int = MultiPly3Nums(2, 5, 6)
    // fmt.Printf("MultiPly 2 * 5 * 6 = %dn", i1)
}
func MultiPly3Nums(a int, b int, c int) int {
    // var product int = a * b * c
    // return product
    return a * b * c
}
輸出結果如下所示:

Multiply 2 * 5 * 6 = 60

如果一個函數需要返回四到五個值,我們可以傳遞一個切片或者結構體給函數,因為傳遞一個指標允許直接修改變數的值,消耗也更少。