【Go】 閉包 & Defer & Error

閉包 / Defer / Error

Google開發專家帶你學 AI:入門到實戰(Keras/Tensorflow)(附源碼)

閉包

介紹

基本介紹: 閉包就是一個函數和與其相關的引用環境組成的一個整體(實體)

案例演示

// 閉包的測試
func AddUpper() func( int ) int {
	var n int = 10 ;
	return func(i int) int {
		n = n + i
		return n
	}
}

func main() {
	// 閉包的測試
	addUpper := function.AddUpper()
	fmt.Println(addUpper(1))
	fmt.Println(addUpper(2))
}

說明

  • AddUpper() 是一個函數,返回的數據類型是 func(int) int .
  • 閉包的說明: 返回的是一個函數,入演示中的匿名函數,但是這個匿名函數引用到了函數外的資源 n , 因此,匿名函數和 n 形成一個整體,從而構成一個閉包。
  • 可以這麼理解: 閉包是一個類,這個函數是方法, n 是變量。
  • 當我們反覆調用 addUpper 時,n 是初始化一次,構成了累加。
  • 閉包的關鍵在於 返回的函數引用到了哪些變量?

Defer的理解

介紹

在函數中,程序員經常需要創建資源(比如:數據庫連接、文件句柄、鎖等) ,爲了在 函數執行完畢後,及時的釋放資源,Go 的設計者提供 defer (延時機制)。

案例演示

func Sum(x , y int) int{
	// 當執行到 defer 時,會將當前的語句壓入到 defer 的獨立的棧中,暫時不會去執行
	defer fmt.Println("x = " , x)
	// 噹噹前函數執行結束後,在從 defer 棧中先入後出的原則去執行
	defer fmt.Println("y = " , y)

	res := x + y
	fmt.Println("res = " , res)
	return res
}

func main() {
	sum := function.Sum(10, 20)
	fmt.Println("sum = " , sum)
}

執行的結果如下:

res =  30
y =  20
x =  10
sum =  30

Defer的價值 當函數執行完畢後,可以及時的釋放函數創建的資源

GO 中的錯誤的處理方式

演示案例

func ErrorTest(){
   num1 := 10
   num2 := 0
   res := num1 / num2
   fmt.Println(res)
}

執行的結果如下:

panic: runtime error: integer divide by zero

goroutine 1 [running]:
go-learn/src/function.ErrorTest()
   D:/Projects/GoProjects/go-learn/src/function/error.go:13 +0x11
main.main()
   D:/Projects/GoProjects/go-learn/main.go:11 +0x27

對於異常,的處理方案如下:

  1. 使用 defer + recover 來捕獲異常並處理
func ErrorTest(){
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("err = " , err)
		}
	}()
	num1 := 10
	num2 := 0
	res := num1 / num2
	fmt.Println(res)
}

自定義錯誤

Go 中,可以對錯誤進行自定義,一般使用 errors.New("") / panic(""
)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章