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