**定义:**
~~~
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")
}
}
```