函數function
-Go函數不支持嵌套、重載和默認參數
-但支持以下特性
-無需聲明原型、不定長度變參、多返回值、命名返回參數匿名函數、閉包
-定義函數使用關鍵字func,且左大括號不能另行一行
-函數也可以作為一種類型使用
閉包
<code>
package main
import (
"fmt"
)
func main() {
f := closure(10)
fmt.Println(f(1))
fmt.Println(f(2))
}
func closure(x int) func(int) int {
return func(y int) int {
return x + y
}
}
</code>
defer
-的執行方式類似其它語言中的析構函數,在函數體執行結束后按照調用順序的相反順序逐個執行
-即使函數發生嚴重錯誤也會執行
-支持匿名函數的調用
-常用于資源清理、文件關閉、解鎖以及記錄時間等操作
-通過與匿名函數配合可在return之后修改函數計算結果
-如果函數體內某個變量作為defer時匿名函數的參數,則在定義defer時即已經獲得了拷貝,否則則是引用某個 變量的地址
-Go沒有異常機制,但有panic/recover 模式來處理錯誤
-Panic可以在任何地方引發,但revocer只有在defer調用的函數中有效
<code>
package main
import (
"fmt"
)
func main() {
A()
B()
C()
}
func A() {
fmt.Println("Func A")
}
func B() {
defer func() {
if err := recover(); err != nil {
fmt.Println("Recover in B")
}
}()
panic("Panic in B")
}
func C() {
fmt.Println("Func C")
}
</code>