GoLang - 函數介紹 (下) defer 延遲執行、類型與值

Golang - defer

在這幾篇,會以 Go 語言的入門基礎進行逐步說明,本篇針對函數進行說明

延遲執行:

Go 語言有一個延遲執行的設計 - defer,在函數中,defer 會等函數執行完畢才被觸發,並且依照反向執行,才會執行函數回傳動作。

應用場景,通常會在對於一些 resource 操作時,過程遇到錯誤可以透過 defer 來關閉這些 resource,又或者某些行為在 return 之前一定要執行,就可以定義一次 defer,而不用再多個條件判斷 return 前都要寫一次,可以讓程式執行的更優雅。

func closeProcess() {
  fmt.Println("close process")
}
func addOne(x int) int {
  fmt.Println("Start process")
  defer closeProcess()
  if x > 2 {
    fmt.Println("x > 2")
    return x * 20
  } else {
    fmt.Println("x <=2")
    return x + 1
  }
}

func main() {

  num := 1

  x := addOne(num)

  fmt.Printf("Result is %d\n", x)

}

函數介面-類型與值

將函數作為類型與值,功能可作為介面,用於函數需要傳入函數

以下舉例,透過定義一個 testInt 函數作為類型

接著在 filter 傳入值,第二的參數就以 testInt 作為類型,並且在呼叫時,傳入 isEven 透過這種方式來時做一個偶數過濾器

//定義 testInt 將用來作為值
type testInt func(int) bool

//檢查是否為偶數
func isEven(n int) bool {
  if n%2 == 0 {
    return true
  }
  return false
}

//過濾器,傳入值以及函數
func filter(data []int, tFn testInt) []int {
  var result []int
  for _, value := range data {
    if tFn(value) {
      result = append(result, value)
    }
  }

  return result
}

func main() {

  data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  getEven := filter(data, isEven)

  fmt.Println(getEven) 

}

//output 2 4 6 8 10