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")
}