## 函數定義
函數聲明包含一個函數名,參數列表, 返回值列表和函數體。如果函數沒有返回值,則返回列表可以省略。函數從第一條語句開始執行,直到執行return語句或者執行函數的最后一條語句。
函數可以沒有參數或接受多個參數。
注意類型在變量名之后 。
當兩個或多個連續的函數命名參數是同一類型,則除了最后一個類型之外,其他都可以省略。
函數可以返回任意數量的返回值。
使用關鍵字 func 定義函數,左大括號依舊不能另起一行。
``` go
package main
import "fmt"
func test(fn func() int) int {
return fn()
}
// 定義函數類型。
type FormatFunc func(s string, x, y int) string
func format(fn FormatFunc, s string, x, y int) string {
return fn(s, x, y)
}
func main() {
s1 := test(func() int { return 100 }) // 直接將匿名函數當參數。
s2 := format(func(s string, x, y int) string {
return fmt.Sprintf(s, x, y)
}, "%d, %d", 10, 20)
println(s1, s2)
}
```
## 參數
### 函數參數
函數定義時指出,函數定義時有參數,該變量可稱為函數的形參。形參就像定義在函數體內的局部變量。
但當調用函數,傳遞過來的變量就是函數的實參,函數可以通過兩種方式來傳遞參數:
值傳遞:指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。
``` go
package main
import (
"fmt"
)
/* 定義相互交換值的函數 */
func swap(x, y *int) {
var temp int
temp = *x /* 保存 x 的值 */
*x = *y /* 將 y 值賦給 x */
*y = temp /* 將 temp 值賦給 y*/
}
func main() {
var a, b int = 1, 2
/*
調用 swap() 函數
&a 指向 a 指針,a 變量的地址
&b 指向 b 指針,b 變量的地址
*/
swap(&a, &b)
fmt.Println(a, b)
}
```