GO 六、function
Function.
- 不支持嵌套、重載和默認參數
- 無須聲明原型、不定長度變參、多返回值、命名返回值、匿名函數、閉包
- 可作為一種類型使用
圖

func main() {
a,b := 1,2 //值類型,不影響更改
B(a,b) //[9,8]
fmt.Println(a,b) //[1,2]
c:=1
C(&c) //取出c的address 輸出[2]
fmt.Println(c) //[2]
x :=D //函數當作類型使用
x() //輸出[Func xxxx]
}
func B(a b int) (a,b int) {
a,b =9,8
return a,b
}
//更改值類型,改變原始傳入參數的值
func C(c int){
*c =2
fmt.Println(c) //[1 2]
}
func D() {
fmt.Println("Func xxxx")
}
匿名函數
a := func (){
fmt.Println("Func A")
}
a()
閉包
func main(){
f:=closure(10)
fmt.Println(f(1))//11
fmt.Println(f(2))//12
}
func closure(x int) (func(int) int){
return func (y int)int{
return x+y
}
}
defer
- 先進後出,後進先出
- 函數發生錯誤仍會執行,支持匿名函數的調用
- 用於資源清理、文件關閉、解鎖與紀錄時間操作
func main(){
fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c")
// a
// c
// b
}
for i:=0;i<3;i++{
defer fmt.Println(i) //2 , 0 , 1
}
for i:=0;i<3;i++{
defer func() {
fmt.Println(i)
}()
//3
//3
//3
//作為引用,對i的值進行copy.退出循環體時執行defer,為(引用局部變量)
}
panic/recover
panic/recover為異常機制(try..catch)-defer為finaly.
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")
}()
}
painc("Painc in B")
//順序
}
func C(){
painc("Func C")
}