閉包 / 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
對於異常,的處理方案如下:
- 使用 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(""
)