GO語言function

Go語言不支持嵌套,重載和默認參數
但是
(1)無需聲明原型
(2)不定長度變參
(3)多返回值
(4)命名返回值參數
(5)匿名函數
(6)閉包

函數形式
返回值僅僅一個那麼返回值就不用小括號可以直接用
func name(參數)(返回值){

}

多返回值例子

package main

import "fmt"

func A()(int,int,int){
  a,b,c:=1,2,3
  return a,b,c
}

func main(){
  a,b,c:=A()
  fmt.Printf("%d,%d,%d",a,b,c)
}

注意區別

package main

import "fmt"

func A()(a,b,c int){
  a,b,c=1,2,3
  return//return a,b,c
}

func main(){
  a,b,c:=A()
  fmt.Printf("%d,%d,%d",a,b,c)
}

不定長變參

package main

import "fmt"
//must be the last one
//though the a is slice but is noly the value-copy
//s []int can change the old value
func A(a ...int){//a can be viewed as a slice
 fmt.Println(a)
}

func main(){
  A(1,2,3,4,5)
}

Go中指針

package main

import "fmt"

func A(a *int,b int){//a can be viewed as a slice
  *a=b
}

func main(){
 a:=1
 b:=2

 A(&a,b)
 fmt.Println(a)
}

函數也是一個類型

package main

import "fmt"

func A(){
  fmt.Println("FUNC A")
}

func main(){
 a := A
 a()

}

匿名函數

package main

import "fmt"


func main(){
 a := func(){
  fmt.Println("FUNC A")
}
 a()

}

關於函數閉包

package main

import "fmt"


func closure(x int) func(int) int{
  return func(y int)int{
   return x+y 
 }
}

func main(){ 
  f:=closure(10)
  fmt.Println(f(1))
  fmt.Println(f(2))
}

函數defer
行爲方式類似其他語言中的析構函數,在函數執行結束後按照調用順序的相反順序逐個執行
特性:即使函數發生嚴重錯誤也會執行
常用語資源清理文件關閉,解鎖以及記錄時間等操作
例子

package main
import "fmt"

func main(){ 
 fmt.Println("a")
 defer fmt.Println("b")
 defer fmt.Println("c")
}

a c b,因爲defer逆序執行,先定義後執行

package main

import "fmt"


func main(){ 
 for i:=0;i<3;i++{
 defer func(){
  fmt.Println(i)
 }()//use the function 
 }
}

the results all are the 3,becaues i has changed
()用於調用函數
這是個閉包,i是個引用

Go沒有異常機制,但是有panic/recover模式來處理錯誤
panic可以在任何地方引發
recover只有在defer調用的函數中才有意義

package main

import "fmt"

func A(){
  fmt.Println("func A")
}

func B(){
  panic("panic in B")
}

func C(){
  fmt.Println("func C")
}


func main(){ 
  A()
  B()
  C()
}

B輸出以後就會停止調用C了

package main

import "fmt"

func A(){
  fmt.Println("func A")
}

func B(){
  defer func(){
    if err:=recover();err!=nil{
    fmt.Println("Recover in B")
  }
  }()//must before panic or will not be call
  panic("panic in B")

}

func C(){
  fmt.Println("func C")
}


func main(){ 
  A()
  B()
  C()
}

panic不會被調用,C可以被調用

發佈了210 篇原創文章 · 獲贊 33 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章