【Go】閉パック&Defer&Error

8763 ワード

閉包/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("")