**定義:**
~~~
func function_name( [parameter list] ) [return_types] {
函數體
}
~~~
**特性:**
1. 無需聲明原型
2. 不定長度變參
3. 多返回值
4. 命名返回值參數
5. 匿名函數
6. 閉包
## 一、不定參數
~~~
package main
import (
"fmt"
)
func main() {
test(1, 2, 3, 4, 5)
}
func test(nums ...int) {
fmt.Println(nums)
}
~~~
結果:
~~~
[1 2 3 4 5]
~~~
## 二、指針參數
~~~
package main
import (
"fmt"
)
func main() {
num := 3
test(&num)
fmt.Println(num) // 4
}
func test(num *int) {
*num = 4
}
~~~
## 三、閉包
~~~
package main
import (
"fmt"
)
func main() {
bar := foo(2)
result := bar(3)
fmt.Println(result) // 5
}
func foo(a int) func(int) int {
return func(b int) int {
return a + b
}
}
~~~
## 四、defer修飾符
* defer的執行方式類似其它語言中的析構函數,在函數執行體結束后按照調用順序的相反順序逐個執行
* 即使函數發生嚴重錯誤也會執行
* 支持匿名函數的調用
* 通常用于資源清理、文件關閉、解鎖以及記錄時間等操作
* 通過與匿名函數配合可在return之后修改函數計算結果
* 如果函數體內某個變量作為defer時匿名函數的參數,則在定義defer時即已經獲得了拷貝,否則則是引用某個變量的地址
* GO沒有異常機制,但有panic/recover模式來處理錯誤
* Panic可以在任何地方引發,但recover只有在defer調用的函數中有效
~~~
package main
import (
"fmt"
)
func main() {
fmt.Println("A")
defer fmt.Println("B")
defer fmt.Println("C")
}
~~~
結果:
~~~
A
C
B
~~~
## 五、鏈式調用
```
package main
import "fmt"
type Integer int
func (a Integer) Less(b Integer) bool {
return a < b
}
func main() {
var a Integer = 1
if a.Less(2) {
fmt.Println("less then 2")
}
}
```